[PyTorch] Tensor 형태 변환

Young·2024년 8월 6일

PyTorch

목록 보기
4/7

Tensor 형태 변환 함수

(1) view()

  • Tensor의 메모리가 연속적으로 할당된 경우에 사용 가능
  • view(행, 열) 형태로 사용하며 -1 argument를 사용하면 자동으로 값을 계산해주기 때문에 유용
### Example ###

t = torch.arange(12) # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
v = t.view(4, -1) # tensor([[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11]])

📘 비연속적인 메모리 할당

슬라이싱으로 2D Tensor의 Sub-Tensor를 생성하면 연속성이 깨짐

### Example ###

t = torch.tensor([[0, 1, 2], [3, 4, 5]])
s = t[:, :2] #  tensor([[0, 1], [3, 4]])

# 메모리가 연속적인지 비연속인지 확인
t.is_contiguous() # True
s.is_contiguous() # False

# 연속적이 되도록 변환 (view method 활용 가능)
s.contiguous()
s.is_contiguous() # True



(2) flatten()

  • Tensor 모양 평탄화
  • 다차원 데이터 처리시 유용
  • 데이터를 신경망 모델에 적합한 형태로 전처리하기 위해 많이 활용
  • 특정 차원 범위를 평탄화
### Example ###

torch.flatten()

t = torch.arange(12) # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
v = t.view(4, -1) # tensor([[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11]])
f = t.flatten()





(3) reshape()

view() 와 차이점
view()와 달리 메모리가 연속적이지 않아도 사용 가능
- 장점 : 안전하고 유연성이 좋음
- 단점 : 성능 저하
✨ 메모리의 연속성이 확실하고 성능이 중요하면 view()를 사용하는 것이 좋음

### Example ###

t = torch.arange(12) # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
v = t.reshape(4, -1) # tensor([[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11]])



(4) transpose()

  • Tensor의 두 차원의 축을 교환하는 메서드
    ex) 0행 -> 0열, 1행 -> 1열
### Example ###
t = torch.tensor([[0, 1, 2],[3, 4, 5]])
t.transpose(0, 1) # tensor([[0, 3], [1, 4], [2, 5]])



(5) squeeze()

  • dim = 1인 차원을 축소할 때 사용
  • 특정 차원을 선택해서 축소 가능
### Example ###

# dim=1이 1개일 때
t = torch.randn(1, 3, 4)
s = torch.squeeze(u)
s.shape # torch.Size([3, 4])

# dim=1이 여러 개일 때
t = torch.randn(1, 1, 4)
s = torch.squeeze(u)
s.shape # torch.Size([4])

# 특정 차원만 squeeze 적용
s1 = torch.squeeze(u, dim=1)
s1.shape # torch.Size([1, 4])



(6) unsqueeze()

  • dim = 1인 특정 차원을 확장할 때 사용
### Example ###

t = torch.randn(2, 3)

# unsqueeze 적용
s0 = torch.unsqueeze(u, dim=0)
s0.shape # torch.Size([1, 2, 3])

s1 = torch.unsqueeze(u, dim=1)
s1.shape # torch.Size([2, 1, 3])

s2 = torch.unsqueeze(u, dim=2)
s2.shape # torch.Size([2, 3, 1])



(7) stack()

  • Tensor들을 결합할 때 사용
### Example ###

red = torgh.tensor([[255, 0], [0, 255]]
green = torgh.tensor([[0, 255], [0, 255]]
blue = torgh.tensor([[0, 0], [255, 0]]

# dim=0 생략, 0차원 축(depth 축)을 생성해서 결합
# red가 전면, red-green-blue 순으로 2D Tensor를 쌓음
rgb = torch.stack((red, green, blue)) 
rgb.shape(rgb.shape) # torch.Size([3, 2, 2])

# 1차원 축(행 축)을 생성해서 3개의 2D Tensor 결합
# red가 윗면, 전면에 rr(1층)-gg(2층)-bb(3층)가 오는 형태
rgb1 = torch.stack((red, green, blue), dim=1)
rgb1.shape(rgb.shape) # torch.Size([2, 3, 2])

# 2차원 축(열 축)을 생성해서 3개의 2D Tensor 결합
# red가 왼쪽 측면, 전면에 rgb(1층) - rgb(2층) 오는 형태
rgb2 = torch.stack((red, green, blue), dim=2)
rgb2.shape(rgb.shape) # torch.Size([2, 2, 3])



(8) cat()

  • 새로운 차원을 생성하는 stack() 함수와 다르게 기존의 차원을 유지하며 Tensor 연결
  • 같은 차원을 가진 함수끼리만 연결 가능
  • 방향에 제한은 없지만 차원의 크기가 다르면 Error 발생
  • 결합하고자 하는 Tensor들을 Tuple로 묶어서 전달
### Example ###

t1 = torch.tensor([[0, 1], [2, 3]])
t2 = torch.tensor([[4, 5]]) # 같은 차원이어야 함

cat_t = torch.cat((t1, t2))
cat_t.shape # torch.Size([3, 3])

# 다른 차원으로 붙이기
torch.cat((t1, t2), 1) # Error 발생 // 2행-1행으로 차원이 다르기 때문

# reshape
torch.cat((t1, t2.reshape(2, 1)), 1)



(9) expand()

  • 차원 크기가 1인 Tensor의 크기를 확장할 때 사용
  • 차원 중 일부의 크기가 1 이어야 함
### Example ###

t = torch.tensor([0, 1]) # 1행 2열
t.expand(3, 2) # 3행 2열, [[0, 1], [0, 1], [0, 1]]



(10) repeat()

  • Tensor의 요소들을 반복해서 크기를 확장 시킴
  • expand() 와 다르게 크기가 1인 차원이 있어야 한다는 제약이 없음
  • But, 추가 메모리 할당으로 인해 메모리 효율성이 떨어짐
### Example ###

t = torch.tensor([0, 1], [2, 3]) # 2행 2열
t.repeat(2, 3) # 행 방향으로 2배, 열 방향으로 3배 확장 됨

0개의 댓글