모듈 임포트, 데이터 전처리, 데이터
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%를 얻을 경우 모델 배포를 시뮬레이션하는 것입니다. 모델이 과적합하고 실제 생활에서 비참하게 실패할 것이라는 것을 확실히 알 수 있습니다.
그러나 검증 정확도에 매우 가까운 값을 얻는 것은 과적합하지 않았음을 보여줍니다. 마지막으로 테스트 정확도는 기대하는 정확도입니다. 다음 포스팅 부터는 모델을 실제 세계에 배포한 것들에 대해 알아보겠습니다. 실제 데이터 세트를 전 처리하고 비즈니스 사례를 해결합니다.
'SW > 딥러닝' 카테고리의 다른 글
51. 딥러닝 : 비즈니스 솔루션 : 필요한 절차, 사례 (0) | 2020.09.17 |
---|---|
50. 딥러닝 : 사용자 예측 사례 : 이용자가 물품을 재구매하는 지 예측 방법 (0) | 2020.09.16 |
48. 딥러닝 : MNIST : 데이터 나누어서 훈련 진행, 예제, 구현 (0) | 2020.09.14 |
47. 딥러닝 : MNIST : 모델링 및 컴파일 하는 과정, 예제, 구현 (0) | 2020.09.13 |
46. 딥러닝 : MNIST : 훈련을 위해 데이터를 모델링 하는 방법, 예제 (0) | 2020.09.12 |