파이토치에서 텐서(tensor)는 배열, 행렬과 매우 유사한 특수한 자료구조입니다.
( 1차원으로 구성된 값을 벡터, 2차원으로 이루어진 값을 행렬, 그리고 3차원 이상을 텐서로 나눠 부르기도 합니다. 하지만 파이토치에서 type은 모두 torch.Tensor 입니다.)
텐서는 Numpy의 ndarray와 매우 유사하며, GPU나 다른 연산 가속을 위한 하드웨어에서 실행할 수 있다는 장점이 있습니다.
파이토치에서 텐서를 사용해보면서 알아보겠습니다. 이번 포스팅에서는 torch와 numpy를 사용하겠습니다.
import torch
import numpy as np
텐서 속성 (Attribute)
텐서의 속성은 텐서의 모양(shape), 자료형(datatype) 그리고 어느 장치(device)에 저장되는지 등을 말합니다.
코드로는 아래와 같이 확인할 수 있습니다. ( 일단, 텐서는 임의로 만들겠습니다. )
# 텐서의 속성
tensor = torch.rand(11,28)
print(f"Dimension of tensor: {tensor.ndim}") # ndim(차원) 확인
print(f"Shape of tensor: {tensor.shape}") # shape(모양) 확인
print(f"Datatype of tensor: {tensor.dtype}") # 자료형 확인
print(f"Device tensor is stored on: {tensor.device}") # 어느 장치에 저장되는지 ex) gpu, cpu
# 출력 결과
Dimension of tensor: 2
Shape of tensor: torch.Size([11, 28])
Datatype of tensor: torch.float32
Device tensor is stored on: cpu
텐서 초기화
텐서를 초기화하는 방법으로는 여러가지가 있습니다.
데이터로부터 직접(directly) 생성하기
먼저, 데이터로부터 텐서를 생성해보겠습니다.
# 데이터로부터 직접 생성하기
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)
print(x_data)
print(x_data.dtype)
출력 결과는 아래와 같습니다.
# 출력 결과
tensor([[1, 2],
[3, 4]])
torch.int64
이 과정에서 데이터의 자료형(data type)을 자동으로 유추해 torch.int64 임을 확인할 수 있습니다.
# 데이터로부터 직접 생성하기 2
data = [[1.0, 2.2],[3.5, 4]]
x_data = torch.tensor(data)
print(x_data)
print(x_data.dtype)
# 출력 결과
tensor([[1.0000, 2.2000],
[3.5000, 4.0000]])
torch.float32
두번째 예시에서는 data type이 torch.float32 입니다.
자동으로 설정 돼 편리한 점도 있습니다만 사용자가 주의해야할 점으로 생각됩니다. 필요에 따라서는 바꿔줘야 합니다.
Numpy 배열로 생성하기
바로 예시를 보겠습니다.
# numpy 배열로부터 생성하기
x_np = np.array(data)
x_data = torch.from_numpy(np_array)
print(x_data)
# 출력 결과
tensor([[1.0000, 2.2000],
[3.5000, 4.0000]], dtype=torch.float64)
데이터로부터 직접 생성할 때와 다른 점은 numpy 배열의 dtype을 따라 data type이 설정됩니다.
예시 외에도 토치의 메서드를 활용해 다른 텐서로부터 텐서를 생성하거나, 무작위(random) 또는 상수(constant)값을 사용해 텐서를 생성하는 등 다양한 방법이 있습니다.
텐서 연산
텐서의 연산은 Numpy의 연산과 매우 유사합니다.
기본적으로 브로드캐스팅을 지원하며, 전치, 인덱싱, 슬라이싱, 덧셈, 곱셈 등 여러 연산이 있습니다.
아래의 파이토치 docs에서 다양한 연산을 확인할 수 있습니다.
https://pytorch.org/docs/stable/torch.html
연산은 파이토치를 사용하면서 익히면 좋을 것 같습니다.
[참고자료]
[1] https://tutorials.pytorch.kr/beginner/blitz/tensor_tutorial.html
'머신러닝, 딥러닝 ML, DL > Pytorch' 카테고리의 다른 글
[Pytorch] Autograd, 자동 미분 ( requires_grad, backward(), 예시 ) (2) | 2021.10.02 |
---|---|
[Pytorch] 파이토치, 선형 회귀(Linear Regression) 간단히 구현해보기 (2) | 2021.09.24 |
[Pytorch] 파이토치로 GAN(Generative Adversarial Net) 구현하고 MNIST 손글씨 이미지 생성하기 (0) | 2021.06.30 |