DEVELOPMENT/AI

딥러닝(DL) - CNN 모델

hongjw 2020. 12. 30. 05:21

CNN(Convolutional Neural Network)이란?

데이터의 특징을 추출하여 이 특징들의 패턴을 파악하는 구조이다. CNN 알고리즘은 Convolution과정과 Pooling과정을 통해 진행되며, Convolution Layer와 Pooling Layer를 복합적으로 구성하여 알고리즘을 만든다.

CNN 전체 과정

1) Convolution

Convolution은 아래 그림처럼 데이터의 특징을 추출하는 과정이다.

- 연산 예시 : (1*1)+(1*0)+(1*1)+(1*0)+(1*1)+(0*0)+(1*1)+(0*0)+(0*1)=4

연산 결과, 5x5 이미지에서 Filter 하나가 3x3 크기의 이미지를 생성하게 된다. 만약 Filter가 3개라면 3x3 이미지 3개가 생성되는 것이다. 

Convolved Feature들을 살펴보면 얻어낸 Feature 중에서도 가장 중요한 Feature를 뽑아낼 수 있을 것이고, 이를 위해 학습하는 역할을 CNN 중 Convolution Layer에서 수행한다.

 

2) Pooling

Pooling은 Convolution layer의 사이즈를 줄여주는 과정이다. 

Max-pooling, Average-pooling, L2-norm pooling 방법이 있는데, 보통은 만들어진 Feature들의 가장 큰 값들만 가져와 사이즈를 줄이는 방법인 Max-pooling을 이용한다.

3) Flatten

Convolution과 Pooling 과정을 반복해주면 크기가 점점 줄어들게 되고, 최종적으로 도출된 nxn이미지는 이미지라기보다 특정 이미지에서 얻어온 하나의 특이점 데이터가 된다. 

즉, 2차원이 아닌 1차원의 row 데이터로 취급해도 무관한 상태가 된다. 이렇게 1차원의 데이터로 변형하는 것이 Flatten 과정이다. 

Flatten 과정을 거치면 이후에는 DNN과 동일하게 만들어진 네트워크를 통해서 output을 출력하게 된다.

 

CNN 구현

import numpy as np
import sys, os
import matplotlib.pyplot as plt

from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import recall_score
from sklearn.metrics import precision_score
from sklearn.metrics import f1_score
from sklearn.metrics import confusion_matrix

# data preprocessing
print("[*] Start")

datasets = np.loadtxt('파일.csv', delimiter=',',skiprows=1)
xy_data = datasets   # exclude header
train_set, test_set = train_test_split(xy_data, test_size=0.3, random_state=123)   
print('Training Length : ', len(train_set), 'Test Length : ', len(test_set))

# 7 x 7
x_train_data = train_set[:,:피처 갯수].reshape(-1,7,7,1)
y_train_data = train_set[:,피처 갯수:]

# 7 x 7
x_test_data = test_set[:,:피처 갯수].reshape(-1,7,7,1)
y_test_data = test_set[:,피처 갯수:]

print("[x_train_data]",x_train_data.shape)
print("[y_train_data]", y_train_data.shape)
print("[x_test_data]", x_test_data.shape)
print("[y_test_data]", y_test_data.shape)

y_train_data = np_utils.to_categorical(y_train_data, 2)
y_test_data = np_utils.to_categorical(y_test_data, 2)

#======== model start ===========
from tensorflow.keras import layers
from tensorflow.keras.datasets import mnist
from keras.utils import np_utils
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

import matplotlib.pyplot as plt
import os
import numpy

# 7 x 7
X_train = x_train_data
Y_train = y_train_data

# 7 x 7
X_validation = x_test_data
Y_validation = y_test_data 

model = Sequential()
model.add(Conv2D(64, kernel_size=(3, 3), input_shape=(7,7,1), activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.25))
model.add(Flatten())

model.add(Dense(32, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dropout(0.2))

#model.add(Dense(2, activation='softmax'))
model.add(Dense(2, activation='sigmoid'))

model.compile(optimizer='adam',
                loss='binary_crossentropy',
                metrics=['accuracy'])

history = model.fit(X_train, Y_train,validation_data=(X_validation, Y_validation),epochs=25, batch_size=200)
print('train_Accuracy : {:.4f}'.format(model.evaluate(X_train, Y_train)[1]))
print('test_Accuracy: {:.4f}'.format(model.evaluate(X_validation, Y_validation)[1]))

# 그래프 코드
y_vloss = history.history['val_loss']
y_loss = history.history['loss']

x_len = numpy.arange(len(y_loss))
plt.plot(x_len, y_loss, marker='.', c='blue', label="Train-set Loss")
plt.plot(x_len, y_vloss, marker='.', c='red', label="Validation-set Loss")

plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

- epochs : 전체 데이터를 반복적으로 학습하는 횟수 (ex. 시험지를 푼 횟수)

- batch_size : 한번에 학습할 데이터의 수 (ex. 몇 문항을 풀고 해답을 맞추는지)

epochs를 너무 크게하면 오버피팅이 발생할 수 있으며, batch_size를 너무 작게하면 학습시간이 오래걸릴 수 있다. 

 

모델 저장

model.save('모델.h5')

 

 

 

참고

>> youngq.tistory.com/40

>> mangkyu.tistory.com/58

'DEVELOPMENT > AI' 카테고리의 다른 글

train, test, validation 데이터셋  (0) 2020.12.30
딥러닝(DL) - DNN 모델  (0) 2020.12.30
머신러닝(ML) - RandomForest 모델  (0) 2020.12.29