RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (117)
    • Study Note (80)
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (26)
      • Machine Learning (16)
      • Streamlit (9)
      • Django (1)
      • Deep Learning (12)
      • dbt (2)
      • SQL (3)
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/Deep Learning

[PyTorch] 의료 데이터를 위한 텐서(Tensor) 완전 정복

2025. 12. 31. 09:48

안녕하세요! 오늘은 딥러닝을 시작할 때 반드시 넘어야 할 산, PyTorch 텐서의 핵심 조작법 5가지를 정리해 보려고 합니다.

SQL로 데이터를 뽑고 Pandas로 전처리하는 것까지는 익숙하시죠? 하지만 딥러닝 모델(Neural Network)은 우리에게 익숙한 데이터프레임이 아닌 '텐서(Tensor)'만 먹습니다.

우리가 다루는 환자 정보, MRI 영상, 바이탈 사인이 텐서 세계에서는 어떻게 변하는지, 실무 관점에서 딱 필요한 내용만 추려봤습니다.

 

1. 텐서 데이터 타입 (Data Types)

"MRI 픽셀값은 float, 질병 진단 여부는 long"

 

가장 먼저 챙겨야 할 것은 데이터의 '형태(Type)'입니다. PyTorch는 데이터 타입에 매우 엄격해서, 타입이 안 맞으면 바로 에러를 뱉어냅니다.

  • torch.FloatTensor (32-bit floating point)
    • 용도: 대부분의 의료 데이터(체온, 혈압, MRI 픽셀 값 등 연속적인 수치).
    • 주의: 딥러닝 연산의 기본형입니다. 정수 데이터를 넣어도 보통 이걸로 변환해서 씁니다.
  • torch.LongTensor (64-bit integer)
    • 용도: 분류 문제의 정답 레이블 (예: 0=정상, 1=폐렴, 2=결핵).
    • 주의: 인덱스 번호나 개수를 셀 때 주로 쓰입니다.
import torch

# 1. MRI 픽셀 데이터 (실수형)
mri_pixel = torch.FloatTensor([0.1, 0.5, 0.9])
print(f"MRI 픽셀 타입: {mri_pixel.dtype}") # torch.float32

# 2. 환자 진단 레이블 (정수형: 0=정상, 1=환자)
diagnosis_label = torch.LongTensor([0, 1, 1])
print(f"진단 레이블 타입: {diagnosis_label.dtype}") # torch.int64

 

 

2. 텐서 인덱싱 (Indexing)

"수천 장의 MRI 중 특정 환자의 슬라이스만 꺼내기"

 

Pandas의 iloc과 비슷합니다. 원하는 데이터를 콕 집어내는 기술이죠.

  • 기본 인덱싱: tensor[행, 열]
  • 슬라이싱: tensor[:, 0] (모든 행의 0번째 열 = 모든 환자의 수축기 혈압)
  • Fancy Indexing: tensor[[0, 2]] (0번, 2번 환자만 쏙 뽑기)
# 가상의 환자 3명의 바이탈 데이터 (행: 환자, 열: [수축기, 이완기, 맥박])
vitals = torch.FloatTensor([
    [120, 80, 75], # 환자 A
    [140, 90, 80], # 환자 B
    [110, 70, 65]  # 환자 C
])

# 1. 환자 B의 모든 데이터 가져오기
print(vitals[1]) # tensor([140.,  90.,  80.])

# 2. 모든 환자의 '맥박'(2번째 열)만 가져오기
print(vitals[:, 2]) # tensor([75., 80., 65.])

 

 

3. 텐서 연산과 브로드캐스팅 (Broadcasting)

"모든 환자의 체온에 +0.5도 보정하기"

 

이게 진짜 중요합니다. 모양(Shape)이 다른 텐서끼리 연산할 때, PyTorch가 알아서 모양을 맞춰주는 기능을 '브로드캐스팅'이라고 합니다.

  • 규칙: 뒤에서부터 차원을 맞췄을 때, 차원의 크기가 같거나 어느 한쪽이 1이면 연산 가능.

[상황] 100명의 환자 데이터(100, 3)가 있는데, 각 항목(수축기, 이완기, 맥박)마다 보정값(1, 3)을 더해주고 싶다면? 반복문(for) 쓸 필요 없습니다. 그냥 더하면 됩니다!

# 환자 데이터 (2명, 3개 항목)
patients = torch.FloatTensor([
    [120, 80, 75], 
    [110, 70, 70]
])

# 보정값 (각 항목에 더할 값)
bias = torch.FloatTensor([5, 5, 0]) # 혈압은 +5, 맥박은 그대로

# 브로드캐스팅: (2,3) + (3,) 연산 -> (3,)이 자동으로 (2,3)으로 확장됨!
corrected_patients = patients + bias 
print(corrected_patients)
# 결과:
# tensor([[125.,  85.,  75.],
#         [115.,  75.,  70.]])

 

4. 텐서 변환 (Reshape & View)

"2차원 MRI 이미지를 1차원 벡터로 펴기"

딥러닝 모델(특히 Fully Connected Layer)에 이미지를 넣으려면 평평하게 펴줘야(Flatten) 합니다.

  • view(): 텐서의 모양을 변경합니다. (메모리 공유, 가장 많이 씀)
  • squeeze() / unsqueeze(): 차원을 쥐어짜서(1인 차원 제거) 없애거나, 차원을 하나 추가합니다.
# 가상의 4x4 MRI 이미지
mri_img = torch.rand(4, 4)

# 1. 1줄로 펴기 (Flatten) -> 인공지능 입력용
flatten_mri = mri_img.view(-1) # -1은 "나머지 알아서 계산해"라는 뜻
print(f"변환 전: {mri_img.shape} -> 변환 후: {flatten_mri.shape}") 
# (4, 4) -> (16)

# 2. 배치 차원 추가 (unsqueeze) -> 모델에 넣을 땐 (배치, 데이터) 형태여야 함
input_tensor = flatten_mri.unsqueeze(0)
print(f"모델 입력용: {input_tensor.shape}") # (1, 16)

 

 

5. 조건 연산 (torch.where)과 저장

"종양 의심 부위(특정 값 이상)만 마스킹 하기"

Numpy의 np.where와 똑같습니다. 조건에 따라 값을 바꿔줍니다. 의료 영상에서 Segmentation(영역 분할)이나 Thresholding(임계값 처리)할 때 필수입니다.

  • torch.where(조건, 참일때_값, 거짓일때_값)

시각화 코드로 결과를 한 번 볼까요? (아래 이미지는 Python 코드로 직접 생성한 가상의 MRI 분석 결과입니다)

아래 그림처럼 torch.where를 쓰면 픽셀 값이 0.7 이상인 부분만 빨갛게 표시(1.0), 나머지는 0.0으로 쉽게 바꿀 수 있습니다.

# MRI 픽셀 값 중 0.7 이상만 1(종양), 나머지는 0(정상)으로 변환
tumor_mask = torch.where(mri_slice > 0.7, 1.0, 0.0)

 

마지막으로 고생해서 전처리한 텐서는 저장해야겠죠?

  • torch.save(tensor, 'file.pt'): 텐서를 파일로 저장
  • torch.load('file.pt'): 불러오기

요약: 이것만은 꼭!

  1. 타입: 실수는 Float, 정답 라벨은 Long
  2. 모양 변경: view(-1)로 펴고, unsqueeze(0)로 배치 차원 추가하기
  3. 브로드캐스팅: 차원 달라도 더하기 가능 (for문 금지!)
  4. 조건: torch.where로 마스킹 처리

 

'Study Note > Deep Learning' 카테고리의 다른 글

딥러닝을 위한 '텐서'와 '행렬'의 정체  (1) 2026.01.02
딥러닝을 위한 필수 라이브러리, 의료 데이터로 정복하기  (0) 2026.01.02
[PyTorch 기초] 의료 데이터를 텐서(Tensor)로 만드는 법  (1) 2025.12.30
딥러닝의 그릇 '텐서(Tensor)'와 도구 '파이토치'  (0) 2025.12.30
수학으로 한 방에 풀까, 조금씩 찾아갈까? (최소제곱법 vs 경사하강법)  (0) 2025.12.30
    'Study Note/Deep Learning' 카테고리의 다른 글
    • 딥러닝을 위한 '텐서'와 '행렬'의 정체
    • 딥러닝을 위한 필수 라이브러리, 의료 데이터로 정복하기
    • [PyTorch 기초] 의료 데이터를 텐서(Tensor)로 만드는 법
    • 딥러닝의 그릇 '텐서(Tensor)'와 도구 '파이토치'
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바