안녕하세요
저번에 CNN에 대해 포스팅을 하였습니다.
CNN은 이미지 딥러닝 처리기법중 하나입니다. 기존 이미지 처리 코드에서 CNN을 도입하면 정확도와 학습시간을 크게 단축시킬수있습니다.
하지만 CNN을 씀에도 여전히 그결과가 크거나 복잡할수있는데요
이때 맥스풀링,드롭아웃,플래튼을써서 다시 한번 축소를 시켜야 됩니다.
이 과정을 풀링이라고 합니다.
맥스 풀링
예를들어 다음과 같은 이미지가 있다고 해봅시다.
맥스 풀링을 적용하면 다음과 같이 4 구역으로 나눔니다.
그 다음 각 구역에서 가장 큰값을 추출합니다.
이 과정을 거쳐 불필요한 정보를 간추립니다. 맥스 풀링을 파이썬 코드로 나타내면 다음과 같습니다.
model.add(MaxPooling2D(pool_size(2,2)))
pool_size를 통해 풀링 창의 크기를 정하게 됩니다. 2,2 는 가로 2 세로 2 크기의 풀링창을 통해 맥스 풀링을 진행하라는 의미입니다.
드롭아웃, 플래튼
딥러닝은 무조건 학습을 많이하는게 중요한게 아니라 얼마나 과적합을 피하는지에 따라 성능이 결정됩니다.
여러 기법이 있는데 그중 가장 간단한 기법이 바로 드롭아웃 입니다. 그림으로 표현하면 다음과 같습니다.
드롭아웃은 은닉층에 배치된 노드 중 일부를 임의로 꺼주는것입니다. 이렇게 노드를 꺼주면 학습 데이터에 지나치게 치우쳐서 학습되는 과적합을 방지할 수 있습니다. 파이썬으로는 다음과 같습니다. 예를들어 25%의 노드를 끄려면 다음과 같이 코드를 작성하면 됩니다.
model.add(Dropout(0.25))
이제 2차원 배열을 1차원으로 바꿔주는 과정만 남았습니다. 이때 쓰이는 함수가 바로 플래튼입니다. 코드로 작성하면 다음과 같습니다.
model.add(Flatten())
이제 mnist를 맥스풀링 드롭아웃 플래튼을 써서 학습을 시켜봅시다.
코드
이제 코랩을 실행시키고 코드로 작성해봅시다.
먼저 관련 라이브러리를 임포트해줍니다. Dropout, Flatten,Conv2D가 추가 되었습니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import numpy as np
그다음 훈련셋이랑 테스트셋을 로드합니다. 타입을 float32로 해준다음 255로 나눠줍니다. 이렇게 하면 0~255에 값이 0~1로 되어 더욱더 학습하기 용이하게 됩니다. 그다음 원 핫 인코딩 방식을 적용해줍니다.
(X_train, y_train),(X_test,y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0],28,28,1).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0],28,28,1).astype('float32') / 255
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
그다음 Dropout Flatten Maxpooling을 써서 컨볼루션 신경망을 구성해 줍니다.
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.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
modelpath = "./MNIST_CNN.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])
그다음 테스트 정확도를 출력하고 오차를 저장한다음 그래프로 표현해 봅시다.
print("\n Test Accuracy: %.4f" %(model.evaluate(X_test,y_test)[1]))
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="red",label="Trainset_loss")
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
드롭아웃 플래튼 맥스풀링을 썼더니 더욱더 정확도가 향상되는걸 확인할수 있습니다.
'Coding > AI' 카테고리의 다른 글
자연어 처리2 - 단어의 원핫 인코딩 임베딩 코드 (0) | 2023.11.02 |
---|---|
자연어 처리1 - 문장의 토큰화 (0) | 2023.10.29 |
CNN으로 mnist데이터 학습하기 (0) | 2023.10.20 |
mnist로 이미지 학습하고 인식하기 (0) | 2023.10.19 |
이미지 딥러닝 기초 mnist 써보기 (0) | 2023.10.15 |