데이터분석-머신러닝-AI/강의 정리

[혼자 공부하는 머신러닝+딥러닝] 21강. 합성곱 신경망을 사용한 이미지 분류 - 패션 mnist를 이용한 분류 코딩 학습

bluebamus 2023. 11. 26.

https://www.youtube.com/watch?v=WuHD9yUuTDk&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=23

 

 

 - 패션 mnist 데이터 불러오기

   - 케라스는 3차원 데이터로 입력을 받기 때문에 28 x 28 이미지를 28 x 28 x 1로 정의해 준다.

   - (28000, 28, 28) 크기의 3차원 train_input을 255로 나누어 정규화 작업을 실행한다.

from tensorflow import keras
from sklearn.model_selection import train_test_split

(train_input, train_target), (test_input, test_target) = \
    keras.datasets.fashion_mnist.load_data()

train_scaled = train_input.reshape(-1, 28, 28, 1) / 255.0

train_scaled, val_scaled, train_target, val_target = train_test_split(
    train_scaled, train_target, test_size=0.2, random_state=42)

 

 - 합성곱 신경망 만들기

   - 첫 번째 합성곱 

   - (28, 28, 1)의 입력 데이터를 (3, 3, 1) 필터 32개를 사용해 특성맵을 만들고 풀링 하여 값들을 절반으로 줄인다.

      - 채널 차원의 개수는 필터의 개수와 같다.

model = keras.Sequential()

model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape=(28,28,1)))
model.add(keras.layers.MaxPooling2D(2))

 

 - 두 번째 합성곱 + 완전연결층

   - flatten()을 이용해 3차원 특성맵을 1차원 열로 만든다.

model.add(keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu', padding='same'))
model.add(keras.layers.MaxPooling2D(2))

# 3차원 특성맵을 1차원으로 만든다.
model.add(keras.layers.Flatten())
# 은닉층
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dropout(0.4))
# 출력층
model.add(keras.layers.Dense(10, activation='softmax'))

keras.utils.plot_model(model, show_shapes=True)


 - 모델 정보 확인

model.summary()

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 28, 28, 32)        320       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 14, 14, 32)       0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 14, 14, 64)        18496     
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 7, 7, 64)         0         
 2D)                                                             
                                                                 
 flatten (Flatten)           (None, 3136)              0         
                                                                 
 dense (Dense)               (None, 100)               313700    
                                                                 
 dropout (Dropout)           (None, 100)               0         
                                                                 
 dense_1 (Dense)             (None, 10)                1010      
                                                                 
=================================================================
Total params: 333,526
Trainable params: 333,526
Non-trainable params: 0
_________________________________________________________________

 

 - 모델 구성 이미지로 확인

keras.utils.plot_model(model)

keras.utils.plot_model(model, show_shapes=True)

 

 - 모델 컴파일과 훈련

   - adam 옵티마이저를 사용하고, metrics='accuracy'를 정의하여 정확도를 함께 출력한다.

   - 검증세트의 조기종료를 2 에포크로 정의하고 가장 낮은 2 에포크 이전에 복원하도록 restore_best_weights를 정의한다.

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
              metrics='accuracy')

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-cnn-model.h5',
                                                save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,
                                                  restore_best_weights=True)

history = model.fit(train_scaled, train_target, epochs=20,
                    validation_data=(val_scaled, val_target),
                    callbacks=[checkpoint_cb, early_stopping_cb])

 

   - 그래프로 결과 확인

      - 9번째 애포크에서 종료하는 것을 확인할 수 있다.

      - 7번째 애포크 이후 검증세트가 지속적으로 증가하며 과대적합 한 것으로 볼 수 있다.

import matplotlib.pyplot as plt

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

 - 평가와 예측

   - 손실은 0.2, 정확도는 92%이다.

model.evalutae(val_scaled, val_target)
# loss : 0.2118 - accuracy : 0.9212

 

   - 1 x 28 x 28 x 1의 이미지를 predict 해본다.

plt.imshow(val_scaled[0].reshape(28,28), cmap='gray_r')
plt.show()

 

   - 예측 확률은 총 10개가 나오며 이 중 9번째 항목이 거의 1에 근접하다. (가방)

preds = model.predict(val_scaled[0:1])
print(preds)

1/1 [==============================] - 0s 118ms/step
[[4.0748841e-15 2.2528982e-23 1.1966817e-18 3.3831836e-18 3.4746105e-17
  1.5839887e-14 1.3949707e-13 3.1241570e-14 1.0000000e+00 7.2195376e-16]]
plt.bar(range(1, 11), preds[0])
plt.xlabel('class')
plt.ylabel('prob.')
plt.show()

classes = ['티셔츠', '바지', '스웨터', '드레스', '코트',
           '샌달', '셔츠', '스니커즈', '가방', '앵클 부츠']
           
import numpy as np
print(classes[np.argmax(preds)])

가방

 

 - 테스트 세트 점수

test_scaled = test_input.reshape(-1, 28, 28, 1) / 255.0

model.evaluate(test_scaled, test_target)

313/313 [==============================] - 1s 3ms/step - loss: 0.2338 - accuracy: 0.9157
[0.23381413519382477, 0.9157000184059143]

 

 

 

 - reference : 

https://wonin.tistory.com/155?category=991866

 

21강 합성곱 신경망을 사용한 이미지 분류

이 글은 https://www.youtube.com/watch?v=WuHD9yUuTDk&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=21 보고 공부한 글 입니다. 패션 MNIST 데이터 합성곱 신경망은 2d이미지를 그대로 상용해도 된다. 케라스는 3차원 데이

wonin.tistory.com

https://velog.io/@clayryu328/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EB%94%A5%EB%9F%AC%EB%8B%9D-7

 

[혼자 공부하는 머신러닝+딥러닝] #7 합성곱 신경망

합성곱 신경망을 알아보자.

velog.io

 

댓글