PyTorch 텐서 기초
도입부
딥러닝(Deep Learning)은 현대 인공지능(AI) 기술의 중심에 서 있습니다. 이 중에서도 PyTorch는 연구자와 개발자들 사이에서 인기가 높은 프레임워크로, 그 유연성과 직관적인 인터페이스 덕분에 널리 사용되고 있습니다. PyTorch를 제대로 이해하기 위해서는 텐서(Tensor)라는 기본 단위를 확실히 이해하는 것이 중요합니다. 텐서는 데이터를 다루는 데 필수적인 구조로, 수학적 연산과 모델 훈련의 기초가 됩니다. 이번 포스트에서는 PyTorch의 텐서에 대해 자세히 알아보고, 이를 통해 딥러닝의 기초를 다질 수 있도록 하겠습니다. PyTorch 버전 2.0 이상을 기준으로 설명하며, 이전 버전과의 차이점은 필요에 따라 언급하겠습니다.
텐서란 무엇인가?
텐서(Tensor)는 다차원 배열의 일반화된 형태로, 스칼라(Scalar), 벡터(Vector), 행렬(Matrix)을 모두 포함하는 개념입니다. 예를 들어, 0차원 텐서는 스칼라, 1차원 텐서는 벡터, 2차원 텐서는 행렬을 의미합니다. PyTorch에서는 이러한 텐서를 쉽게 생성하고 조작할 수 있는 다양한 기능을 제공합니다.
텐서의 중요성
딥러닝에서는 대량의 데이터와 복잡한 연산이 필요합니다. 이때 데이터를 효율적으로 표현하고 연산할 수 있는 구조가 텐서입니다. 예를 들어, 이미지 데이터를 처리할 때는 각 픽셀 값이 텐서의 요소로 표현되며, 이 텐서를 통해 다양한 수학적 연산과 모델 훈련이 이루어집니다. 이미지는 높이, 너비, 채널(RGB) 정보를 담은 3차원 텐서로 표현될 수 있습니다. 음성 데이터는 시간 축에 따른 음파의 진폭을 담은 1차원 텐서로 표현될 수 있습니다.
PyTorch에서 텐서 다루기
텐서 생성하기
PyTorch에서 텐서를 생성하는 방법은 여러 가지가 있습니다. 가장 기본적인 방법은 torch.tensor() 함수를 사용하는 것입니다.
import torch
# 리스트로부터 텐서 생성
data = [1, 2, 3, 4, 5]
tensor = torch.tensor(data)
print(tensor)
위의 코드에서는 파이썬 리스트를 통해 1차원 텐서를 생성했습니다. PyTorch는 다양한 데이터 타입을 지원하며, 기본적으로는 float32 타입을 사용합니다. 다른 데이터 타입을 지정하고 싶다면 dtype 인자를 사용할 수 있습니다.
# 정수형 텐서 생성
int_tensor = torch.tensor(data, dtype=torch.int32)
print(int_tensor)
또한, NumPy 배열로부터 텐서를 생성할 수도 있습니다. 이는 기존 NumPy 코드를 PyTorch로 쉽게 전환할 수 있도록 돕습니다.
import numpy as np
numpy_array = np.array([1, 2, 3])
tensor_from_numpy = torch.from_numpy(numpy_array)
print(tensor_from_numpy)
다양한 형태의 텐서 생성하기
PyTorch는 텐서를 생성하기 위한 다양한 함수를 제공합니다. 예를 들어, 모든 요소가 0 또는 1로 초기화된 텐서를 생성할 수 있습니다.
# 모든 요소가 0인 2x3 텐서
zeros_tensor = torch.zeros(2, 3)
print(zeros_tensor)
# 모든 요소가 1인 2x3 텐서
ones_tensor = torch.ones(2, 3)
print(ones_tensor)
torch.empty() 함수를 사용하면 초기화되지 않은 값으로 텐서를 생성할 수도 있습니다. 이 방법은 메모리 할당 속도가 빠르지만, 초기값이 예측 불가능하므로 주의해서 사용해야 합니다.
# 초기화되지 않은 2x3 텐서
empty_tensor = torch.empty(2, 3)
print(empty_tensor)
또한, 랜덤 값을 가지는 텐서를 생성할 수도 있습니다.
# 2x2 랜덤 텐서 (0과 1사이의 균등 분포)
random_tensor = torch.rand(2, 2)
print(random_tensor)
# 평균이 0이고 표준편차가 1인 정규 분포를 따르는 2x2 텐서
randn_tensor = torch.randn(2, 2)
print(randn_tensor)
텐서의 속성
텐서는 다양한 속성을 가지고 있습니다. 가장 기본적인 속성은 shape와 dtype입니다. 텐서가 저장된 장치(device) 또한 중요한 속성입니다.
# 텐서의 속성 출력하기
print(f"Shape of tensor: {tensor.shape}")
print(f"Data type of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")
GPU를 사용할 수 있다면, 텐서를 GPU로 옮겨 연산 속도를 향상시킬 수 있습니다.
# CUDA를 사용할 수 있는지 확인
if torch.cuda.is_available():
device = torch.device('cuda')
else:
device = torch.device('cpu')
# 텐서를 GPU로 이동
tensor = tensor.to(device)
print(f"Device tensor is stored on: {tensor.device}")
텐서 연산
텐서는 다양한 수학적 연산을 지원합니다. 예를 들어, 텐서 간의 덧셈, 뺄셈, 곱셈, 나눗셈 연산이 가능합니다.
# 두 텐서의 덧셈
a = torch.tensor([1, 2])
b = torch.tensor([3, 4])
print(a + b)
print(torch.add(a, b)) # torch 함수를 사용한 덧셈
# 요소별 곱셈
print(a * b)
print(torch.mul(a, b)) # torch 함수를 사용한 곱셈
# 행렬 곱
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])
print(torch.matmul(a, b)) # 행렬 곱셈
print(a @ b) # @ 연산자를 사용한 행렬 곱셈 (Python 3.5 이상)
텐서의 변형
텐서는 다양한 방법으로 변형할 수 있습니다. 예를 들어, 텐서의 형태를 변경하는 view() 함수가 있습니다. reshape() 함수도 view()와 유사하게 텐서의 형태를 변경하지만, 메모리 복사를 발생시킬 수 있다는 차이점이 있습니다. view()는 contiguous 텐서에 대해서만 동작합니다.
# 텐서의 변형
x = torch.tensor([1, 2, 3, 4])
reshaped = x.view(2, 2)
print(reshaped)
# -1을 사용하여 자동으로 차원 추론
x = torch.tensor([1, 2, 3, 4, 5, 6])
reshaped = x.view(2, -1) # 2행으로 만들고, 열은 자동으로 계산
print(reshaped)
# 텐서의 차원 바꾸기 (transpose)
x = torch.randn(2, 3)
transposed = torch.transpose(x, 0, 1) # 0번째 차원과 1번째 차원 교환
print(f"Original shape: {x.shape}")
print(f"Transposed shape: {transposed.shape}")
텐서 슬라이싱과 인덱싱
NumPy와 마찬가지로 텐서도 슬라이싱과 인덱싱을 통해 특정 요소에 접근하거나 부분 텐서를 추출할 수 있습니다.
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 첫 번째 행 추출
row = x[0]
print(row)
# 두 번째 열 추출
column = x[:, 1]
print(column)
# 특정 요소 추출
element = x[1, 2]
print(element)
# 슬라이싱을 이용한 부분 텐서 추출
sub_tensor = x[0:2, 1:3]
print(sub_tensor)
결론
이번 포스트에서는 PyTorch의 텐서에 대해 알아보았습니다. 텐서는 딥러닝의 기초가 되는 데이터 구조로, PyTorch에서 데이터를 표현하고 연산하는 데 필수적인 역할을 합니다. 텐서를 이해하고 다룰 수 있는 능력은 딥러닝 모델을 효과적으로 구현하고 최적화하는 데 큰 도움이 됩니다. 더 나아가고 싶다면 PyTorch의 공식 문서나 다양한 온라인 튜토리얼을 참고하여 텐서의 다양한 기능과 응용 방법을 학습해 보시기 바랍니다.
추가 학습 자료
- PyTorch 공식 문서: 텐서
- Deep Learning with PyTorch: A 60 Minute Blitz
- PyTorch 튜토리얼
- PyTorch 공식 문서: 100개의 텐서 연산
PyTorch와 텐서에 대한 이해를 바탕으로, 여러분의 딥러닝 여정이 더욱 흥미롭고 생산적이길 바랍니다!

