경사하강법 실습
Keras 모델 훈련
compile()에서 옵티마이저, 손실 함수, 평가 지표를 설정. fit()은 미니배치마다 예측, 손실 계산, 그래디언트 계산, 파라미터 수정을 반복.
실습 준비
import os
os.environ["KERAS_BACKEND"] = "torch"
import keras
import numpy as np
(x_train, y_train), _ = keras.datasets.mnist.load_data()
cond = (y_train == 0) | (y_train == 1)
x_train_binary = x_train[cond]
y_train_binary = np.where(y_train[cond] == 0, 0, 1)
keras.utils.set_random_seed(812) # 실행 결과 재현용 난수 초기값
model = keras.models.Sequential(
[
keras.layers.Rescaling(1 / 255), # 픽셀값을 0~1 범위로 변환
keras.layers.Flatten(), # 28×28 이미지를 길이 784의 벡터로 변환
keras.layers.Dense(1, activation="sigmoid"),
]
)
학습률이 0.0001인 SGD로 이항 교차 엔트로피를 최소화하도록 모델을 설정.
model.compile(
optimizer=keras.optimizers.SGD(learning_rate=0.0001),
loss="binary_crossentropy",
metrics=["accuracy"],
)
훈련 데이터를 32개씩 나누어 5번 반복 학습.
history = model.fit(
x_train_binary,
y_train_binary,
epochs=5,
batch_size=32,
)
실행 결과
Epoch 1/5
396/396 ━━━━━━━━━━━━━━━━━━━━ 3s 5ms/step - accuracy: 0.2869 - loss: 0.7754
Epoch 2/5
396/396 ━━━━━━━━━━━━━━━━━━━━ 2s 4ms/step - accuracy: 0.5919 - loss: 0.6509
Epoch 3/5
396/396 ━━━━━━━━━━━━━━━━━━━━ 2s 4ms/step - accuracy: 0.8305 - loss: 0.5583
Epoch 4/5
396/396 ━━━━━━━━━━━━━━━━━━━━ 2s 4ms/step - accuracy: 0.9333 - loss: 0.4871
Epoch 5/5
396/396 ━━━━━━━━━━━━━━━━━━━━ 2s 4ms/step - accuracy: 0.9739 - loss: 0.4307
history.history["loss"][-1] # 마지막 에포크의 훈련 손실
실행 결과
0.4306652247905731
history.history["accuracy"][-1] # 마지막 에포크의 훈련 정확도
실행 결과
0.9739439487457275
5번째 에포크의 훈련 손실은 약 0.431, 훈련 정확도는 약 97.4%. 두 값은 훈련 데이터에서 계산한 결과이므로 일반화 성능은 별도 데이터로 평가해야 함.
퀴즈
다음 설정에 대한 설명으로 올바른 것을 모두 고르세요.
model.compile(
optimizer=keras.optimizers.SGD(learning_rate=0.0001),
loss="binary_crossentropy",
metrics=["accuracy"],
)
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.