프로그래밍/Python

tensor(텐서) 개념 및 numpy, pytorch 비교하기

히또아빠 2023. 12. 1. 11:11

1.개념

1-1.텐서 차원별 개념

출처:  PyTorch로 시작하는 딥 러닝 입문

스칼라(Scalar), 벡터(Vector), 행렬(Matrix), 텐서(Tensor)는 선형 대수학(Linear Algebra)에서 중요한 개념들입니다. 각각은 다양한 수학적 객체를 나타내며, 데이터 및 연산을 표현하는 데에 활용된다.

  • 스칼라(Scalar):
    • 크기만 가지고 방향이 없는 양, 실수나 정수
    • 0차원
  • 벡터(Vector):
    • 벡터는 크기와 방향을 가지는 양
    • 2차원 벡터는 평면에서의 위치, 3차원 벡터는 공간에서의 위치를 나타냄
    • 벡터는 순서가 있는 숫자의 나열로 표현되며, 각 요소는 벡터의 한 차원을 나타냄
    • 1차원
  • 행렬(matrix):
    • 숫자들을 2차원 배열로 나타낸 것으로 행과 열로 이루어짐
    • M x N 행렬은 M개의 행과 N개의 열로 이루어짐
    • 2차원
  • 텐서(tensor):
    • 텐서는 스칼라, 벡터, 행렬을 일반화한 개념으로 임의의 차원을 가지는 다차원 배열(multi - dimensional array)
    • 스칼라, 벡터, 행렬은 각각 0, 1, 2차원 텐서의 개념으로 볼 수 있음
    • 딥러닝과 머신러닝 분야에서는 고차원의 텐서를 데이터로 다루기 떄문에 중요한 데이터 구조.
    • 3차원 이상으로 확장 가능

2차원 행령, 이미지 데이터에서 tensor, 자연어 처리에서 tensor

1-2.텐서의 크기표현

2차원 텐서(= 행렬의 표현)의 크기표현, |t| = batch size * dim, 행의 크기(=batch size), 열의 크기(=dim).
딥러닝 분야에서는 일반적으로 batch size 단위를 2^n 단위로 모델학습을 한다.
예를들어, 256차원의 1차원 array = [1, 2, ... 256] 있다.

  • 이 데이터의 크기는 1 * 256 = 256
  • 이러한 데이터가 10000개 있으면
  • 전체 데이터의 크기는 10000 * 256개가 된다.
  • 10,000개의 데이터를 1개씩 꺼내서 컴퓨터가 연산할 수 있지만 64개씩 꺼내서 처리 한다고 하면 이때 Batch size = 64가 된다.
  • 즉, 컴퓨터가 한 번에 처리하는 2D array 크기는 64 * 256이 된다.

2.실습

2-1.numpy 텐서

- 1차원 배열

# 1차원 배열
array_1 = np.array([1, 2, 3, 4, 5, 6]) 
print(array_1)
print("dimension:", array_1.ndim, ",shape:",array_1.shape)

[1 2 3 4 5 6]
dimension: 1 ,shape: (6,)

# numpy array의 slicing 및 index는 python list와 동일함.
array_1[:2], array_1[3:], array_1[-1], array_1[::2]

(array([1, 2]), array([4, 5, 6]), 6, array([1, 3, 5]))

- 2차원 배열

# 2차원 배열
array_2 = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.], [10., 11., 12.]])
print(array_2)
print("dimension:", array_2.ndim, ",shape:",array_2.shape)

[[ 1.  2.  3.]
 [ 4.  5.  6.]
 [ 7.  8.  9.]
 [10. 11. 12.]]
dimension: 2 ,shape: (4, 3)

- 3차원 배열

# 3차원 배열
array_3 = np.array([[[1., 2., 3.], [4., 5., 6.]], [[7., 8., 9.], [10., 11., 12.]]])
print(array_3)
print("dimension:", array_3.ndim, ",shape:",array_3.shape)

[[[ 1.  2.  3.]
  [ 4.  5.  6.]]

 [[ 7.  8.  9.]
  [10. 11. 12.]]]
dimension: 3 ,shape: (2, 2, 3)

2-2.pytorch 텐서

- 1차원 텐서

# 1차원 텐서
tensor_1 = torch.FloatTensor([1, 2, 3, 4, 5, 6])
print(tensor_1)
print("dimension:", tensor_1.dim(), ",shape:",tensor_1.shape, ",shape:",tensor_1.size()) 

tensor([1., 2., 3., 4., 5., 6.])
dimension: 1 ,shape: torch.Size([6]) ,shape: torch.Size([6])

# torch tensor의 slicing 및 index는 python list와 동일함.
tensor_1[:2], tensor_1[3:], tensor_1[-1], tensor_1[::2]

(tensor([1., 2.]), tensor([4., 5., 6.]), tensor(6.), tensor([1., 3., 5.]))

- 2차원 텐서

# 2차원 텐서
tensor_2 = torch.FloatTensor([[1., 2., 3.],           
                            [4., 5., 6.],
                            [7., 8., 9.],
                            [10., 11., 12.]])
print(tensor_2)
print("dimension:", tensor_2.dim(), ",shape:",tensor_2.shape, ",shape:",tensor_2.size()) 

tensor([[ 1.,  2.,  3.],
        [ 4.,  5.,  6.],
        [ 7.,  8.,  9.],
        [10., 11., 12.]])
dimension: 2 ,shape: torch.Size([4, 3]) ,shape: torch.Size([4, 3])

- 3차원 텐서

# 3차원 텐서
tensor_3 = torch.FloatTensor([[[1., 2., 3.],           
                            [4., 5., 6.]],
                            [[7., 8., 9.],
                            [10., 11., 12.]]])
print(tensor_3)
print("dimension:", tensor_3.dim(), ",shape:",tensor_3.shape, ",shape:",tensor_3.size())

tensor([[[ 1.,  2.,  3.],
         [ 4.,  5.,  6.]],

        [[ 7.,  8.,  9.],
         [10., 11., 12.]]])
dimension: 3 ,shape: torch.Size([2, 2, 3]) ,shape: torch.Size([2, 2, 3])

3.참고사항

행렬의 연산에서는 차원이 동일한 경우 행렬의 곱, 더하기, 빼기가 가능하나 numpy나 pytorch의 경우 행렬의 크기를 자동으로 맞춰주는 broadcasting 기능을 지원한다.

그리고 array구조의 축, size가 한눈에 안들어 온다면 가장 바깥 괄호를 기준으로 각요소 갯수를 파악할 수 있다.

출처: https://coding-kindergarten.tistory.com/147

위의 텐서는 3차원 텐서로 해당 텐서의 size는 빨간색 테두리 기준 4, 파란색 테두리 기준 2, 검은색 테두리 기준 3 즉, (2, 2, 3) 크기의 텐서를 갖는다.

https://wikidocs.net/52460

 

02-02 텐서 조작하기(Tensor Manipulation) 1

이번 챕터에서 배울 내용에 대해서 리뷰해보겠습니다. 벡터, 행렬, 텐서의 개념에 대해서 이해하고, Numpy와 파이토치로 벡터, 행렬, 텐서를 다루는 방법에 대해서 이해합니…

wikidocs.net

 

https://coding-kindergarten.tistory.com/147

 

[#shorts] 벡터(Vector), 행렬(Matrix), 텐서(Tensor) 개념 정리

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알

coding-kindergarten.tistory.com

 

300x250
반응형