SW/딥러닝

44. 딥러닝 : MNIST 분류 예제, 구현 : 데이터 전처리

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

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

 

훈련 데이터와 테스트 데이터를 추출하겠습니다. 운이 좋게도, 이를 달성하는 데 도움이 되는 참조가 내장되어 있으므로 mnist_train, mnist_test에 동일한 데이터 세트를 위와 같이 입력하여 줍니다.

기본적으로 텐서 플로우 mnist에는 훈련 및 테스트 데이터 세트가 있습니다. 그러나 유효성 검사 데이터 세트는 없습니다. 확실히 그것은 텐서플로우 데이터 세트 모듈의 더 짜증나는 속성 중 하나이지만 실제로 데이터 세트 분할을 실제로 연습 할 수 있는 기회를 제공합니다.

훈련 데이터 세트가 테스트 데이터 세트보다 훨씬 큽니다. 따라서 train 데이터 세트에서 검증 데이터를 가져옵니다. 이를 수행하는 방법은 훈련 데이터 세트의 임의 비율을 유효성 검사로 사용합니다. 그러므로 10 %를 가져와서 유효성 검사 샘플 수를 설정하는 것으로 시작해야합니다. 따라서 유효성 검사 샘플 수는 0.1과 같습니다.

즉, 훈련 샘플의 수를 계산할 수 있거나 이전에 생성한 복사한 변수를 사용할 수 있습니다  mnist_info.splits['train']을 작성하여 샘플 수를 추출 할 수 있는 정보를 쉽게 사용할 수 있으므로 후자를 선택합니다.

그래서 훈련 샘플의 수를 10으로 나눈 것과 같은 숫자를 얻을 것입니다. 이것이 실제로 가능한 검증 샘플 수가 아닌 10000.2일 수 있지만 정수가 될지 확신하지 못합니다. 이 문제를 쉽게 해결하기 위해 TF cast number of validation samples TF int 64로 numberof validation samples 변수를 재정의 할 수 있습니다.

그러면 유효성 검사 샘플 수 변수에 저장된 값을 정수로 캐스팅하여 잠재적인 문제를 방지 할 수 있습니다. 또한 테스트 샘플 수와 전용 변수를 저장합니다. mnist_info에 포함되어 있습니다. 하지만 이 정보에 더 쉽게 액세스 할 수 있는 것을 선호합니다.

일반적으로 결과를 수치 적으로 더 안정적으로 만들기 위해 어떤 방식으로든 데이터를 스케일링해야 합니다. 이 경우 단순히 0과 1 사이의 입력을 선호합니다. 이렇게하면 스케일링할 함수를 정의하겠습니다. 복사 이미지와 레이블을 가져 와서 매개 변수 이미지와 레이블이 있는 def scale을 전처리 합니다.

모든 값이 float인지 확인하여 이미지 로컬 변수를 float 32로 캐스트합니다. 다음으로 진행합니다. 이미 논의했듯이 복사 이미지에는 255개의 회색 음영을 나타내는 0에서 250 개의 값이 포함되어 있으므로 각 요소를 250 개로 나누면 원하는 결과를 얻을 수 있습니다. 모든 요소는 0과 1 사이가 됩니다. 따라서 이미지를 255로 나누면 끝의 점이 다시 한 번 결과가 부동 소수점이 되기를 원한다는 것을 의미합니다.

마지막으로 이미지와 원래 레이블을 반환해야합니다. 이것은 매우 특별한 function Map이라는 텐서플로우 함수가 있어 주어진 데이터 세트에 사용자 지정 변환을 적용 할 수 있습니다. 또한 이 맵은 입력과 레이블을 가져와 입력과 레이블을 반환 할 수 있는 변환만 적용 할 수 있습니다.

이것이 스케일 함수를 이런 방식으로 구축 한 것입니다. 적합하다고 생각되면 다른 방법으로 데이터를 스케일링 할 수 있습니다. 함수가 이미지와 레이블을 취하고 이미지와 레이블을 반환하는지 확인합니다. 그러면, 값을 좋게 변환하는 것입니다.

문제를 해결하기 위해 이것을 어떻게 구현해야 할까요? 이미 MNIST 훈련 데이터에서 검증 데이터를 가져 와서 스케일한 훈련데이터와 검증 데이터가과 같도록 합니다. 학습 데이터와 검증 데이터와 동일한 규모가 되도록 테스트 데이터를 확장 해 볼 수 있습니다.

여기에서 마무리하고 다음 포스팅에서는 전처리에 대해서 더 알아보도록 하겠습니다.

반응형