아래 요소들을 직관적으로 살펴본다.
케라스로 MNIST 데이터셋 불러오기
신경망 구조 지정
아래 신경망의 구조는 다음과 같다.
Sequential
모델 활용.
완전 연결(fully connected).둘째 층
활성화 함수: 소프트맥스(softmax) 함수
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
layers.Dense(512, activation="relu"),
layers.Dense(10, activation="softmax")
])
신경망 컴파일
구조가 지정된 신경망을 훈련이 가능한 모델로 만드는 과정이며 아래 세 가지 사항이 지정되어야 한다.
모니터링 지표: 훈련과 테스트 과정을 모니터링 할 때 사용되는 평가 지표(metric). 손실 함수값을 사용할 수도 있고 아닐 수도 있음. 아래 코드에서는 정확도(accuracy)만 사용.
model.compile(optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
모델 훈련
컴파일된 객체 모델을 훈련한다.
fit()
메서드 호출: 훈련 세트와 레이블을 인자로 사용epoths
: 에포크(전체 훈련 세트 대상 반복 훈련 횟수)batch_size
: 가중치 업데이트 한 번 실행할 때 사용되는 샘플 수
model.fit(train_images, train_labels, epochs=5, batch_size=128)
모델 활용: 예측하기
훈련에 사용되지 않은 손글씨 숫자 이미지 10장에 대한 모델 예측값을 확인하기 위해
predict()
메서드를 이용한다.
test_digits = test_images[0:10]
predictions = model.predict(test_digits)
성능 테스트
테스트 세트 전체에 대한 성능 평가는 evaluate()
메서드를 활용한다.
성능평가에 사용되는 지표는 앞서 모델을 컴파일할 때 지정한 정확도(accuracy)가 사용된다.
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"test_acc: {test_acc}")
Tensor
):Tensor
는 GPU를 활용한 연산을 지원하지만 넘파이 어레이는 그렇지 않음.앞으로 다룰 데이터는 크게 아래 네 종류의 텐서들이다.
(샘플 수, 특성 수)
모양의 2D 텐서(샘플 수, 타임 스텝 수, 특성 수)
모양의 3D 텐서(샘플 수, 가로, 세로, 채널 수)
또는 (샘플 수, 채널 수, 가로, 세로)
모양의 4D 텐서(샘플 수, 프레임 수, 가로, 세로, 채널 수)
모양의 5D 텐서float32
, float64
등(100000, 3)
모양의 2D 텐서임.(500, 20000)
모양의 2D 텐서로 표현됨.(250, 390, 3)
모양의 3D 텐서(280, 128)
모양의 2D 텐서로 표현.(1000000, 280, 128)
모양의 3D 텐서.(가로, 세로, 컬러 채널 수)
256x256
크기 흑백이미지 128개를 갖는 배치: (128, 256, 256, 1)
모양 4D 텐서256x256
크기 컬러이미지 128개를 갖는 배치: (128, 256, 256, 3)
모양 4D 텐서(프레임 수, 가로, 세로, 컬러 채널 수)
모양의 4D 텐서.(동영상 수, 프레임 수, 가로, 세로, 컬러 채널 수)
모양의 5D 텐서.144x256
크기의 프레임으로 구성된 60초 동영상. 초당 4개의 프레임 구성.(240, 144, 256, 3)
모양의 4D 텐서 (총 240 프레임 사용)(10, 240, 144, 256, 3)
모양의 5D 텐서ndim
)shape
)dtype
)float16
, float32
,float64
, int8
, string
등이 가장 많이 사용됨.신경망 모델의 훈련은 기본적으로 텐서와 관련된 몇 가지 연산으로 이루어진다. 예를 들어 이전 신경망에 사용된 케라스 레이어를 살펴보자.
keras.layers.Dense(512, activation="relu")
keras.layers.Dense(10, activation="softmax")
위 두 개의 층이 하는 일은 데이터셋의 변환이며 실제로 이루어지는 연산은 다음과 같다.
output1 = relu(dot(input1, W1) + b1)
output2 = softmax(dot(input2, W2) + b2)
사용된 세부 연산은 다음과 같다.
dot(input, W)
): 입력 텐서와 가중치 텐서의 곱dot(input, W) + b
): 점곱의 결과 텐서와 벡터 b
의 합relu
함수: relu(x) = max(x, 0)
softmax
함수: 10개 범주 각각에 속할 확률 계산그림 출처: 생활코딩: 한 페이지 머신러닝
두 텐서의 모양이 아래와 같을 때 항목별 연산을 위한 브로드캐스팅이 가능하다.
(a, b, … n, n + 1, … m) 와 (n, n + 1, … m)
a
부터 n-1
까지의 축에 대해 축(axis)이 자동으로 추가됨.히든 레이어의 중간 결과
그림 출처: 생활코딩: 한 페이지 머신러닝
batch_size
로 지정.metrics
)에 사용되는 정확도 등은 가중치에 대한 미분가능 함수가 아님.묶음(배치)의 크기에 따라 아래 세 종류의 경사하강법이 활용된다.
batch_size
가 전체 훈련 세트의 크기batch_size
가 몇 십에서 몇 백.batch_size = 1
옵티마이저
역전파(backpropagation) 원리