Keras는 구글에서 제공하는
텐서 플로우 안에 포함되어있는 API인데,
텐서 플로우를 좀 더 쉽게 사용할 수 있게 해 줍니다.
따라서, 이 Keras를 이용해서 좀 더 쉽게 이미지를
분류하는 테스트를 진행할 예정입니다.
간단한 테스트를 위해서 언어는 파이썬을 사용합니다.
기본 세팅은 아래 링크를 참고해 주세요.
https://lhh3520.tistory.com/370?category=839963
신경망 훈련에서의 단계는 보통
1. 데이터 탐색
2. 모델 구성
3. 모델 훈련
4. 평가
5. 예측하기
순으로 진행이 되기 때문에,
이 순서대로 따라가면서 진행해 보겠습니다.
먼저 기본적인 세팅을 위해서
텐서 플로우와 케라스를 임포트 해줍니다.
import tensorflow as tf
from tensorflow import keras
그다음 유용한 라이브러리들도 임포트 해줍니다.
import numpy as np
import matplotlib.pyplot as plt
1. 데이터 탐색
그다음 Keras에서 제공해주는 MNIST 데이터를 불러옵니다.
mnist_data = tf.keras.datasets.mnist
# 앞에 "train_" 들어간 것들은 훈련용 데이터들..
# 앞에 "test_" 들어간 것들은 테스트용 데이터들..
(train_images, train_labels), (test_images, test_labels) = mnist_data.load_data()
데이터가 제대로 로드됐는지 확인합니다.
# (60000, 28, 28)
train_images.shape
# (60000, )
train_labels.shape
matplotlib를 이용해서 좀 더 직관적으로
확인할 수도 있습니다.
plt.figure(figsize=(10, 10))
for i in range(25):
plt.subplot(5, 5, i+1)
plt.xticks([])
plt.yticks([])
plt.imshow(train_images[i], cmap=plt.cm.binary)
plt.xlabel(train_labels[i])
plt.show()
이제 이 데이터들을 훈련하기에 적합하도록
전처리해줍니다.
train_images = train_images.astype('float32')
train_images = train_images / 255
test_images = test_images.astype('float32')
test_images = test_images / 255
위의 코드를 보면
255를 나눠주고 있는데,
이는 이미지 픽셀의 컬러 정보가 255 이기 때문에
데이터 정규화를 위함입니다.
데이터 정규화가 왜 중요한지는
추후에 확인해 볼 수 있습니다.
2. 모델 구성
다음으로 모델을 구성해 줍니다.
모델을 구성하는 데 있어서 정해진 룰은 없는 것 같지만
모델을 잘못 구성하면 과대 적합이나 과소 적합이 발생할 수 있으므로
최적화를 통해서 적절한 모델을 구성하는 것이
중요한 듯합니다.
모델을 적당히 구성해 줍니다.
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dropout(0.1),
keras.layers.Dense(10, activation=tf.nn.softmax)
])
모델 구조는 아래와 같습니다.
구성된 모델을 아래처럼
적절한 최적화 옵션을 넣고 컴파일해줍니다.
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
3. 모델 훈련
위에서 구성된 모델을 가지고
훈련을 시켜 줍니다.
model.fit(train_images, train_labels, epochs=10)
훈련을 시켜주면 일정한 주기를 가지고
훈련을 합니다.
위에서 데이터 탐색을 할 때
정규화를 위해서 255를 나눠주었던 게
이 부분에서 좀 더 훈련 효율을 높이기 위함입니다.
정규화를 해주었을 때와 하지 않았을 때의
Loss와 Acc를 비교해 보면 좀 더 쉽게 알 수 있습니다.
정규화 처리를 했을 때
Loss도 더 낮고 Acc 확률도 더 높은 것을
확인할 수 있습니다.
4. 평가
훈련이 완료되고 나면 훈련이 제대로 되었는지
테스트를 진행해 줍니다.
loss, acc = model.evaluate(test_images, test_labels)
print('Loss: {}, Acc: {}'.format(loss, acc))
Loss는 0.06 정도,
Acc는 0.98 정도로
훈련이 잘 된 것을 볼 수 있습니다.
5. 예측하기
이제 훈련된 모델을 가지고
데이터를 예측해 봅니다.
테스트 리스트의 11번째 이미지를 가지고
테스트해보겠습니다.
# (28, 28)
predict_test = test_images[10]
predict_test.shape
model.predict(predict_test)
이렇게 해준 다음 실행하게 되면
에러가 발생하는데..
ValueError: Error when checking input: expected flatten_2_input to have 3 dimensions, but got array with shape (28, 28)
말 그대로 모델의 입력값은 3차원의 배열이
필요로 하는데, 실제 입력된 값은 2차원의 배열이라서
발생하는 오류입니다.
이를 해결해 주기 위해서
테스트용 데이터에 차원을 더해서 차원을 맞춰줍니다.
# (1, 28, 28)
predict_test = np.expand_dims(predict_test, 0)
predict_test.shape
그다음 다시 예측을 해줍니다.
# 0
result = model.predict(predict_test)
np.argmax(result)
훈련된 모델은 '0'이라고 예측을 했고
실제로 텍스트를 확인해 보면
# 0
test_labels[10]
실제값도 '0' 인 것을 확인할 수 있습니다.
좀 더 쉽게 이미지로 보면..
plt.figure()
plt.imshow(test_images[10], cmap=plt.cm.binary)
plt.xlabel(test_labels[10])
plt.show
'0' 이 맞고 모델이 제대로 훈련이 되었고,
예측도 정확히 되었다는 걸 확인할 수 있습니다.
'Programming > 머신 러닝' 카테고리의 다른 글
[MLAgents][Unity] 퍼포 더 코기 최신화 (0) | 2022.08.04 |
---|---|
[머신러닝] Keras를 이용한 CNN으로 이미지 분류 (3) | 2019.06.30 |
[Mac] 아나콘다 환경에서 텐서플로 설치하기 (0) | 2019.06.07 |
[Mac] Mac에서 아나콘다 설치하는 방법 (1) | 2019.06.07 |