딥러닝

Convolutional Neural Networks

HooSL 2022. 3. 29. 12:32

필요한 라이브러리 import

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten,Conv2D,MaxPooling2D
from tensorflow.keras.datasets import mnist
import matplotlib.pyplot as plt
(X_train,y_train),(X_test,y_test) = mnist.load_data()

이미지는 원래 컬러 이미지이므로, 1개의 이미지는 3차원 입니다.

따라서 이미지 처리를 CNN을 구성할때는, 전체 데이터셋은 4차원으로 구성해야합니다.

X_train=X_train.reshape(60000,28,28,1)
X_test=X_test.reshape(10000,28,28,1)

 

피처스케일링

X_train=X_train/255.0
X_test=X_test/255.0

 

CNN으로 모델링, 컴파일, 학습합니다.

model = Sequential()
model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu',input_shape = (28,28,1))) #첫번째는 input_shape 필수
model.add(MaxPooling2D(pool_size=(2,2),strides=2))
model.add(Conv2D(filters=64,kernel_size=(2,2),activation='relu'))
model.add(MaxPooling2D((2,2),2))
model.add(Flatten())
model.add(Dense(units=128,activation='relu'))
model.add(Dense(units=10,activation='softmax'))
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(X_train,y_train,epochs=5)

 

학습이 끝나면 테스트셋으로 정확도를 확인합니다.

model.evaluate(X_test,y_test)

 

컨퓨전 매트릭스로 어떤 것을 틀렸는지 확인합니다.

from sklearn.metrics import confusion_matrix,accuracy_score

y_pred = model.predict(X_test)
y_pred=y_pred.argmax(axis=1)

cm = confusion_matrix(y_test,y_pred)

import seaborn as sb
sb.heatmap(data=cm,annot=True,fmt='.0f',cmap='RdPu')

트레이닝셋은 93% , 테스트셋은 91% 까지 나옵니다.
에포크를 20까지 해보면, 트레이닝셋 정확도는 올라가지만 밸리데이션 정확도는 내려갑니다.

즉, 오버핏팅이 됩니다.

import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0

위에서 만든 모델을 함수로 만들겠습니다.

그리고 학습할때 에포크를 20으로 해서 학습하겠습니다.

변수는 epoch_history로 사용해서 학습

def build_model():
  model = Sequential()
  model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu',input_shape = (28,28,1)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=2))
  model.add(Conv2D(filters=64,kernel_size=(2,2),activation='relu'))
  model.add(MaxPooling2D((2,2),2))
  model.add(Flatten())
  model.add(Dense(units=128,activation='relu'))
  model.add(Dense(units=10,activation='softmax'))
  model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

  return model

모델 생성

model = build_model()

모델 학습

epoch_history = model.fit(X_train,y_train,epochs=20,validation_split=0.2)

 

Accuracy 차트

plt.plot(epoch_history.history['accuracy'])
plt.plot(epoch_history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(['Train','Validation'])
plt.show()

 

Loss 차트

plt.plot(epoch_history.history['loss'])
plt.plot(epoch_history.history['val_loss'])
plt.title('Model Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['Train','Validation'])
plt.show()

 

Visualizing the Convolutions and Pooling

import matplotlib.pyplot as plt
f, axarr = plt.subplots(3,4)
FIRST_IMAGE=0
SECOND_IMAGE=7
THIRD_IMAGE=26
CONVOLUTION_NUMBER = 1
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
for x in range(0,4):
  f1 = activation_model.predict(X_test[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[0,x].grid(False)
  f2 = activation_model.predict(X_test[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[1,x].grid(False)
  f3 = activation_model.predict(X_test[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[2,x].grid(False)

EXERCISES

1. 컨볼루션 필터 갯수를 16 또는 64로 바꿔서 정확도를 확인합니다.

2. 맨 마지막 컨볼루션 지우고 해봅니다

3. 콜백 셋팅해서 돌려봅니다.

 

모델생성

model = build_model()

 

얼리스탑핑 이용 방법

early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss',patience=5)

 

콜백 클래스 이용 방법

class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self,epoch,logs={}):
    if logs['val_accuracy'] > 0.99 :
      print('\n벨리데이션 정확도가 99%가 넘으므로, 에포크를 멈춥니다.')
      self.model.stop_training = True
my_callback = myCallback()

모델 학습

epoch_history = model.fit(X_train,y_train,epochs=20,validation_split=0.2,callbacks=[early_stop,my_callback])