image-right





Keras MNIST, 인공신경망 구성



도입

  • mnist 데이터로 인공신경망 만들기
  • 간단한 인공신경망을 구성하며 딥러닝과 친해지자



데이터 준비

데이터 읽어오기

# 데이터를 불러온다
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
print(f"{x_train.shape}, {y_train.shape}, {x_test.shape}, {y_test.shape}")
(60000, 28, 28), (60000,), (10000, 28, 28), (10000,)
  • mnist 데이터는 keras 라이브러리를 통하여 손쉽게 불러올 수 있다.
  • load_data() 메써드는 넘파이 튜플을 반환한다.
  • 학습데이터는 60,000개, 평가데이터는 10,000개이다.
  • 28픽셀의 흑/백 특성을 담고 있다.

데이터 살펴보기

attention_idx = 2000
x_train[attention_idx][10]
array([  0,   0,   0,   0,   0,   0,   0,   0,   0,  92, 255, 254, 254,
       119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
         0,   0], dtype=uint8)
  • 훈련데이터 2,000번 인덱스의 특성을 살펴보면 0~255까지의 정수로 이루어져있다.

  • 특성 데이터를 시각화 해보면 다음과 같은 숫자 손글씨임을 확인할 수 있다.

label_list = list(np.unique(y_test))

fig, ax = plt.subplots(figsize=(10,10))

for i, val in enumerate(range(attention_idx-10,attention_idx+10)):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(x_train[val], cmap=plt.cm.binary)
    plt.xlabel(label_list[y_train[val]])
plt.show()

image-right

데이터 전처리

x_train, x_test = x_train / 255, x_test / 255 # Normalization
x_train[attention_idx][10] # 2,000번 인덱스 살펴보기
  • 데이터를 255로 나누어 0~1사이의 수로 정규화(Normalization)한다.
  • 정규화 하는 이유?
    • 0~1 사이로 맞추어 계산 값이 너무 커지는 것을 방지
    • Local Minimun에 빠지는 것을 방지(학습 속도 향상)





모델링

인공신경망 구성

model = tf.keras.models.Sequential([
  Flatten(input_shape=(28, 28)),
  Dense(128, activation='relu'),
  Dropout(0.2),
  Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
  • 28픽셀이 흑백 이기 때문에 입력특성에는 (28, 28)로 입력한다.
  • 은닉층의 노드는 128, 활성화 함수는 relu로 설정
  • 과적합을 막기위하여 Dropout 0.2 설정
  • 출력은 0~9까지의 숫자이기 때문에 10, 다중분류 함수인 softmax로 설정

신경망 학습

model.fit(x_train, y_train, epochs=5)

model.evaluate(x_test,  y_test, verbose=2)
313/313 - 0s - loss: 0.0724 - accuracy: 0.9775 - 488ms/epoch - 2ms/step
[0.0723787322640419, 0.9775000214576721]
  • 5번 순전파와 역전파를 반복하며 신경망을 학습
  • 평가 데이터에 대하여 Accuracy를 반환
  • 정확도 약 97.8%
  • 혼돈행렬(Confusion Matrix)을 확인해보면 대부분 맞춘 것을 확인 할 수 있다.

image-right

모델 확인

probability_model = tf.keras.Sequential([
  model,
  tf.keras.layers.Softmax()
])

pred_list = probability_model(x_train[attention_idx:attention_idx+1])
predictions_train = probability_model.predict(x_train)
predictions_test = probability_model.predict(x_test)
pred_list
1875/1875 [==============================] - 2s 1ms/step
313/313 [==============================] - 0s 1ms/step
<tf.Tensor: shape=(1, 10), dtype=float32, numpy=
array([[0.09005527, 0.08849514, 0.08866849, 0.08850201, 0.08851673,
        0.1622487 , 0.12685911, 0.08853356, 0.08893044, 0.08919058]],
      dtype=float32)>
  • 훈련데이터 2,000번 인덱스의 모델추정 결과 0,1,2,3,4일 확률은 약9%, 5일 확률은 약16%, 6일 확률은 약12.7%, 7,8,9일 확률은 약9%
np.argmax(predictions_train[attention_idx])
# 5
  • 결국 모델의 선택은 5!!

  • 훈련데이터 2,000번 인덱스를 확인해보면

plt.figure()
plt.imshow(x_train[attention_idx], cmap='gray_r')
plt.colorbar()
plt.grid(False)
plt.show()

image-right

  • 2,000번의 라벨을 확인해보면 5가 맞음
y_train[attention_idx]
# 5





끝까지 읽어주셔서 감사합니다😉





댓글남기기