손실 함수
옵티마이저와 지표
딥러닝 모델 학습
sparse_categorical_crossentropy
categorical_cross_entropy
binary_crossentropy
이진 분류, 다중 클래스 분류에 사용
softmax 결과 및 원-핫 인코딩 사이 출력 간 거리를 비교한 것을 오차로 잡음
정답을 맞추는 경우 ➡️ 오차 0
틀리는 경우 ➡️ 차이가 클수록 오차가 무한하게 커짐
이진 분류 문제 교차 엔트로피 계산
keras.optimizer.SGD()
: 기본 확률적 경사 하강법keras.optimizer.Adam()
: 사용 빈도가 높은 옵티마이저Q. 경사하강법으로 안장점(Saddle point)에서 벗어나지 못하는지?
A. 기울기의 반대 방향으로 이동해야 하나, 기울기가 0이기 때문에 더이상 업데이트가 일어날 수 없기 때문에 벗어나지 못하고 최적화가 정체될 수 있음.
mse
또는 accuracy
사용acc
로 사용 가능
1. 데이터셋을 입력 X와 정답 label인 y로 구분함
2. 입력 데이터 : 연속 레이어로 구성된 네트워크를 통해 결과로 예측한 y' 출력
3. 손실 함수 : 모델이 예측한 y'과 실제 정답인 y를 비교 ➡️ 차이의 정도에 따라 측정되는 손실값이 다름
4. 옵티마이저 : 손실값을 이용해 모델 가중치를 업데이트
5. 모델이 새로 예측한 y'과 실제 정답 y 차이를 측정하는 손실값 계산 ➡️ 반복
6. 계산된 손실값을 최소화할 수 있도록 옵티마이저가 동작
make_regression
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
X, y = make_regression(n_samples=200, n_features=1,
bias=5.0, noise=5.0, random_state=123)
y = np.expand_dims(y, axis=1)
plt.scatter(X, y)
plt.show()
x_train
, y_train
: 학습용 데이터셋x_test
, y_test
: 테스트용 데이터셋from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y,
test_size=0.2,
shuffle=True,
random_state=123)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import models, layers, optimizers, utils
model = keras.Sequential()
model.add(layers.Dense(1, activation='linear', input_shape=(1,)))
model.summary()
utils.plot_model(model)
optimizer = optimizers.SGD()
model.compile(loss='mse', optimizer=optimizer, metrics=['mae', 'mse'])
history = model.fit(x_train, y_train, epochs=40)
Epoch 1/40
5/5 [==============================] - 2s 2ms/step - loss: 573.3981 - mae: 19.1674 - mse: 573.3981
Epoch 2/40
5/5 [==============================] - 0s 1ms/step - loss: 461.0914 - mae: 17.2276 - mse: 461.0914
Epoch 3/40
5/5 [==============================] - 0s 1ms/step - loss: 371.4703 - mae: 15.5221 - mse: 371.4703
Epoch 4/40
5/5 [==============================] - 0s 2ms/step - loss: 300.3263 - mae: 13.9134 - mse: 300.3263
Epoch 5/40
5/5 [==============================] - 0s 1ms/step - loss: 243.1690 - mae: 12.5352 - mse: 243.1690
Epoch 6/40
5/5 [==============================] - 0s 1ms/step - loss: 198.1948 - mae: 11.3014 - mse: 198.1948
Epoch 7/40
5/5 [==============================] - 0s 2ms/step - loss: 162.0112 - mae: 10.2153 - mse: 162.0112
Epoch 8/40
5/5 [==============================] - 0s 1ms/step - loss: 133.2978 - mae: 9.2251 - mse: 133.2978
Epoch 9/40
5/5 [==============================] - 0s 1ms/step - loss: 110.1979 - mae: 8.4215 - mse: 110.1979
Epoch 10/40
5/5 [==============================] - 0s 2ms/step - loss: 92.0803 - mae: 7.6909 - mse: 92.0803
Epoch 11/40
5/5 [==============================] - 0s 1ms/step - loss: 77.5406 - mae: 7.0378 - mse: 77.5406
Epoch 12/40
5/5 [==============================] - 0s 1ms/step - loss: 65.9422 - mae: 6.5127 - mse: 65.9422
Epoch 13/40
5/5 [==============================] - 0s 1ms/step - loss: 56.8376 - mae: 6.0565 - mse: 56.8376
Epoch 14/40
5/5 [==============================] - 0s 2ms/step - loss: 49.4224 - mae: 5.6138 - mse: 49.4224
Epoch 15/40
5/5 [==============================] - 0s 1ms/step - loss: 43.4766 - mae: 5.2351 - mse: 43.4766
Epoch 16/40
5/5 [==============================] - 0s 2ms/step - loss: 38.8747 - mae: 4.9559 - mse: 38.8747
Epoch 17/40
5/5 [==============================] - 0s 2ms/step - loss: 35.1471 - mae: 4.6994 - mse: 35.1471
Epoch 18/40
5/5 [==============================] - 0s 2ms/step - loss: 32.1710 - mae: 4.4728 - mse: 32.1710
Epoch 19/40
5/5 [==============================] - 0s 1ms/step - loss: 29.8394 - mae: 4.3011 - mse: 29.8394
Epoch 20/40
5/5 [==============================] - 0s 2ms/step - loss: 27.9350 - mae: 4.1438 - mse: 27.9350
Epoch 21/40
5/5 [==============================] - 0s 1ms/step - loss: 26.4692 - mae: 4.0377 - mse: 26.4692
Epoch 22/40
5/5 [==============================] - 0s 2ms/step - loss: 25.2609 - mae: 3.9402 - mse: 25.2609
Epoch 23/40
5/5 [==============================] - 0s 1ms/step - loss: 24.3205 - mae: 3.8724 - mse: 24.3205
Epoch 24/40
5/5 [==============================] - 0s 1ms/step - loss: 23.5766 - mae: 3.8274 - mse: 23.5766
Epoch 25/40
5/5 [==============================] - 0s 2ms/step - loss: 22.9866 - mae: 3.7823 - mse: 22.9866
Epoch 26/40
5/5 [==============================] - 0s 2ms/step - loss: 22.4922 - mae: 3.7448 - mse: 22.4922
Epoch 27/40
5/5 [==============================] - 0s 1ms/step - loss: 22.1143 - mae: 3.7163 - mse: 22.1143
Epoch 28/40
5/5 [==============================] - 0s 2ms/step - loss: 21.8074 - mae: 3.6945 - mse: 21.8074
Epoch 29/40
5/5 [==============================] - 0s 2ms/step - loss: 21.5809 - mae: 3.6766 - mse: 21.5809
Epoch 30/40
5/5 [==============================] - 0s 1ms/step - loss: 21.3961 - mae: 3.6617 - mse: 21.3961
Epoch 31/40
5/5 [==============================] - 0s 1ms/step - loss: 21.2558 - mae: 3.6549 - mse: 21.2558
Epoch 32/40
5/5 [==============================] - 0s 1ms/step - loss: 21.1199 - mae: 3.6411 - mse: 21.1199
Epoch 33/40
5/5 [==============================] - 0s 1ms/step - loss: 21.0021 - mae: 3.6331 - mse: 21.0021
Epoch 34/40
5/5 [==============================] - 0s 5ms/step - loss: 20.9313 - mae: 3.6252 - mse: 20.9313
Epoch 35/40
5/5 [==============================] - 0s 2ms/step - loss: 20.8649 - mae: 3.6205 - mse: 20.8649
Epoch 36/40
5/5 [==============================] - 0s 2ms/step - loss: 20.8200 - mae: 3.6136 - mse: 20.8200
Epoch 37/40
5/5 [==============================] - 0s 2ms/step - loss: 20.7878 - mae: 3.6108 - mse: 20.7878
Epoch 38/40
5/5 [==============================] - 0s 1ms/step - loss: 20.7570 - mae: 3.6090 - mse: 20.7570
Epoch 39/40
5/5 [==============================] - ETA: 0s - loss: 22.3289 - mae: 3.9033 - mse: 22.328 - 0s 2ms/step - loss: 20.7228 - mae: 3.6043 - mse: 20.7228
Epoch 40/40
5/5 [==============================] - 0s 2ms/step - loss: 20.7291 - mae: 3.6044 - mse: 20.7291
plt.plot(history.history['mae'])
plt.plot(history.history['mse'])
plt.xlabel('Epoch')
plt.legend(['mae', 'mse'])
plt.show();
model.evaluate(x_test, y_test)
2/2 [==============================] - 0s 3ms/step - loss: 21.9171 - mae: 3.9882 - mse: 21.9171
result = model.predict(X)
plt.scatter(X, y)
plt.plot(X, result, 'r')
plt.show()
model.layers
layer = model.layers[0]
print(layer.name)
layer = model.get_layer('dense')
print(layer.name)
weights, biases = layer.get_weights()
print(weights)
print(biases)
plt.scatter(X, y)
plt.plot(X, np.array(weights * X + biases), 'r')
plt.show()