SW/딥러닝

49. 딥러닝 : MNIST : 훈련 모델 백테스팅 하는 방법, 예제, 구현

얇은생각 2020. 9. 15. 07:30
반응형

49. 딥러닝 : MNIST : 훈련 모델 백테스팅 하는 방법, 예제, 구현

 

모듈 임포트, 데이터 전처리, 데이터

import numpy as np
import tensorflow as tf

import tensorflow_datasets as tfds

mnist_dataset, mnist_info = tfds.load(name='mnist', with_info=True, as_supervised=True)

mnist_train, mnist_test = mnist_dataset['train'], mnist_dataset['test']

num_validation_samples = 0.1 * mnist_info.splits['train'].num_examples
num_validation_samples = tf.cast(num_validation_samples, tf.int64)

num_test_samples = mnist_info.splits['test'].num_examples
num_test_samples = tf.cast(num_test_samples, tf.int64)


def scale(image, label):
    image = tf.cast(image, tf.float32)
    image /= 255.
    return image, label

scaled_train_and_validation_data = mnist_train.map(scale)

test_data = mnist_test.map(scale)


BUFFER_SIZE = 10000

shuffled_train_and_validation_data = scaled_train_and_validation_data.shuffle(BUFFER_SIZE)

validation_data = shuffled_train_and_validation_data.take(num_validation_samples)
train_data = shuffled_train_and_validation_data.skip(num_validation_samples)


BATCH_SIZE = 100

train_data = train_data.batch(BATCH_SIZE)
validation_data = validation_data.batch(num_validation_samples)
test_data = test_data.batch(num_test_samples)

validation_inputs, validation_targets = next(iter(validation_data))

mnist_dataset, mnist_info = tfds.load(name='mnist', with_info=True, as_supervised=True)

mnist_train, mnist_test = mnist_dataset['train'], mnist_dataset['test']

num_validation_samples = 0.1 * mnist_info.splits['train'].num_examples
num_validation_samples = tf.cast(num_validation_samples, tf.int64)

num_test_samples = mnist_info.splits['test'].num_examples
num_test_samples = tf.cast(num_test_samples, tf.int64)


def scale(image, label):
    image = tf.cast(image, tf.float32)
    image /= 255.
    return image, label

scaled_train_and_validation_data = mnist_train.map(scale)

test_data = mnist_test.map(scale)

 

그동안 했던 포스팅을 합쳐 보았습니다. 구체적인 내용은 이전 포스팅을 참조해주세요. 

 

 

데이터 분리, 모델링, 모델 훈련

BUFFER_SIZE = 10000

shuffled_train_and_validation_data = scaled_train_and_validation_data.shuffle(BUFFER_SIZE)

validation_data = shuffled_train_and_validation_data.take(num_validation_samples)
train_data = shuffled_train_and_validation_data.skip(num_validation_samples)


BATCH_SIZE = 100

train_data = train_data.batch(BATCH_SIZE)
validation_data = validation_data.batch(num_validation_samples)
test_data = test_data.batch(num_test_samples)

validation_inputs, validation_targets = next(iter(validation_data))

input_size = 784
output_size = 10
hidden_layer_size = 50

model = tf.keras.Sequential([
                            tf.keras.layers.Flatten(input_shape=(28,28,1)),
                            tf.keras.layers.Dense(hidden_layer_size, activation='relu'),
                            tf.keras.layers.Dense(hidden_layer_size, activation='relu'),
                            tf.keras.layers.Dense(output_size, activation='softmax')   
                            ])

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

NUM_EPOCHS = 5

model.fit(train_data, epochs = NUM_EPOCHS, validation_data=(validation_inputs, validation_targets), verbose=2)

 

이제 실제, 데이터를 분리하고, 모델링을 하고, 모델을 훈련합니다. 해당 내용에 대해서도, 이전 포스팅을 참조해주세요. 이제 실제 테스트를 진행해보고 정리를 진행해보겠습니다.

 

 

 

실제 테스트

test_loss, test_accuracy = model.evaluate(test_data)
print('Test loss: {0:.2f}. Test accuracy: {1:.2f}%'.format(test_loss, test_accuracy*100.))

 

보여준 것보다 더 좋은 모델을 만들 수 있었으면 좋겠습니다. 어느 쪽이든 많은 것들을 다루어 보았습니다. 아마도 일부는 98 %에 도달했을 수도 있습니다. 즉, 모델이 98 % 정확하다는 의미일까요?

 

아닙니다. 검증 정확도를 알아보아야 합니다. 여전히 테스트해야합니다. 모델의 최종 정확도는 검증이 아닌 테스트 데이터 세트를 전달하는 데서 오는 것이기 때문에 테스트 데이터 세트의 모델입니다. 이유는 과잉 적합을 가질 수 있지만 이미 다루지 않았기 때문입니다. 검증 데이터 세트와 테스트 데이터 세트의 차이를 놓칠 수 있습니다. 그러니 명확히해야 합니다.

 

훈련 데이터에 대해 훈련한 다음 검증 데이터에 대해 검증합니다. 이것이 매개 변수가 가중치와 편향이 과도하게 맞지 않는지 확인하는 방법입니다. 첫 번째 모델은 하이퍼 매개 변수는 일반적으로 히든 레이어의 너비만 변경하지 않습니다. 학습률, 배치 크기, 각 레이어의 활성화 기능 등을 조정할 수 있습니다. 아마 모든 작업을 수행했을 것입니다.

 

모델을 한 번 더 실행하고 10 ~ 20 개의 서로 다른 조합 후 향상된 유효성 검사 정확도를 확인합니다. 유효성 검사 정확도를 유지하지 않고도 모델에 도달 할 수 있습니다. 본질적으로 최상의 하이퍼 매개 변수를 찾으려고 노력하고 있지만 찾은 것은 최상의 하이퍼 매개 변수가 아닙니다. 이것은 검증 데이터 세트를 기본적으로 미세 조정하여 가장 잘 맞는 하이퍼 매개 변수입니다.

 

검증 데이터 세트를 과도하게 맞추고 있습니다. 훈련 단계에서 조금 더 자세히 살펴 보겠습니다. 매개 변수 또는 가중치를 과도하게 맞추고 검증 데이터 세트는 매개 변수를 과도하게 맞추는 것을 방지하는 현실 검사입니다. 하이퍼 매개 변수를 조작 한 후 검증 정확도를 고려하면서 검증 데이터 세트를 과도하게 맞출 수 있습니다. 모델이 얼마나 좋은지에 대한 벤치 마크로, 테스트 데이터 세트는 하이퍼 매개 변수를 과도하게 맞추는 것을 방지하는 것입니다.

 

모델은 실제로 본 적이 없습니다. 모델을 테스트 해보면 다음과 같이 할 수 있습니다. 평가 방법을 사용하여 테스트 정확도를 평가합니다. 따라서 모델 평가 테스트 데이터를 작성하면 현재 모델 구조를 사용하여 네트워크를 통해 테스트 데이터를 전달하게됩니다. 손실과 정확도에 대한 두 가지 출력이 있습니다. 더 명확하게 하기 위한 훈련 단계입니다.

 

테스트 손실 및 테스트 정확도에 저장하겠습니다. 코드를 실행하겠습니다. 아직 표시하지 않았으므로 아무것도 나오지 않습니다. 멋진 형식을 사용하여 결과를 출력합니다. 결과는 위와 같습니다. 모델의 최종 테스트 정확도는 약 95%이며 이는 머신 러닝 프로세스의 마지막 단계이기도합니다. 개념적으로 모델을 테스트 한 후에는 더 이상 변경할 수 없습니다.

 

이 시점 이후에 모델을 변경하기 시작하면 테스트 데이터는 더 이상 이 특정 구성에서 정확도가 약 95%라는 피드백을 받았을 것입니다. 테스트 데이터 세트의 주요 요점은 50% 또는 60%를 얻을 경우 모델 배포를 시뮬레이션하는 것입니다. 모델이 과적합하고 실제 생활에서 비참하게 실패할 것이라는 것을 확실히 알 수 있습니다.

 

그러나 검증 정확도에 매우 가까운 값을 얻는 것은 과적합하지 않았음을 보여줍니다. 마지막으로 테스트 정확도는 기대하는 정확도입니다. 다음 포스팅 부터는 모델을 실제 세계에 배포한 것들에 대해 알아보겠습니다. 실제 데이터 세트를 전 처리하고 비즈니스 사례를 해결합니다.

반응형