페이지

2022년 7월 23일 토요일

3.5.4 훈련 검증

 훈련 데이터에서 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

 

댓글 없음: