ProgramingLagnuage/Python
[중급] tensor라는 데이터 구조
TSpoons
2025. 2. 13. 21:28
AI 공부를 하다보면 자유 사용되는 텐서는 데이터 흐름을 표현하고, 딥러닝 모델의 학습 과정에서 데이터를 주고받는 데 사용한다.
자세하게 텐서를 알아보자.
텐서란?
텐서는 다차원 배열을 표현하는 데이터 구조
차원에 따라 다음과 같이 분류:
- 스칼라 (Rank 0의 텐서): 단일 숫자
- 벡터 (Rank 1의 텐서): 숫자의 배열
- 행렬 (Rank 2 텐서): 숫자의 2차원 배열
- 텐서 (3차원 이상): 3차원 또는 그 이상의 차원을 가진 배열
텐서의 특징
- 크기(Shape):
- 각 차원의 요소 수를 나타내는 튜플
- 예: (224, 224, 3) - 224×224 크기의 channel이 3인 RGB 이미지
- 차원(Dimension):
- 텐서의 축(axis) 또는 방향의 수
- 예
- 시퀀스는 텍스트에서는 (시간x문자)
- 이미지는 보통 3차원 텐서 (높이 × 너비 × 채널)
- 동영상은 (프레임 x 높이 x 너비 x 채널)
- 데이터 타입:
- float32, int64 등 다양한 데이터 타입 지원
- 메모리 효율성과 연산 속도에 영향
torch.tensor 함수
텐서 생성
torch.arange(0,10)
torch.zeros(2,3)
torch.rand(2,3)
텐서 연산
# 1차원 텐서
a = torch.tensor([1,2,3])
b = torch.tensor([4,5,6])
# 2차원 텐서
c = torch.tensor([[2,3,5],
[7,1,4]])
# 벡터-스칼라 연산
print(a+3)
# 벡터-벡터 연산
print(a+b)
# 행렬-스칼라 연산
print(c+2)
# 행렬-벡터 연산 : 브로드캐스트(c의 각 행에 a 행에 대응하는 요소 연산산)
print(c+a)
# 행렬-행렬 연산
print(c+c)
텐서 변환
a = torch.tensor([0,1,2,3,4,5,6,7,8,9])
b = a.view(2,5)
c = a.view(2,-1) # 자동으로 요소 수 계산
d = c.view(-1) # 1차원으로 다시 변환
y = torch.arange(0,8).view(1,2,4)
z = y.squeeze() # 요소 수가 1인 차원 삭제
print(b, b.shape)
print(c, c.shape)
print(d, d.shape)
print(y, y.shape)
print(z, z.shape)
텐서와 Numpy 배열 그리고 리스트
- list는 일반적인 데이터를 저장하고 처리할 때 유용하지만, 수학적 연산과 고성능 계산에는 적합하지 않음
- numpy.array은 리스트보다 고성능 수학 연산을 지원하지만, GPU 가속과 자동 미분 기능이 부족
- torch.tensor는 Numpy 배열의 장점을 기반으로 GPU 가속과 자동 미분 기능까지 제공하여 딥러닝에 최적화된 데이터 구조
텐서 연산의 장점
- 병렬 처리: GPU에서 병렬 연산을 통한 빠른 연산 가능
- 메모리 효율성: 최적화된 메모리 사용
- 자동 미분: 딥러닝의 역전파에 필요한 기울기 계산 자동화