훈련 데이터에서 1,000개의 샘플을 따로 떼어서 검증 세트로 사용하겠습니다.
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]
이제 20번의 에포크로 모델을 훈련시킵니다.
history = model.fit(partial_x_train,
partial_y_train,
epochs=20,
batch_size=512,
validation_data=(x_val, y_val))
마지막으로 손실과 정확도 곡선을 그립니다.
import matplotlib.pyplot as plt
loss = history.history]['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
plt.clf() ............... 그래프를 초기화합니다.
acc = history.history['acc']
val_acc = history.history['val_acc']
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
이 모델은 아홉 번째 에포크 이후에 과대 적합이 시작됩니다. 아홉 번의 엨포크로 새로운 모델을 훈련하고 테스트 세트에서 평가하겠습니다.
model = modles.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(1000, )))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy']
model.fit(partial_x_train,
paartial_y_train,
epochs=9,
batch_size=512,
validation_data=(x_val, y_val))
results = model.evaluate(x_test, on_hot_test_labels)
최종 결과는 다음과 같습니다
>>> results
[1.022498257544459, 0.7756010686194165]
대략 78%의 정확도를 달성했씁니다. 균형 잡힌 이진 분류 문제에서 완전히 무작위로 분류하면 50%의 정확도를 달성합니다. 이 문제는 불균형한 데이터셋을 사용하므로 무작위로 분류하면 18%정도를 달성합니다. 여기에 비하면 이 결과는 꽤 좋은 편입니다.
>>> import copy
>>> test_labels_copy = copy.copy(test_labels)
>>> np.random.shuffle(test_labels_copy)
>>> hits_array = np.array(test_labels) == np.array(test.labels_copy)
>>> float(np.sum(hits_array)) / len(test_labels)
0.182546749777382
댓글 없음:
댓글 쓰기