[DL] CNN

송아지·2024년 11월 4일

Deep Learning

목록 보기
4/7

1. CNN

  • Convolutional Neural Network
  • 이미지, 비디오 등 컴퓨터 비전 분야에 주로 사용되는 인공 신경망 구조
  • CNN에서 학습이란 특징을 추출하는 필터를 만드는 것

2. CNN 구조

  • Input(shape = (x_train[1], x_train[2], x_train[3]))
    • (가로, 세로, 채널)
    • 채널
      • 흑백 : 1
      • 컬러 : 3
  • Convolutional Layer
    • 필터로 지역적인 특성을 뽑는 과정
  • Max pooling Layer
    • Convolutional Layer로 특성을 뽑아 낼 경우 데이터의 수가 너무 많아짐
    • Max pooling Layer를 통하여 뽑아낸 특징을 요약 및 압축
  • Flatten
    • Dense Layer에 연결하기 전, 이미지 데이터 정보를 Dense Layer가 인식할 수 있는 데이터로 변경


3. 코드

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import random as rd
import cv2  # cv2 : OpenCV

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, Input
from keras.backend import clear_session
from keras.optimizers import Adam

## 데이터를 불러온 이후 코드

print(x_train.shape, x_val.shape) # 데이터 구조 확인
# ((60000, 28, 28), (10000, 28, 28))

# 데이터 구조 변경
x_train = x_train.reshape(60000,28,28,1)   # 데이터 건수, 세로 픽셀수, 가로픽셀수, 채널(컬러(3), 흑백(1)) # 이미지 데이터의 표현 방식
x_val = x_val.reshape(10000,28,28,1)

# 스케일링
# 흑백 이미지는 0~255 값을 가지므로 스케일러가 아닌 /255. 을 사용함으로 스케일링 가능 
x_train = x_train / 255.
x_val = x_val / 255.

clear_session()

# 일반적으로 Conv2D는 층이 넘어갈수록 채널 수가 증가
model = Sequential([Input(shape = (28, 28, 1)),
                    Conv2D(32, kernel_size=3, input_shape=(28,28,1), padding='same', activation ='relu'), 
                    MaxPooling2D(pool_size = 2),
                    Dropout(0.3),
                    Conv2D(64, kernel_size = 3, padding='same', activation = 'relu'),
                    MaxPooling2D(pool_size = 2),
                    Dropout(0.3),
                    Flatten(),
                    Dense(128, activation = 'relu'),
                    Dropout(0.3),
                    Dense(10, activation = 'softmax')
])

model.summary()

# 이후 fit은 동일

  • 주요 코드
Conv2D(32, kernel_size=3, input_shape=(28,28,1),
		padding='same', activation ='relu')
## 32 : 필터(커널) 수
## kernel_size=3 : 3 x 3 커널 사용(가로, 세로 길이가 같을 경우 정수 하나로 사용 가능(3,3))
## stride : 커널이 몇 칸 씩 이동할 것인지 지정
# 1이 기본값(1,1) (가로 1칸, 세로 1칸 씩 이동)
## padding : 출력 이미지 데이터 size 지정
# same -> 출력 이미지 데이터가 입력 데이터와 사이즈가 같음
# 이미지 주변을 0으로 덧대어 사이즈 유지

MaxPooling2D(pool_size = 2)
## pool_size = 2
# 요약할 특징 크기
# (행, 열) -> (2, 2)와 같이 행과 열이 같으면 2로 사용 가능
# strides : 생략 시 pool_size와 동일
# 출력 데이터 크기 = Input Size // Pooling Size
  • 구역 별 제일 큰 값을 가져옴
profile
데이터 분석가&엔지니어를 희망하는 취준생

2개의 댓글

comment-user-thumbnail
2024년 11월 4일

잘 보고 가요...🐌

1개의 답글