SW/딥러닝

45. 딥러닝 : MNIST : 훈련을 위해 데이터를 분류하는 방법, 구현

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

 

패키지 임포트 

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))

 

먼저 데이터를 섞은 다음, 유효성 검사 데이터 세트를 만드는 것이 적용하고 싶은 약간의 기술입니다. 셔플링을 할 때 사전 처리 단계에서는 기본적으로 동일한 정보를 유지하지만 순서가 다를 수 있습니다. 오름차순으로 저장되어 첫 번째 X 배치는 대상이 0 개이고 다른 배치는 대상이 하나뿐입니다.

데이터를 섞는 것이 좋으므로 가능한 한 무작위로 분산되어 일치가 작동하도록 합니다. 관련없는 예를 들어 보겠습니다. 데이터가 정렬되어 있고 각 배치에 주어진 숫자만 포함되어있는 10 개의 배치가 있다고 가정하여 첫 번째 배치에는 0만 있고 두 번째 배치에는 2, 세 번째에만 3 등이 있습니다.

그래디언트 디센트 알고리즘은 각 배치가 내부에서 균질하지만 다른 모든 배치와 완전히 다르기 때문에 손실이 크게 다르기 때문에 데이터를 셔플해야합니다. 이 버퍼 크기 매개 변수는 엄청난 데이터 세트를 처리하는 경우에 사용됩니다. 이러한 경우 모든 데이터 세트를 모두 맞출 수 없기 때문에 한 번에 전체 데이터 세트를 섞을 수 없습니다.

그래서 대신에 텐서 플로우에 한 번에 10,000 개의 샘플을 셔플하고 다음 1 만개를 취하도록 지시해야 합니다. 논리적으로 버퍼 크기를 2 만개로 설정하면 한 번에 2 만개의 샘플을 취하게 됩니다. 버퍼 크기가 1과 같으면 실제로 셔플링이 발생하지 않으므로 버퍼 크기가 총 샘플 수보다 크거나 같으면 한 번에 셔플링이 발생하고 균일하게 셔플링됩니다.

하나와 총 샘플 크기는 컴퓨터의 계산 능력을 최적화 할 것입니다. 셔플을 수행 할 적절한 시간입니다. 다행히도 쉽게 사용할 수있는 셔플 방법이 있으며 버퍼 크기를 지정하기만하면 됩니다. 데이터는 버퍼 크기를 인수로 사용하여 데이터를 스케일링하고 셔플하면 실제로 훈련 및 검증 데이터 세트를 추출 할 수 있습니다.

검증 데이터는 훈련의 10 %와 같습니다. 이미 계산하여 num 개의 검증 샘플에 저장 한 set을 사용하여 많은 샘플을 추출하여 검증 데이터가 셔플 트레인과 같고 검증 데이터가 검증 샘플의 수를 취하도록 할 수 있습니다. 동일한 방식으로 검증 데이터 세트를 성공적으로 생성했습니다.

모든 요소를 ​​추출하여 훈련 데이터를 생성 할 수 있지만 첫 번째 X 유효성 검사 샘플이 있습니다. 많은 배치 경사 하강 법을 사용하여 모델을 교육 할 것입니다. 정확도와 속도의 균형이 최적이므로 딥 러닝을 수행하는 가장 효율적인 방법입니다. 배치 크기를 설정하고 배지를 위해 데이터를 준비해야합니다.

빠른 메모리 새로 고침으로 배치 크기 1은 확률적 경사 하강과 같고 배치 크기는 샘플 수와 같은 배치 크기는 지금까지 본 경사 하강과 같습니다. 그래서 데이터 세트와 관련하여 상대적으로 작은 숫자를 원하지만 합리적으로는 높은 숫자를 사용하게 됩니다. 그래서 근본적인 의존성을 보존 할 수 있게 해주는 것은 100으로 했는데, 이는 미세 조정할 때 사용할 수 있는 또 다른 하이퍼 매개 변수입니다.

알고리즘에는 데이터 세트에서 연속 요소를 배치로 결합하는 데 사용할 수있는 메서드가 있습니다. 방금 생성한 훈련 데이터로 시작하겠습니다. 이 데이터의 버전을 보존 할 필요가 없기 때문에 간단히 덮어 쓰겠습니다. 그것은 패치되지 않았습니다. 따라서 훈련 데이터는 훈련 데이터 배치와 같고 괄호 안에 배치 크기 변수를 지정하면 텐서에 새 열이 추가되어 각 배치에서 몇 개의 샘플을 가져와야 하는지 모델에 표시합니다.

검증 데이터를 역전파하는 것이 아니라 순전파만 할 것이기 때문에 매칭이 가중치를 업데이트하는 데 유용했다는 것을 일괄적으로 기억할 필요가 없습니다. 모든 샘플이 아니라 100개 샘플과 같은 배치 당 한번만 가능합니다. 따라서 훈련 업데이트에서 노이즈를 줄입니다. 따라서 검증하거나 테스트 할 때마다 전파하기만하면 됩니다.

일치할 때 일반적으로 검증 및 테스트 중에 평균 손실과 평균 정확도를 찾습니다. 정확한 값을 원하므로 모든 데이터를 또한 순방향 전파시에는 그다지 계산 능력을 사용하지 않으므로 정확한 값을 계산하는 데 비용이 많이 들지 않습니다. 그러나 모델은 유효성 검사 세트도 배치 형식으로 예상합니다.

배치는 총 검증 샘플 수 또는 NUM 검증 샘플과 동일한 배치 크기를 가진 단일 배치를 갖게됩니다.이 방법으로 모델이 가져와야 함을 나타내는 텐서에 새 열을 생성합니다. 전체 유효성 검사 데이터 세트를 한 번에 사용할 수 있습니다. 테스트 데이터를 처리하는 것이 좋습니다. 일괄 처리 할 필요도 없습니다. 유효성 검사 세트와 함께 사용하는 것과 동일한 접근 방식을 사용합니다.

마지막으로 유효성 검사 데이터는 훈련 및 테스트 데이터와 동일한 모양 및 객체 속성을 가져야합니다. 데이터는 편집 가능하며 두 개의 튜플 형식입니다. 따라서 유효성 검사 입력 및 대상을 적절하게 추출하고 변환해야합니다. 유효성 검사 입력 및 유효성 검사 대상에 저장하고 다음 유효성 검사 데이터와 같도록 설정합니다. 그러면 데이터 세트를 편집 할 수 있지만 다음에 데이터를 로드하지 않고 다음 배치를로드합니다. 배치가 하나뿐이므로 입력과 대상을 로드합니다.

반응형