from keras import models
from keras import layers
from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
# 모델 구성
_input_shape = X_train.shape[1] # input_shape : # of columns +1
_epochs = 500 # 모든 샘플에 대해 학습되는 횟수
_batch_size = 256 #512 # 샘플을 한번에 몇 개씩 처리할 지 결정. 전체 rows 를 _batch_size 만큼 끊어서 집어 넣어라.
_patience = 200
_node_in = 16 # 입력층 노드 수
_node1 = 16 # 은닉층 노드 수
_node_out = 1 # 출력층 노드 수
model = models.Sequential() #은닉층을 차곡차곡 쌓는 방식의 모델이 sequential()
model.add(layers.Dense(_node_in, activation = 'relu', input_shape=(_input_shape,)))
# _input_shape 개의 입력값을 받아 은닉층 _node_in 개 노드로 보낸다는 뜻.
model.add(layers.Dense(_node1, activation = 'relu'))
model.add(layers.Dense(_node1, activation = 'relu'))
model.add(layers.Dense(_node1, activation = 'relu'))
# model.add(layers.Dense(16, activation = 'relu'))
model.add(layers.Dense(_node_out, activation='sigmoid'))
# 모델 컴파일
model.compile(optimizer = 'rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
## optimizer = Adadelta, Adagrad, Adam, RMSprop, SGD
# 모델 저장 폴더 생성
# MODEL_DIR = 'C:\Users\chpark\OneDrive\My_Code\L_Deeplearning\model_out'
# if not os.path.exists(MODEL_DIR):
# os.mkdir(MODEL_DIR)
modelpath = 'C:/Users/chpark/OneDrive/My_Code/L_Deeplearning/model_out/{epoch:02d}-{val_loss:.4f}.hdf5'
# 모델 업데이트 및 저장
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
# 학습 자동 중단 설정
early_stopping_callback = EarlyStopping(monitor = 'val_loss', patience=_patience)
history = model.fit(X_train, y_train, epochs=_epochs,
batch_size=_batch_size,
validation_data=(X_test, y_test),
verbose = 1,
callbacks=[early_stopping_callback])
history_dict = history.history
loss= history_dict['loss']
val_loss = history_dict['val_loss']
acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
# 훈련과 검증 손실 그리기
epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, 'bo', label='Training loss') # bo means blue dot
plt.plot(epochs, val_loss, 'b', label = 'Validation loss') # 'b'는 파란색 실선
plt.title('Training and validation loss')
plt.xlabel('epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
# 훈련과 검증 정확도 그리기
plt.clf() # initialize graph
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
329/329 [==============================] - 1s 3ms/step - loss: 16053300935654324823916544.0000 - accuracy: 0.8158