지노랩 /JinoLab

11. 텐서(Tensor) 기본 개념 본문

프로그래밍/C언어를 이용한 Deep Learning

11. 텐서(Tensor) 기본 개념

지노랩/JinoLab 2025. 8. 6. 09:30

 

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;
}

코드 실행 방법

  1. 파일을 예를 들어 tensor_demo.c 로 저장
  2. 터미널에서 컴파일
  3. gcc -o tensor_demo tensor_demo.c
  4. 실행
  5. ./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 언어의 기본 배열로 텐서를 구현한 것으로, 실제 머신러닝 라이브러리는 동적 할당, 브로드캐스팅, 효율적 연산 스트라이드 등을 추가로 지원합니다. 하지만 랭크와 모양 개념을 이해하는 데 좋은 출발점이 됩니다.