지노랩 /JinoLab
11. 텐서(Tensor) 기본 개념 본문
1. 텐서(Tensor) 기본 개념
- 텐서는 “데이터의 컨테이너”로, 스칼라·벡터·행렬·다차원 배열 등을 통칭합니다.
- 랭크(rank): 텐서의 차원(축, axes) 개수
- 모양(shape): 각 축(차원)별 크기를 나열한 것
| 타입 | 랭크 | 설명 | 예시 shape |
| 스칼라 | 0 | 하나의 숫자 | [] |
| 벡터 | 1 | 1차원 배열 (길이 N) | [N] |
| 행렬 | 2 | 2차원 배열 (M×N) | [M, N] |
| 다차원 텐서 | ≥3 | 3D 이미지, 배치 처리용 4D 등 | [d1, d2, …] |
2. C 언어 예제
아래 코드를 컴파일하고 실행하면, 각 데이터 타입의 값을 화면에 출력하고, 랭크와 모양을 함께 보여줍니다.
#include <stdio.h>
#include <stdlib.h>
/* 0D Tensor (Scalar) */
void demo_scalar() {
double x = 3.14; // 스칼라: 하나의 숫자
printf("Scalar x = %.2f\n", x);
printf(" Rank: 0, Shape: []\n\n");
}
/* 1D Tensor (Vector) */
void demo_vector() {
double v[4] = {1.0, 2.0, 3.0, 4.0}; // 길이 4 벡터
int N = sizeof(v) / sizeof(v[0]);
printf("Vector v = [");
for (int i = 0; i < N; i++) {
printf("%.1f", v[i]);
if (i < N - 1) printf(", ");
}
printf("]\n");
printf(" Rank: 1, Shape: [%d]\n\n", N);
}
/* 2D Tensor (Matrix) */
void demo_matrix() {
double M[2][3] = {
{1.0, 2.0, 3.0},
{4.0, 5.0, 6.0}
}; // 2행×3열 행렬
int R = 2, C = 3;
printf("Matrix M = [\n");
for (int i = 0; i < R; i++) {
printf(" [");
for (int j = 0; j < C; j++) {
printf("%.1f", M[i][j]);
if (j < C - 1) printf(", ");
}
printf("]\n");
}
printf("]\n");
printf(" Rank: 2, Shape: [%d, %d]\n\n", R, C);
}
/* 3D Tensor */
void demo_tensor3d() {
double T[2][2][2] = {
{ {1.0, 2.0}, {3.0, 4.0} },
{ {5.0, 6.0}, {7.0, 8.0} }
}; // 2×2×2 텐서
int D0 = 2, D1 = 2, D2 = 2;
printf("3D Tensor T = [\n");
for (int i = 0; i < D0; i++) {
printf(" [\n");
for (int j = 0; j < D1; j++) {
printf(" [");
for (int k = 0; k < D2; k++) {
printf("%.1f", T[i][j][k]);
if (k < D2 - 1) printf(", ");
}
printf("]\n");
}
printf(" ]\n");
}
printf("]\n");
printf(" Rank: 3, Shape: [%d, %d, %d]\n\n", D0, D1, D2);
}
int main(void) {
printf("=== Tensor Demo in C ===\n\n");
demo_scalar(); // 스칼라 예제
demo_vector(); // 벡터 예제
demo_matrix(); // 행렬 예제
demo_tensor3d(); // 3D 텐서 예제
return 0;
}
코드 실행 방법
- 파일을 예를 들어 tensor_demo.c 로 저장
- 터미널에서 컴파일
- gcc -o tensor_demo tensor_demo.c
- 실행
- ./tensor_demo
실행 결과 예시
=== Tensor Demo in C ===
Scalar x = 3.14
Rank: 0, Shape: []
Vector v = [1.0, 2.0, 3.0, 4.0]
Rank: 1, Shape: [4]
Matrix M = [
[1.0, 2.0, 3.0]
[4.0, 5.0, 6.0]
]
Rank: 2, Shape: [2, 3]
3D Tensor T = [
[
[1.0, 2.0]
[3.0, 4.0]
]
[
[5.0, 6.0]
[7.0, 8.0]
]
]
Rank: 3, Shape: [2, 2, 2]
3. 요약
- 스칼라: 하나의 숫자 → 랭크 0, shape []
- 벡터: 1차원 배열 → 랭크 1, shape [N]
- 행렬: 2차원 배열 → 랭크 2, shape [M,N]
- 3D 텐서: 3차원 배열 → 랭크 3, shape [d0,d1,d2]
이 예제는 C 언어의 기본 배열로 텐서를 구현한 것으로, 실제 머신러닝 라이브러리는 동적 할당, 브로드캐스팅, 효율적 연산 스트라이드 등을 추가로 지원합니다. 하지만 랭크와 모양 개념을 이해하는 데 좋은 출발점이 됩니다.
'프로그래밍 > C언어를 이용한 Deep Learning' 카테고리의 다른 글
| 13. 브루트 포스 학습(Brute‑Force Learning) (1) | 2025.08.08 |
|---|---|
| 12. 학습(Learn) / 단일 입력·단일 출력 퍼셉트론에서 오차를 줄이기 위해 가중치 (3) | 2025.08.07 |
| 10. 비교(compare) / 오차(error) 계산 (1) | 2025.08.05 |
| 9. 은닉층(hidden layer) (4) | 2025.08.04 |
| 8. 다중 입력·다중 출력(Multiple Input, Multiple Output, MIMO) 퍼셉트론 (2) | 2025.08.03 |