이 장 끝부분에 다다랐습니다. 이제 신경망의 이면에 어떤 원리가 있는지 기초적인 내용을 이해했을 것입니다. 첫 번째 예제로 다시 돌아가서 이전 절에서 배웠던 내용을 이용하여 코드를 자세하게 리뷰합시다.
먼저 입력 데이터입니다.
(train_image, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32')/255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32')/255
입력 이미지의 데이터 타입은 float32로, 훈련 데이터는 (60000, 784)크기, 테스트 데이터는 (10000, 784) 크기의 넘파이 배열로 저장됩니다.
우리가 사용할 신경망입니다.
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, ))
network.add(layer.Dense(10, activation='softmax'))
이 네트워크는 2개의 Dense층이 연결되어 있고 각 층은 가중치 텐서를 포함하여 입력 데이터에 대한 몇 개의 간단한 텐서 연산을 적용합니다. 층의 속성인 가중치 텐서는 네트워크가 정보를 정하는 곳입니다.
이제 네트워크를 컴파일하는 단계입니다.
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
categorical_crossentropy는 손실 함수입니다. 가중치 텐서를 학습하기 위한 피드백 신호로 사용되면 훈련하는 동안 최소화됩니다. 미니 배치 확률적 경사 하강법을 통해 손실이 감소됩니다. 경사 하강법을 적용하는 구체적인 방식은 첫 번째 매개변수로 전달된 rmsprop 옵티마이저에 의해 결정됩니다.
마지막으로 훈련 반복입니다.
network.fit(train_images, train_balels, epochs=5, batch_size=128)
fit 메서드를 호출했을 때 다음과 같은 일이 일어납니다. 네트워크가 128개 샘플씩 미니 배치훈련 데이터를 다섯 번 반복합니다(전체 훈련 데이터에 수행되는 각 반복을 에포크(epoch)라고 합니다). 각 반복마다 네트워크가 배치에서 손실에 대한 가중치의 그래디언트를 계산하고 그에 맞추어 가중치를 업데이트합니다. 다섯 번의 에포크 동안 네트워크는 2,345버의 그래디언트 업데이트를 수행할 것입니다(에포크마다 465번). 아마 네트워크의 손실이 충분하게 낮아져서 높은 정확도로 손글씨 숫자를 구분할 수 있을 것 입니다. 여기까지 읽었다면 이미 신경망에 대해 많이 알았을 것입니다.
댓글 없음:
댓글 쓰기