입력된 이미지의 특징을 잘 추출해서 인식하기 위한 방법이 바로 컨볼루션 신경망...!
어려워 보이지만 얘 또한 개념이 어려운건 아니고, 행렬 기준으로 구획화를 특정한 방식으로 진행하며 특징을 잡아내는거가 메인이다.
#5-16. 컨볼루션 신경망 (CNN)
이미지 인식 방법 (w/MNIST)
#먼저 손글씨 데이터를 keras에서부터 가져오고, 기존에 할당된대로 train, test 데이터로 분류한다.
from tensorflow.keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
print("학습셋 이미지수: %d개" % (X_train.shape[0]))
print("테스트셋셋 이미지수: %d개" % (X_test.shape[0]))
|
학습셋 이미지수: 60000개 테스트셋셋 이미지수: 10000개
#어떤 손글씨인지 확인해보자..X_train에는 손글씨 데이터들이 행렬형태로 각각 저장되어있다. 이 중 첫번째 손글씨를 확인했다
import matplotlib.pyplot as plt
plt.imshow(X_train[0], cmap='Greys')
plt.show()
|
# 이제 이 데이터를 행렬형태로 변환해보려면 아래와 같다. sys.stdout은 대충 print라고 보면 됨
# 위의 그래프의 색깔 넘버로 행렬이 표기되어 있다.
import sys
for x in X_train[0]:
for i in x:
sys.stdout.write("%-3s" % i)
sys.stdout.write('\n')
|
# 딥러닝 하기 위해 적합한 데이터 형태로 변경해주기
data.reshape(총샘플수, 각 차원의 속성의 개수)
X_train = X_train.reshape(X_train.shape[0], 28,28,1).astype('float64') / 255 #차원 변환. model의 input_shape과 동일
X_test = X_test.reshape(X_test.shape[0], 28,28,1).astype('float64') / 255
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train) #0~9로 되어있던 y값을 원핫인코딩으로 변환
y_test = to_categorical(y_test)
print(y_train[0])
|
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
컨볼루션 적용한 모델링
컨볼루션 사용법
model.add(Conv2D(커널 수, kerner_size = (n,n), input_shape=(행, 열, 색상), activation='relu'))
맥스풀링 사용법
model.add(MaxPooling2D(pool_size=(n,n))). #pool창의 사이즈를 정하는 것
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
import matplotlib.pyplot as plt
import numpy as np
import os
model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), input_shape=(28,28,1), activation='relu'))
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation = 'softmax'))
model.summary()
|
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param # =================================================================
conv2d_2 (Conv2D) (None, 26, 26, 32) 320
conv2d_3 (Conv2D) (None, 24, 24, 64) 18496
max_pooling2d_1 (MaxPooling (None, 12, 12, 64) 0 2D)
dropout_2 (Dropout) (None, 12, 12, 64) 0
flatten_1 (Flatten) (None, 9216) 0
dense_4 (Dense) (None, 128) 1179776
dropout_3 (Dropout) (None, 128) 0
dense_5 (Dense) (None, 10) 1290 =================================================================
Total params: 1,199,882 Trainable params: 1,199,882 Non-trainable params: 0
# 모델 컴파일 설정한 이후, 최적화를 위해 checkpoint와 학습중단을 설정해준다.
# 모델을 실행한다
# 15번째 에포크에서 실험이 중단되었다
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
modelpath = "./MNIST_MLP.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience = 10)
history = model.fit(X_train, y_train, validation_split = 0.25, epochs=30, batch_size = 200, verbose=0, callbacks=[early_stopping_callback, checkpointer])
|
Epoch 13: val_loss did not improve from 0.04038
Epoch 14: val_loss did not improve from 0.04038
Epoch 15: val_loss improved from 0.04038 to 0.03846, saving model to ./MNIST_MLP.hdf5
# 정확도가 99%가 나왔다...과적합인가...?모르겠다...
print("\n Test Accuracy : %.4f" % (model.evaluate(X_test,y_test)[1]))
|
313/313 [==============================] - 8s 24ms/step - loss: 0.0333 - accuracy: 0.9919
# ...그래프로보니 더 이상하다...뭐가잘못된걸까...?ㅎ... 책에서도 정확도가 99.17이 나온걸 보니 틀린거같진않은데...뭘까...
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c='red', label = 'Testset_loss')
plt.plot(x_len, y_loss, marker='.', c='blue', label = 'Trainset_loss')
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
|
'👩💻LEARN : ML&Data > Book Study' 카테고리의 다른 글
[모두의 딥러닝]#5-18. 순환신경망 (RNN) (0) | 2023.02.24 |
---|---|
[모두의 딥러닝] #5-17. 자연어 처리 (0) | 2023.02.24 |
[모두의 딥러닝] #4-15. 실제 데이터로 만들어보는 모델 (선형회귀) (0) | 2023.02.20 |
[모두의 딥러닝] #4-14. 모델 성능 향상시키 (0) | 2023.02.20 |
[모두의 딥러닝] #4-13. 모델 성능 검증하기 (0) | 2023.02.19 |