텐서(Tensor)
💻 벡터와 스칼라를 일반화한 다차원 배열(N-dimensional array)
⚛️ 좌표계가 바뀌어도 일관된 법칙 아래 변환되는 수학적 객체
📐 선형 변환(곱연산)을 통해 서로 연결된 공간을 표현하는 수학적 구조
딥러닝 프레임워크에서는 "모든 연산과 저장을 기본적으로 텐서(Tensor)라는 형태로 처리"
차원 | 이름 | 예시 | 사용 |
0D | 스칼라 | 5 | 손실값, 정확도 |
1D | 벡터 | [1,2,3] | 특징 벡터 |
2D | 행렬 | [[1,2], [3,4]] | 입력 × 가중치 |
3D | 텐서 | 여러 행렬 묶음 | 시계열, 컬러 이미지 |
4D | 고차원 텐서 | (배치, 채널, 높이, 너비) | CNN 입력 구조 |
텐서 하나로 통일하는 이유?
→ 계산 효율성
텐서는 GPU / TPU에서 병렬로 연산하기 좋은 구조 (CUDA 등)
Matrix multiplication, convolution, dot product, 전부 텐서 기반
→ 프레임워크 일관성
PyTorch, TensorFlow 등 딥러닝 프레임워크는 입력부터 가중치, 출력, 손실, 역전파 gradient까지 모두 텐서로 다룸
다양한 구조(벡터, 행렬, 이미지, 시계열)도 텐서로 표현하면 코드가 단순해짐
↪ 메모리 저장도 텐서 단위로 관리되지만, 파일로 저장할 땐 조금 다름
용도 | 저장 형태 |
모델 파라미터 | 텐서 (.pt, .ckpt, .h5) |
입력 데이터 | NumPy 배열 → 텐서 변환 |
학습 로그 | 텍스트, CSV, TensorBoard 등 |
중간 결과 | 텐서 그대로 디스크에 저장 가능 (예: torch.save) |
텐서의 내부 메모리 구조
→ 데이터 포인터 (data pointer)
실제 값들이 메모리에 연속적으로 저장된 주소
예: [1, 2, 3, 4]이면 메모리에 float32 4개가 쭉 저장됨
→ shape (모양)
텐서가 몇 차원이고, 각 차원에 몇 개의 값이 있는지를 나타냄
예: (2, 3)이면 2행 3열
→ stride (스트라이드)
다음 차원으로 넘어가기 위해 몇 칸을 건너뛰는지
예: (2, 3) 텐서에서 한 행당 3개 원소 → 다음 행 가려면 3칸 이동
✔ 생성할 때 메모리 공간이 고정 → 배열처럼 크기 고정(내부적으로 재할당 안 됨)
✔ 데이터 크기 → shape(모양) × element_size(dtype에 따라 결정)
✔ 인덱스(index) 기반 접근
Tensor 메타데이터( TensorImpl → c++ )
(데이터를 설명하는 정보)
속성 | 설명 | 예시 |
shape | 텐서의 모양 | (3, 4, 5) |
stride | 각 차원 이동 시 메모리 건너뛸 간격 | (20, 5, 1) |
dtype | 데이터 타입 | float32 (4바이트) |
device | 저장된 위치 | cpu / cuda:0 |
layout | 텐서 레이아웃 (희소/밀집) | torch.strided |
requires_grad | autograd 대상 여부 | True / False |
data_ptr | 실제 데이터 시작 주소 (주소값) | 0x7fd... |