Keras 딥 러닝 - 신경망 모델 성능에 대한 입력 값 분포의 영향

함께 쓰는 습관을 들이세요! "너겟 데일리 뉴플랜 · 4월 업데이트 챌린지" 참여 11일차입니다. 클릭하시면 이벤트 내용을 보실 수 있습니다 .

모델 성능에 대한 입력 값 분포의 영향

우리는 높은 정확도로 손으로 쓴 숫자를 인식할 수 있었지만 데이터 세트의 값 분포를 MNIST살펴보지 으며 입력 값의 다양한 분포가 훈련 속도를 변경할 수 있습니다. 이 섹션에서는 훈련 시간을 줄이기 위해 입력 값을 수정하여 가중치를 더 빠르게 훈련시키는 방법을 알아봅니다. 입력 데이터 세트에 약간의 변경을 가하여 원래 신경망 과 정확히 동일한 모델 아키텍처를 구축합니다 .

  • 배경색과 전경색을 반전시킵니다. 기본적으로 배경을 흰색으로, 숫자를 검정색으로 칠합니다.

먼저 모델 성능에 대한 픽셀 값의 영향을 이론적으로 분석합니다. 검은색 픽셀 값이 0이므로 이 입력에 가중치 값을 곱하면 출력은 0입니다. 이것은 히든 레이어에 연결된 블랙 픽셀의 가중치 값이 손실 값에 영향을 주지 않고 변경되도록 합니다. 그러나 흰색 픽셀이 있으면 일부 숨겨진 노드 값에 기여하고 가중치를 조정해야 합니다.

  1. 입력 데이터세트를 로드하고 확장합니다.
from keras.datasets import mnist
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import np_utils
import matplotlib.pyplot as plt

(x_train, y_train), (x_test, y_test) = mnist.load_data()

num_pixels = x_train.shape[1] * x_train.shape[2]
x_train = x_train.reshape(-1, num_pixels).astype('float32')
x_test = x_test.reshape(-1, num_pixels).astype('float32')
x_train = x_train / 255.
x_test = x_test / 255.

y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
复制代码
  1. 입력 값의 분포를 참조하십시오.
x_train.flatten()
复制代码

앞의 코드는 모든 입력을 ( 28 × 28 × 엑스 _ t r a i n . s h a p e [ 0 ] = 47040000 28\times 28 \times x\_train.shape[0]=47040000 ) 목록. 모든 입력 값의 분포를 플로팅합니다.

plt.hist(x_train.flatten())
plt.title('Histogram of input values')
plt.xlabel('Input values')
plt.ylabel('Frequency of input values')
plt.show()
复制代码

입력 이미지의 배경이 검은색이므로 입력의 대부분은 0(검은 픽셀 값)입니다.

데이터 값 분포

  1. 다음 코드를 사용하여 배경이 흰색이고 숫자가 검정색이 되도록 색상을 반전합니다.
x_train = 1-x_train
x_test = 1-x_test
复制代码

이미지 그리기:

plt.subplot(221)
plt.imshow(x_train[0].reshape(28,28), cmap='gray')
plt.subplot(222)
plt.imshow(x_train[1].reshape(28,28), cmap='gray')
plt.subplot(223)
plt.imshow(x_test[0].reshape(28,28), cmap='gray')
plt.subplot(224)
plt.imshow(x_test[1].reshape(28,28), cmap='gray')
plt.show()
复制代码

다음과 같이:반전된 이미지

색상 반전 후 결과 이미지의 히스토그램은 다음과 같습니다.

데이터 값 분포

보시다시피 대부분의 입력 값은 이제 1의 값을 갖습니다.

  1. 이전과 정확히 동일한 모델 아키텍처를 사용합니다.
model = Sequential()
model.add(Dense(1000, input_dim=num_pixels, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])

history = model.fit(x_train, y_train,
                    validation_data=(x_test, y_test),
                    epochs=50,
                    batch_size=64,
                    verbose=1)
复制代码

다양한 훈련 및 테스트에 epoch대한 .

정확도 및 손실 값의 변화

모델 정확도가 100%로 떨어지는 것을 볼 수 있습니다 97%. 대조적으로, 데이터 세트가 반전되지 않은 경우(데이터 세트의 데이터 값은 대부분 0임), 동일한 epoch숫자 하여, 훈련으로 얻은 모델의 정확도는 대략 98%입니다. 픽셀 값 반전(데이터 세트에서 더 적은 데이터 값 0) 97%및 훈련 프로세스의 경우 모델의 정확도는 대부분의 입력 픽셀이 0인 경우보다 훨씬 느립니다. 대부분의 픽셀이 0일 때, 0보다 큰 픽셀 값을 가진 소수의 픽셀 값을 기반으로 예측만 하면 되므로 모델 훈련이 더 쉽습니다. 그러나 대부분의 픽셀이 0이 아닌 경우 손실 값을 줄이기 위해 더 많은 가중치를 미세 조정해야 합니다.

관련된 링크들

Keras 딥 러닝 - 원시 신경망 훈련

Keras 딥 러닝 - 입력 데이터 세트를 확장하여 신경망 성능 향상

추천

출처juejin.im/post/7086047828643938340