본문 바로가기
Python/Deep Learning

[DL]_텐서, 텐서 하는 그 텐서가 뭔데?

by ssolLEE 2023. 8. 28.
반응형

  • 딥러닝에 대해서 공부할 때에는 다음의 책과 함께 했습니다. 챕터 1에서는 인공지능과 머신러닝, 그리고 딥러닝에 대한 자세한 설명과 흐름을 얘기해주어 비교적 친숙하게 학습을 시작할 수 있었습니다. 감사합니다!

  • 딥러닝 실습은 구글에서 제공하는 Colaboratory에서 하겠습니다. 
  • 하기전에 항상 다음과 같이 세팅을 GPU로 바꿔주세요.

 

신경망을 위한 데이터 표현

  • 텐서(tensor) : 다차원 배열.  임의의 차원 개수를 가지는 행렬의 일반화된 모습
  • 텐서에서는 차원을 종종 축이라고 부릅니다. 
  • 이번 포스팅에서는 텐서에 대해 알아보겠습니다. 

 

스칼라(랭크-0 텐서)

  • 스칼라(scalar) : 하나의 숫자만 담고 있는 텐서
  • 스칼라 텐서, 랭크-0 텐서, 0D 텐서라고도 부름
  • 넘파이에서 float32나 float64 타입의 숫자는 스칼라 텐서 또는 배열 스칼라라고 부름
  • ndim - 넘파이 배열의 축 갯수 확인 / 스칼라 텐서의 축 갯수 = 0
  • 텐서의 축 갯수를 랭크(rank)라고도 부릅니다.
import numpy as np
x = np.array(12)
x
>>> array(12)

x.ndim
>>> 0

벡터(랭크-1 텐서)

  • 벡터(vector) : 숫자의 배열
  • 랭크-1 텐서, 1D 텐서
x = np.array([12, 3, 4, 2, 5])
x
>>> array([12,  3,  4,  2,  5])

x.ndim
>>> 1
  • 이 벡터는 원소 5개를 가지고 있으므로 5차원 벡터입니다. 
    • 1개의 축을 따라 5개의 차원을 가진 것
    • 5D 텐서는 5개의 축을 가진 것

행렬(랭크-2 텐서)

  • 벡터의 배열은 행렬, 랭크-2 텐서, 2D 텐서로 부릅니다.
  • 행렬에는 2개의 축이 있습니다. 
x = np.array([[5, 78, 2, 34, 0],
             [6, 79, 3, 35, 1],
             [7, 80, 4, 36, 2]])
x
>>> array([[ 5, 78,  2, 34,  0],
       [ 6, 79,  3, 35,  1],
       [ 7, 80,  4, 36,  2]])
       
x.ndim
>>> 2

 

랭크-3 텐서와 더 높은 랭크의 텐서

x = np.array([[[5, 78, 2, 34, 0],
             [6, 79, 3, 35, 1],
             [7, 80, 4, 36, 2]],
             [[5, 78, 2, 34, 0],
             [6, 79, 3, 35, 1],
             [7, 80, 4, 36, 2]],
             [[5, 78, 2, 34, 0],
             [6, 79, 3, 35, 1],
             [7, 80, 4, 36, 2]]])
x.shape, x.ndim
>>> ((3, 3, 5), 3)

 

텐서의 핵심 속성

  • 텐서는 3개의 핵심 속성으로 정의됩니다. 
    • 축의 갯수(랭크) : 파이썬 라이브러리에서는 ndim 속성으로 확인할 수 있음
    • 크기 : 텐서의 각 축을 따라 얼마나 많은 차원이 있는지를 나타낸 파이썬의 튜플. 파이썬 라이브러리에서는 shape 속성으로 확인할 수 있음
    • 데이터타입 : float16, float32, float64, uint8 등
  • 이를 확인해보겠습니다. 먼저 MNIST 데이터셋을 불러들입니다. 
from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images.shape, train_images.ndim, train_images.dtype
>>>((60000, 28, 28), 3, dtype('uint8'))
  • 이 배열은 8비트 정수형 랭크-3 텐서입니다. 
  • 28 * 28 크기의 정수 행렬 6만 개가 있는 배열입니다. 행렬의 각 원소는 0~255 사이의 값을 가집니다. 
  • 이 랭크-3 텐서에서 여덟 번째 샘플을 Matplotlib 라이브러리를 사용하여 확인할 수 있습니다. 
import matplotlib.pyplot as plt

digit = train_images[7]
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()

  • 어떤 숫자로 보이시나요? 
train_labels[7]
>>> 3
  • 3입니다. 
  • 다음과 같은 코드를 입력해도 같은 결과물이 나옵니다. 
fig, ax = plt.subplots()
ax.imshow(digit, cmap=plt.cm.binary)
plt.show()

넘파이로 텐서 조작하기

  • 11번째에서 101번째까지(101번쨰는 포함하지 않음) 숫자를 선택하여 (90, 28, 28) 배열을 만드는 세 가지 코드입니다.
my_slice = train_images[10:100]     # 90개의 이미지를 가져오겠다. 
my_slice.shape

my_slice = train_images[10:100, :, :]    # 90개의 이미지를 가져오겠다. 
my_slice.shape

my_slice = train_images[10:100, 0:28, 0:28]    # 90개의 이미지를 가져오겠다. 
my_slice.shape

>>> (90, 28, 28)
  • 이미지의 오른쪽 아래 14 * 14 픽셀을 선택합니다. 
my_slice = train_images[:, 14:, 14:]   
my_slice.shape
>>> (60000, 14, 14)
  • 정중앙에 위치한 14 * 14 픽셀을 선택합니다. 
my_slice = train_images[:, 7:-7, 7:-7]   
my_slice.shape
>>> (60000, 14, 14)

 

지금까지 텐서에 대한 기본 문법에 대해 알아보았습니다. 

조금씩 딥러닝에 가까워지는 것 느껴지나요?

 다음 포스팅을 이어서 가볼까요? 

 

오늘도 감사합니다.