파이썬(Python)/ML & Deep Learning

[기초] Scalar, Vector, Metrix, Tensor 개념과 차이점

DA Damla 2025. 2. 2. 20:23

딥러닝은 결국 "텐서 간의 연산의 값을 비교하는 과정"이라고 볼 수 있다. 그렇기 때문에 딥러닝의 스칼라 부터 텐서를 정리해보았다.

 

<목차>

1. 0 ~ 4차원을 나타내는 단어의 정의

2. numpy 혹은 Torch로 나타내는 만드는 방법

3. 궁금증 해소 : 3D 텐서를 선언해서 만들면 실제로 어떤 형태일까?


1. 0 ~ 4차원을 나타내는 단어의 정의

  • 차원은 행렬의 구성이 한 개일때 부터 여러개이거나 여러개로 쌓여있는 형태를 말한다.
    • Scalar(스칼라) : 0D : 숫자 하나를 나타내는 형태
    • Vector(벡터) : 1D : 행은 여러개 열은 1개인 형태
    • Metrix(메트릭스) : 2D : 행과 열 모두 1개 초과인 형태
    • Tensor(텐서) : 3 ~ nd : 행과 열이 여러개인 것이 여러번 쌓여있는 형태
  • 그림으로 이해하기

2. numpy 혹은 Torch 패키지로 스칼라 ~ 텐서를 만드는 법 

  • 넘파이와 파이토치의 토치를 사용해서 0~nD차원의 행렬을 생성할 수 있다.
  • 생성하는 방법은 아래와 같다.
    • 주의할점
      • scalar는 numpy로만 생성이 가능하다.
      • 각 행렬의 값의 type을 생성하면서 지정할 수 있다. 
        • 예시 : torch.FolatTensor(3,6,7, dtype = torch.float)
      • numpy와 torch에서 행렬 생성에 사용하는 시퀀스는 거의 유사하다.
import numpy as np
import torch
# Tensor 생성
## - 원본데이터를 tensor로 전환하는 것은 많이하나 보통 생성은 많이 하지 않을 것
### Scala(스칼라) 는 numpy로 만든다
### 파이토치가 텐서플로우보다 쉬운이유는 넘파이를 사용하기 때문임!

# scalar
data1 = np.array(10) # 10이라는 한개의 값을 가진 0D텐서
print(data1, data1.ndim, data1.shape) # ndim은 axis(rank) 축을 의미(number of array demension), shape는 행렬의 차원을 말함

# Vector
data2 = torch.FloatTensor([1,2]) # 1,2 원소를 가진 1D텐서 선언, 구성요소가 보통은 int를 주로 사용함 (정수(float) 보다는) 그외 double, long
print(data2, data2.ndim, data2.shape)

# Matrix (2D 텐서)
data3 = torch.FloatTensor(3,2) # 3 by 2의 원소를 가진 2D 선언, 구성하는 값은 랜덤하게 설정됨
print(data3, data3.ndim, data3.shape)

# Tensor (3D 텐서)
data4 = torch.FloatTensor([[1],[2],[3]]) # 1 by 1 by 1형태의 3D텐서 선언, 값을 1,2,3으로 지정하여 선언함
print(data4, data4.ndim, data4.shape)

# Tensor (3D 텐서)
data5 = torch.FloatTensor([1,2,3]) 
print(data5, data5.ndim, data5.shape,data5.size()) #size는 numpy에서는 size만 사용 torch에서는 size()괄호까지 같이 사용

# 텐서는 밖에서 안쪽으로 선언함
torch.zeros(3,2,5, dtype=torch.int) #행렬을 0들로 채우기
torch.ones(2,3) # 1로 채우기
torch.rand(4,5) # 랜덤하게 채우기
torch.full_like(data5,20) # data5와 같은 행렬 조건으로 채우되 20으로 값 채우기
각 행렬을 이루는 값의 성격을 dtype으로 지정할 수도 있음

 

3. 궁금증 해소 : 3D 텐서를 선언해서 만들면 실제로 어떤 형태일까?

import torch

# (3,2,7) 형태의 3D 텐서
tensor = torch.tensor([
    [[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14]],  # Depth 0
    [[15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28]],  # Depth 1
    [[29, 30, 31, 32, 33, 34, 35], [36, 37, 38, 39, 40, 41, 42]]  # Depth 2
])

print(tensor.shape)  # (3,2,7)
print(tensor)
  • 만약, 위와 같은 코드를 사용해서 텐서를 만들었다면,
    • 위에서 부터 순서대로 [Depth, rows, cols]의 형태를 가지게된다.
      • 첫번째 값 (3) ->  Depth (깊이, 채널 개수)
      • 두번째 값 (2) -> Rows (행, 한 단면의 행의 갯수)
      • 세번째 값 (7) -> columns (열, 한 단면의 열의 갯수)
    • 즉, 위와 같이 만든 형태라면, 2 by 3 (2 바이 3), 2행과 7열로 이루어진 한 면이 3개의 높이로 쌓여있는 형태
    • 위에서 부터 순서대로 바닥에서 위로 올라가는 형태로 숫자를 지정하여 생성한 것으로 이해할 수 있다.
      • 첫번째 바닥 부분의 면
        • [ 1 2 3 4 5 6 7 ] 
        • [ 8 9 10 11 12 13 14 ]
      • 두번째 중간에 있는 면
        • [ 15 16 17 18 19 20 21 ]
        • [ 22 23 24 25 26 27 28 ]
      • 세번째 가장 위에 위치한 면
        • [ 29 30 31 32 33 34 35 ]
        • [ 36 37 38 39 40 41 42 ]