본문 바로가기
Python/머신러닝, 딥러닝

[딥러닝] CNN을 통한 이미지 학습 분류

by IT두잇 2022. 5. 17.

CNN(Convolution Neural Network)이란?

비정형 데이터를 다루는 방법 중의 하나로, 이미지 학습에 뛰어난 딥러닝 모델입니다. 

데이터의 특징을 추출하여 특징들의 패턴을 파악하고 예측값과 정답을 비교, weight, bias 값을 업데이트해서 학습을 반복하는 과정을 거칩니다.

 

이번 시간에도 mnist 데이터를 활용해 분석을 진행해 보았습니다 :) ~

import pandas as pd
df = pd.read_csv('mnist_train.csv')

 

1. 라이브러리 설치

import numpy as np
import tensorflow as tf   #tensorflow 기본
from tensorflow.keras.models import Sequential   #모델 box 정의
from tensorflow.keras.layers import Flatten, Dense   #모델 Box의 Input Layer, Output Layer

from tensorflow.keras.optimizers import SGD   #알고리즘 담당
from sklearn.model_selection import train_test_split   #train, test 데이터 분리
from sklearn.preprocessing import MinMaxScaler   #데이터 정규화 - 큰 숫자를 작은 숫자로 변경 (-1 ~ 1)

 

2. X 데이터, Y 데이터 분리

X_data = df.drop(['label'], axis = 1, inplace = False)
Y_data = df['label']

 

3. 정규화 (Normalize)

: 픽셀 데이터를 정규화하여 0-1 사이의 실수로 변환합니다.

scaler = MinMaxScaler()    #scaler 객체를 생성
scaler.fit(X_data)   #scaler 객체를 학습

 

4. Conversion

norm_x_data = scaler.transform(X_data)   #scaler를 통해 실제 값 변환

 

5. Train 데이터와 Test 데이터 분리

norm_train_x_data, norm_test_x_data, train_y_data, test_y_data = train_test_split(
    norm_x_data, Y_data, test_size = 0.3)   #7대 3으로 분리

 

6. Convolution, MaxPooling 모델 설정

- Conv2D: 2차원 합성곱층

- MaxPooling2D: 2차원 풀링층

from tensorflow.keras.layers import Conv2D, MaxPooling2D
model = Sequential()

model.add(Conv2D(filters = 32,
                kernel_size =(3,3),
                strides=(1,1),
                activation = 'relu',
                input_shape=(28,28,1)))
                
model.add(Conv2D(filters = 64,
                kernel_size =(3,3),
                strides=(1,1),
                activation = 'relu'))

model.add(MaxPooling2D(pool_size = (2,2)))

model.add(Conv2D(filters = 64,
                kernel_size =(3,3),
                strides=(1,1),
                activation = 'relu'))

 

5. Classification

: flatten 함수를 통해 전체 4차원에서 2차원으로 바꾸어줍니다.

model.add(Flatten())

 

6.  Hidden Layer 설정 

model.add(Dense(units = 256, activation = 'relu'))

 

7. Output Layer 설정

: 다중분류 - output 출력되는 양 만큼

model.add(Dense(units = 10, activation = 'softmax'))

 

8. 컴파일

: 모델이 어떻게 동작할지 지정하는 과정입니다.

(optimizer = 최적화, loss = 손실함수, metrics = 평가방법)

model.compile(optimizer = SGD(learning_rate = 0.0001), 
             loss = 'sparse_categorical_crossentropy',
             metrics = ['accuracy'])

 

9. 모델 학습

norm_train_x_data = norm_train_x_data.reshape(-1, 28, 28, 1)

model.fit(norm_train_x_data, train_y_data, epochs = 50, 
         verbose = 1,
         validation_split = 0.2)
#validation_split: 자체 가지고 있는 데이터로 활용