문제의 종류에 따라 함수를 선택해야 한다
종류는 크게 2가지 : 평균 제곱을 기반으로 하는 손실함수 / 엔트로피를 기반으로 하는 손실함수
신경망은 매개변수가 매우 많은 복잡한 모델이어서 훈련데이터에 쉽게 과적합 되는 경향이 있다
from tensorflow.keras.datasets import fashion_mnist
# 데이터 불러오기
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
# 데이터 정규화
X_train = X_train / 255.
X_test = X_test /255.
# 기본적인 신경망
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
import keras, os
# 모델 구성
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(10, activation='softmax')
])
model.compile(optimizer='adam'
, loss='sparse_categorical_crossentropy'
, metrics=['accuracy'])
# 변수 설정
batch_size = 30
epochs_max = 1
# 학습시킨 데이터를 저장시키기 위한 코드
checkpoint_filepath = "FMbest.hdf5"
# overfitting을 방지하기 위해서 학습 중 early stop을 수행
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1)
# Validation Set을 기준으로 가장 최적의 모델을 찾기
save_best = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_filepath, monitor='val_loss', verbose=1, save_best_only=True,
save_weights_only=True, mode='auto', save_freq='epoch', options=None)
# 모델 학습
model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs_max, verbose=1,
validation_data=(X_test,y_test),
callbacks=[early_stop, save_best])
# 체크포인트에 저장된 가중치들을 불러들이기
model.load_weights(checkpoint_filepath)
# best model을 이용한 테스트 데이터 예측 정확도 재확인
model.predict(X_test[0:1])
test_loss, test_acc = model.evaluate(X_test, y_test, verbose=1)
from tensorflow.keras import regularizers
# 모델 구성
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(64,
kernel_regularizer=regularizers.l2(0.01), # L2 Regularization
activity_regularizer=regularizers.l1(0.01)), # L1 Regularization
Dense(10, activation='softmax')
])
model.compile(optimizer='adam'
, loss='sparse_categorical_crossentropy'
, metrics=['accuracy'])
# 모델 학습
model.fit(X_train, y_train, batch_size=30, epochs=1, verbose=1,
validation_data=(X_test,y_test))
from tensorflow.keras.constraints import MaxNorm
# 모델 구성
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(64,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.01),
kernel_constraint=MaxNorm(2.)), # 가중치 제한
Dense(10, activation='softmax')
])
model.compile(optimizer='adam'
, loss='sparse_categorical_crossentropy'
, metrics=['accuracy'])
# 모델 학습
model.fit(X_train, y_train, batch_size=30, epochs=1, verbose=1,
validation_data=(X_test,y_test))
from tensorflow.keras.layers import Dropout
# 모델 구성
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(64,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.01),
kernel_constraint=MaxNorm(2.)),
Dropout(0.5),
# 드롭아웃(1 - 0.5만큼을 곱해서 줄임)
Dense(10, activation='softmax')
])
model.compile(optimizer='adam'
, loss='sparse_categorical_crossentropy'
, metrics=['accuracy'])
# 모델 학습
model.fit(X_train, y_train, batch_size=30, epochs=1, verbose=1,
validation_data=(X_test,y_test))
# 옵티마이저의 하이퍼파라미터 조정
tf.keras.optimizers.Adam(
learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, amsgrad=False,
name='Adam'
)
# 기존 모델에 적용
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001, beta_1 = 0.89)
, loss='sparse_categorical_crossentropy'
, metrics=['accuracy'])
# 학습률 계획 지정 후 옵티마이저에 반영
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=1e-2,
decay_steps=10000,
decay_rate=0.9)
# 모델에 적용
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr_schedule)
, loss='sparse_categorical_crossentropy'
, metrics=['accuracy'])