CNN 모델 이해
CNN모델은 특정한 크기를 가진 필터를 가지고 이미지의 특징을 찾아낸다
예를 들어 3x3의 필터를 정의 한다면 3x3사이즈의 필터를 지정한 픽셀 수 만큼의 간격으로 이동하며 특징을 찾아내
학습을 하게 된다
import
#통계
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import random as rd
import cv2, os
#전처리
from sklearn.model_selection import train_test_split
from sklearn.metrics import *
#딥러닝
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D
from keras.backend import clear_session
from keras.optimizers import Adam
#학습 데이터
from keras.datasets import mnist
필요한 라이브러리는 다음과 같다
여기서 마지막줄의 mnist는 keras 에서 제공되는 이미지 학습 데이터셋이다
필요한 데이터 로딩
(x_train, y_train), (x_val, y_val) = mnist.load_data()
다음 코드로 mnist 이미지 데이터를 바로 불러올 수 있다
train_test_split으로 분리하지 않아도 된다
데이터를 로딩해서 형태를 확인해보면 다음과 같다
여기서 60000은 data의 수를 의미하며 28, 28은 픽셀 수를 의미한다
말하자면 28x28 픽셀의 데이터가 60000개 있다는 의미다
y데이터에는 해당 이미지가 어떤 것을 의미하는지 적혀있다
+
plt.imshow(x_train[0] , cmap=plt.cm.binary)
plt.show()
mnist의 0번 데이터는 다음과 같이 생겼다
데이터 전처리
데이터 차원 변경
CNN을 이용해 이미지를 처리하기 위해서는 먼저 데이터 전처리를 해주어야한다
CNN에서는 데이터를 4차원으로 입력해야한다 (행 , 픽셀 , 픽셀 , 채널)
여기서 채널은 흑백은 1을 입력하면 되고 일반 컬러는3(rgb)를 입력하면 된다
x_train = x_train.reshape(60000,28,28,1)
x_val = x_val.reshape(10000,28,28,1)
mnist 데이터는 흑백이므로 1채널로 바꿔주자
데이터 스케일링
x_train = x_train / 255.
x_val = x_val / 255.
각각의 데이터를 255로 나누어준다
255로 나누는 이유는 이미지의 색을 표현하는 수가 0~255로 이루어져 있기 때문이다
모델링
#메모리 초기화
clear_session()
#모델1 정의
model = Sequential([Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), padding='same', strides = 1, activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=2),
Flatten(),
Dense(10, activation='softmax')
])
#여러 conv2d를 사용한 모델
model = Sequential([ Conv2D( 32 , kernel_size=(3, 3), input_shape =( 28, 28,1 ), padding='same', activation = 'relu'),
MaxPooling2D(pool_size= (2, 2), strides=2),
Conv2D(64, kernel_size = (3, 3), padding='same', activation = 'relu' ),
MaxPooling2D(pool_size= (2, 2), strides=2),
Flatten(),
Dense( 128 , activation = 'relu'),
Dense ( 10 , activation = 'softmax' )
])
model.compile(optimizer=Adam(learning_rate=0.001), loss='sparse_categorical_crossentropy')
모델링 코드는 다음과 같이 구성이 된다
모델 1을 기준으로 설명을 하자면
먼저 Conv2D 레이어를 정의한다
각각 옵션을 설명하자면
32는 필터의 수를 의미하며 필터의 수는 원하는 대로 설정해도 된다
kenel_size 옵션은 사용할 필터의 크기를 정의하며 여기서는 3x3 사이즈로 설정했다
input_shape는 입력 데이터의 형태를 정한다 28x28 픽셀의 1채널 데이터를 사용하므로 (28,28,1)을 입력했다
padding은 입력 데이터의 주변에 설정할 패딩을 정의한다 same을 사용하면 주변 데이터에 padding을 추가하여
출력 데이터가 입력 데이터와 같은 크기로 유지 된다
activation은 활성화 함수로 히든레이어 이므로 relu를 사용했다
strides는 필터가 이동할 때 몇 칸을 이동할지 정해주는 옵션으로 1을 선택하면 한 칸씩 이동하며 특징을 추출한다
MaxPooling2D는 레이어의 특징을 추출한 데이터의 크기를 중요할 때 사용한다
pool_size는 특징 데이터에서 다시 특징을 추출하는 필터의 크기를 의미하며 여기서는 2x2사이즈를 사용했다
strides는 위와 동일한 옵션으로 풀링 사이즈와 stride가 동일하기 때문에 특징 추출에 있어 중복이 없다
Flatten()은 Dense 레이어에 앞의 데이터를 연결해주기 위해 데이터를 2차원으로 펴주는 역할을 한다
이후 마지막 아웃풋 레이어는 0부터 9 까지의 숫자를 분류하는 다중 분류이므로 10 과 softmax를 사용했다
complile의 loss 역시 결과값이 정수인 다중 분류이므로 'sparse_categorical_crossentropy' 를 사용해주었다
예측 및 평가
pred = model.predict(x_val)
pred = pred.argmax(axis=1)
predict를 사용해 예측을 해주고 결과값을 argmax로 정리해주자
print(confusion_matrix(y_val, pred_1))
print(classification_report(y_val, pred_1))
평가는 분류이기 때문에 컨퓨전 매트릭스와 , classification_report을 사용해주면 된다
히스토리 확인하기
def history_plot(history):
plt.figure(figsize=(10,6))
plt.plot(history['loss'], label='train_err')
plt.plot(history['val_loss'], label='val_err')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend()
plt.grid()
plt.show()
history_plot(history)
다음 코드로 학습 히스토리를 그래프로 확인 할 수 있다
모델 저장하기
model.save('이름.h5')
다음 코드로 모델을 저장 할 수 있다
만약 본인이 직접 만든 데이터를 사용해
예측을 하고 싶다면
28x28픽셀의 이미지를 만들어서 predict를 해주면 된다
'파이썬 > 딥러닝' 카테고리의 다른 글
파이썬 딥러닝 - RNN, LSTM으로 주가 예측하기(feat. finance-datareader (0) | 2023.10.22 |
---|---|
파이썬 딥러닝 코드 작성법 - Sequential / 함수형 (0) | 2023.10.22 |
파이썬 딥러닝 - Dense만 사용해서 이미지 분류하기 (tensorflow.keras (0) | 2023.10.08 |
파이썬 딥러닝 - 회귀, 분류, 다중분류 (tensorflow.keras (0) | 2023.10.07 |
딥러닝에 대한 이해와 딥러닝의 구조 (0) | 2023.10.07 |