SW/딥러닝

46. 딥러닝 : MNIST : 훈련을 위해 데이터를 모델링 하는 방법, 예제

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

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

 

지금까지 데이터를 로드하고 사전 처리했습니다. 다음 단계는 모델의 윤곽을 그리는 것이므로 텐서 플로우의 도입을 다시 검토해야한다고 생각되면 여기에서 일시 중지하는 것을 고려해야 합니다.

두 연습의 유사점을 더 쉽게 볼 수 있고 무엇을 기대할 수 있는지 알 수 있습니다. 이전 비디오에서 설명한대로 논리를 따르는 그림을 그리는 것으로 시작하겠습니다. 784 개의 입력이 있습니다. 이것이 입력 레이어입니다. 각 자릿수에 하나씩 10 개의 출력 노드가 있습니다.

각각 50 개의 노드로 구성된 두 개의 은닉 레이어로 작업 할 것입니다. 네트워크의 너비와 깊이는 하이퍼 매개 변수입니다. 이 문제에 대한 최적의 너비와 깊이를 선택했지만 지금 선택한 것이 차선책이라는 것을 확실히 알고 있습니다.

어쨌든 모델의 하이퍼 매개 변수를 미세 조정하고 개선된 결과를 얻을 수 있습니다. 너비에 대한 세 가지 변수를 선언하십시오. 출력과 히든 레이어를 넣습니다. INPUTSIZE IS 784 출력 크기는 10 이고 히든 레이어 크기는 50이므로 모든 히든 레이어의 크기는 동일합니다. 또는 히든 레이어를 생성 할 수 있습니다.

다음으로 실제 모델을 정의해야합니다. 다시 한 번 모델 모델은 동일합니다. 첫 번째 레이어는 입력 레이어입니다.  데이터는 각 관측 값이 28 x 28 x 1 텐서가 되도록 하는 것입니다. CNN ID를 모르기 때문에 이미 논의했듯이 이미지를 벡터로 평탄화해야합니다.

그리고 딥 러닝이라는 전용 방법이 있으므로 flatten은 레이어 모듈의 일부이며 평평하게 만들고자 하는 객체의 모양을 변형하거나 더 구체적으로 벡터로 평평하게 만듭니다. 계층은 평탄화되어 입력 모양은 28 x 28 x 1을 나타냅니다. 따라서 지금까지 과정에서 논의한 것과 동일한 종류의 피드 포워드 신경망에 대한 데이터를 준비했습니다.

다음 단계는 신경망을 구축하는 것입니다. tensor flow intro 모델과 매우 유사한 방식으로 레이어 밀도를 사용하여 각 연속 레이어를 만듭니다. 레이어 밀도가 기본적으로 입력 및 가중치의 내적을 찾아 편향을 추가하는 것임을 상기해야 합니다.

이를 바탕으로이 표현식에 활성화 함수를 적용 할 수 있습니다. 이것이 지금까지 논의한 내용입니다. 이론적으로 구현 방법을 살펴볼 때입니다. 레이어 밀도는 인수를 수학 연산의 출력 크기로 가져옵니다. 이 경우 입력에서 첫 번째 은닉층으로 이동하므로 첫 번째 수학적 연산의 출력은 두 번째 인수로 첫 번째 은닉층의 모양을 갖습니다.

활성화 함수를 포함 할 수 있습니다. ReLu가 이 문제에 대해 매우 잘 작동한다는 것을 알고 있기 때문에 사용할 것입니다. 실제로 각 신경망은 활성화 기능의 최적 조합이 다릅니다. 쉼표를 배치하여 줄을 끝냈습니다. 지금까지 평평한 입력과 첫 번째 숨겨진 레이어를 가지고 있으며 같은 방식으로 두 번째 숨겨진 레이어를 만들 수 있습니다.

레이어 밀도와 지정한 괄호 안에 두 번째 은닉층의 크기와 활성화 함수. 다시 한 번 변수 은닉층 크기와 수정 된 선형 단위 또는 다시 실행됩니다. 모델의 윤곽을 그리는 것은 놀이입니다. 이 구조를 사용하는 것 또한 공부의 일부입니다.

마지막 레이어는 출력 레이어입니다. 구문 측면에서 다르지 않습니다. 아마도 짐작했듯이 덴스를 사용하여 생성합니다. 이번에는 히든 레이어 크기보다 출력 크기를 지정합니다. 다이어그램에서 볼 수 있듯이 활성화는 이론적 교훈을 보면 분류기를 만들 때 출력 레이어의 활성화 함수가 값을 확률로 올바르게 변환해야한다는 것을 알고 있습니다. 따라서 소프트 맥스를 선택해야합니다.

간단한 모델은 구축하였습니다. 다음 포스팅에서는 직접 훈련을 진행해보록 하겠습니다.

반응형