SW/딥러닝

48. 딥러닝 : MNIST : 데이터 나누어서 훈련 진행, 예제, 구현

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

48. 딥러닝 : 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))

 

데이터를 동일하게 전처리를 진행합니다. 데이터를 적절히, 훈련, 테스트, 검증으로 분류합니다. 해당 예제는 다른 데이터에서도 충분히 활용할 수 있는 내용이므로, 참조하셔도 좋을 것 같습니다. 구체적인 내용은 이전 포스팅을 참조해주세요.

 

 

 

모델링

input_size = 784
output_size = 10
hidden_layer_size = 50
    
model = tf.keras.Sequential([
    
    tf.keras.layers.Flatten(input_shape=(28, 28, 1)), # input layer
    
    tf.keras.layers.Dense(hidden_layer_size, activation='relu'), # 1st hidden layer
    tf.keras.layers.Dense(hidden_layer_size, activation='relu'), # 2nd hidden layer
    
    tf.keras.layers.Dense(output_size, activation='softmax') # output layer
])

 

기초적인 모델링을 진행합니다. 해당 내용에 대해서는 이전에 다루어 보았습니다. 예제인 만큼, 복잡한 모델링까지는 필요하지 않았습니다. 

 

 

 

모델 컴파일 

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)

 

머신 러닝 프로세스 훈련의 가장 흥미로운 부분에 도달했습니다. 여기서 구축한 모델을 맞추고 이것이 실제로 작동하는지 먼저 살펴 보겠습니다. 훈련하고자 하는 epoch의 수를 저장하는 변수를 생성하겠습니다. num epochs라고 부르고 임의로 5로 설정하겠습니다.

다음으로 tensor flow intro와 비슷한 모델을 맞출 수 있습니다. 우리는 fit 메서드를 사용하여 점에 맞는 브래킷을 모델링합니다. 먼저 데이터를 지정합니다. 이 경우 데이터를 훈련합니다. 두 번째로 우리는 epochs가 num epochs와 같도록 epoch의 수를 설정합니다.

버퍼 크기, 배치 크기, 입력 크기, 출력 크기를 찾고 코드를 디버깅 할 때 쉽게 발견 할 수있는 전용 변수를 생성하는 것을 선호합니다. 이것만으로도 모델을 훈련시키기에 충분합니다. 그러나 우리는 또한 올바른 유효성을 검사해야합니다. 검증 데이터를 준비했지만 이전에 생성한 유효성 검사 입력 및 유효성 검사 대상과 동일한 방법이라는 인수로 포함됩니다.

마지막으로 Epoch에 대한 가장 중요한 정보만 수신하도록 verbose를 2로 설정합니다. 각 시대가 시작될 때 커튼 뒤에서 일어날 것으로 예상되는 작업을 설명합니다. 훈련 손실은 0으로 설정됩니다. 알고리즘은 훈련 세트에서 모두 추출 된 사전 설정된 배치 수를 반복합니다. 본질적으로 전체 훈련 세트가 활용됩니다. 따라서 가중치와 편향은 각 Epoch가 끝날 때 배치가 있는만큼 여러 번 업데이트됩니다.

훈련이 어떻게 진행되고 있는지 나타내는 손실된 함수에 대한 값을 얻을 것입니다. 추가한 마지막 인수 덕분에 epoch가 끝날 때 알고리즘은 최적화 된 모델을 통해 전체 검증 데이터 세트를 단일 배치로 전달하고 검증 정확도를 계산합니다. 훈련이 끝날 최대 epoch 수입니다. 이제 코드를 실행해보겠습니다.

 

 

 

훈련 결과

Epoch 1/5
540/540 - 6s - loss: 0.3206 - accuracy: 0.9105 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 2/5
540/540 - 5s - loss: 0.1344 - accuracy: 0.9604 - val_loss: 0.1131 - val_accuracy: 0.9680
Epoch 3/5
540/540 - 5s - loss: 0.0969 - accuracy: 0.9710 - val_loss: 0.0972 - val_accuracy: 0.9745
Epoch 4/5
540/540 - 5s - loss: 0.0752 - accuracy: 0.9776 - val_loss: 0.0841 - val_accuracy: 0.9745
Epoch 5/5
540/540 - 5s - loss: 0.0609 - accuracy: 0.9812 - val_loss: 0.0681 - val_accuracy: 0.9790
<tensorflow.python.keras.callbacks.History at 0x229f22494a8>

 

몇 줄의 출력이 표시됩니다. 먼저 epoch 수에 대한 정보가 있습니다. 다음으로 500이라고 표시된 배치 수를 얻습니다. 점진적으로 채워지는 진행률 표시 줄이 있는 경우 정보의 세 번째 부분은 내 컴퓨터에서 시대가 끝나는 데 걸린 시간이기 때문에 5 40개 당 5 ~ 6 초 정도입니다.

다음으로 훈련 손실을 볼 수 있습니다. 개별적으로 조사하는 것은 이치에 맞지 않습니다. Epoch에 따른 훈련 손실과 비교해야합니다. 이 경우 대부분 감소하고 있습니다. 첫 번째 훈련 이후 이미 각 배치에 대해 하나씩 550 개의 서로 다른 가중치 및 편향 업데이트를 수행했습니다. 다음은 보여주는 정확도와 출력이 목표와 동일한 경우의 비율입니다.

손실. 결국 출력이 목표와 얼마나 잘 일치하는지 나타냅니다. 마침내 유효성 검사 데이터 세트에 대한 손실과 정확도를 얻었습니다. 일반적으로 모델이 유효성 검사 정확도를 과도하게 맞추는 지 확인하기 위해 유효성 검사 손실을 주시합니다. 다른 한편으로는 epoch에 대한 모델의 실제 정확도입니다. 이는 훈련 정확도가 배치 전체의 평균 정확도이기 때문입니다.

검증 정확도는 전체 검증 세트의 정확도이지만 모델의 전체 정확도를 평가하는 데 좋습니다. 마지막에 대한 유효성 검사 정확도는 97%입니다. 놀라운 결과입니다. 더 잘할 수 있습니다. 모델을 조금 조작 해보겠습니다. 많은 하이퍼 매개 변수를 변경할 수 있지만 레이어의 각 세트에 있는 50 개 노드 대신 숨겨진 레이어 크기에서 시작합니다.

 

 

 

정리

모델의 정확도를 대폭 향상시킬 수 있습니다. 잠시 시간을 내어 이 결과를 직접 진행해봅니다. 손으로 쓴 구불 구불 한 얼룩이 구부러진 숫자의 7만 장의 사진이 있었고, 어떤 숫자를 인식하는 알고리즘을 작성하였습니다. 이제 코드 몇 줄만으로 100 중 97 ~ 98의 정확도를 얻는 알고리즘을 작성했습니다.

단순한 모델을 고려할 때 놀라운 정확성을 보여주고 있습니다. 훈련에 대한 tensor flow로 92 %의 정확도를 가진 모델을 보여주면 좋은 결과는 아닙니다. 그것은 꽤 나쁜 수준의 성능입니다. 모델을 조금 더 복잡하게 하면 99 %의 정확도를 달성할 수 있었습니다.

반응형