반응형
- 딥러닝에 대해서 공부할 때에는 다음의 책과 함께 했습니다. 챕터 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)
지금까지 텐서에 대한 기본 문법에 대해 알아보았습니다.
조금씩 딥러닝에 가까워지는 것 느껴지나요?
다음 포스팅을 이어서 가볼까요?
오늘도 감사합니다.
'Python > Deep Learning' 카테고리의 다른 글
[DL]_텐서 + 텐서 = ????????? - 브로드캐스팅 (0) | 2023.08.31 |
---|---|
[DL]_나도 신경망을 만들 수 있다고? - 기본 예제 실습 (0) | 2023.08.27 |