간단 요약
autograd 연산을 지원하는 다차원 배열
tensor에 대한 미분값을 가진다.

  • reshape보다 view를 쓰는 것이 좋다.
  • squeeze와 unsqueeze의 차이
  • mm, dot, matmul 차이

신경망의 가중치(매개변수)를 텐서로 표현한다.

다차원 Arrays를 표현하는 PyTorch 클래스

numpy의 ndarray와 호환된다.

TensorFlow의 Tensor와도 동일

Tensor을 생성하는 함수도 거의 동일

  • numpy — ndarray

    import numpy as np
    n_array = np.arange(10).reshape(2,5)
    print(n_array)
    print("n_dim :", n_array.ndim, "shape :", n_array.shape)
    
  • pytorch — tensor

    import torch
    t_array = torch.FloatTensor(n_array)
    print(t_array)
    print("n_dim :", t_array.ndim, "shape :", t_array.shape)
    

list나 ndarray를 Tensor로 변환할 수 있다.

데이터 타입은 numpy와 동일하다.

GPU에 올려 사용이 가능하다.

x_data.device
# device(type='cpu')
if torch.cuda.is_available():
		x_data_cuda = x_data.to('cuda')
x_data_cuda.device
# device(type='cuda', index=0)

view, squeeze, unsqueeze 등으로 tensor 조정이 가능하다.

view: reshape와 동일하게 tensor의 shape를 변환한다.

  • view와 reshape의 차이: contiguity(접근) 보장 여부

    view의 경우 클래스로의 접근을 계속 보장해주지만, reshape는 접근을 보장해주지 않는다.

    만약 접근을 보장할 수 없는 경우 copy를 해버린다.

squeeze: 차원의 개수가 1인 차원을 삭제한다. (압축)

import torch

x = torch.rand(1, 1, 20, 128)
x = x.squeeze() # [1, 1, 20, 128] -> [20, 128]

x2 = torch.rand(1, 1, 20, 128)
x2 = x2.squeeze(dim=1) # [1, 1, 20, 128] -> [1, 20, 128]

unsqueeze: 차원의 개수가 1인 차원을 추가한다.

추가할 위치를 지정해주어야 한다.

import torch

x = torch.rand(3, 20, 128)
x = x.unsqueeze(dim=1) #[3, 20, 128] -> [3, 1, 20, 128]

tensor

다른 기본적인 연산은 Tensor와 Numpy가 거의 동일하다.

dot, mm, matmul 차이

dot : 내적 연산.

mm : 행렬 곱셈 (벡터 연산 지원 x).

행렬곱셈 연산이 Tensor에서는 dot 대신 mm(matrix multiplication)으로 표기된다.

matmul : 알아서 broadcasting을 지원해준다.

쉽게 연산해준다는 장점이 있지만, 오히려 결과를 헷갈리게 만드는 단점이 있다.


Tensor의 구조

tensor

  • 1차원: iris 샘플 하나
  • 2차원: iris 샘플 여러 개, 명암 영상 한 장
  • 3차원: 명암 영상 여러 장, 컬러 영상 한 장
  • 4차원: 컬러 영상 여러 장, 컬러 동영상 하나
  • 5차원: 컬러 동영상 여러 개