Replicated

Keras CNN 본문

학부/딥러닝

Keras CNN

라구넹 2025. 10. 25. 21:36

CNN

- 이미지 분류에 우수한 성능을 보이는 deep neural network

- Fully connected layer 앞에 convolusion layer 존재

 

컬러 이미지 데이터의 저장

-> 3차원 배열 (r, g, b 세 개의 컬러 채널)

 

from skimage import io
from tkinter.filedialog import askopenfilename
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

fname = askopenfilename()
image = mpimg.imread(fname)
plt.imshow(image)
plt.show()

일단 이미지 읽어서 보여주기

맥이나 리눅스는 따로 설치 필요한데, wsl 환경에서 작업하고 있어서

sudo apt-get install python3-tk

이거 해줬다

 

적당히 있던 이미지 열어보기

 

print(type(image))
print(image.shape)
print(image[:,:,1])

이미지 정보

 

from skimage import color
gray_image = color.rgb2gray(image)
print(gray_image.shape)
plt.imshow(gray_image, cmap='gray')
plt.show()

저 함수는 4차원 못받아서 jpg 파일로 바꿔서 테스트

회색 된다

 

from skimage import transform
new_shape = (image.shape[0] // 2, image.shape[1] // 2, image.shape[2])
small = transform.resize(image=image, output_shape=new_shape)
print(small.shape)
plt.imshow(small)
plt.show()

리사이징

 

from skimage.transform import rotate
import numpy as np
plt.imshow(np.fliplr(image))
plt.show()
plt.imshow(rotate(image, angle=45)) 
plt.show()

플립, 로테이트

 

from skimage import color
gray_image = color.rgb2gray(image)

# filters
from skimage.filters import sobel_h
plt.imshow(sobel_h(gray_image))
plt.show()

소벨 필터

 

io.imsave("./NewImage.png", image)

이미지 저장


 

Convolution (합성곱, *)

- 영상 처리의 일종, 이미지에 특정 필터를 적용하여 새로운 이미지를 만듦

 

컨볼루전 연산의 의미

- 컨볼루전에 의해 도출된 이미지 -> 피쳐라 함

- 한 이미지에서 여러 피쳐를 만들 수 있으며 각 피쳐는 이미지의 특징 정보를 저장

- 컨볼루전 -> 이미지의 특징을 학습하는 과정, 자동적으로 이루어짐

 

Filter와 Feature

Filter

- 역할: 특정 패턴을 찾아내는 도구 또는 돋보기

- 성격: 학습 가능한 작은 행렬(가중치). CNN이 학습하는 과정에서 이 필터의 값들이 이미지에서 어떤 특징을 가장 잘 감지할 수 있는지 자동으로 조정

- 개수: 하나의 컨볼루전 레이어에는 여러 개의 필터가 있음. 각 필터는 다른 종류의 특징을 감지하도록 학습됨

- 저장: 모델 학습이 완료되면 이 필터의 가중치 값들이 모델의 일부로 저장 (가중치 + 편향)

 

Feature

- 역할: 필터가 입력 이미지에 적용된 결과물. 필터가 찾아낸 패턴이 이미지의 어느 위치에 얼마나 강하게 존재하는지를 나타내는 지도, 강도 맵

- 성격: 필터가 이미지를 훑으면서 각 위치에서 계산한 내적 값들의 집합. 값이 높을수록 해당 필터가 감지하려는 특징이 그 위치에 강하게 존재한다는 것을 의미 

- 개수: 하나의 필터는 하나의 피처 맵을 생성. 컨볼루전 레이어에 N개의 필터 -> N개의 피처 맵

- 저장: 피처 맵은 중간 출력값, 모델 자체에 저장되는게 아니라 특정 이미지를 처리할 때마다 실시간으로 생성

 

필터의 채널은 입력 이미지와 일치

도출되는 피쳐 맵의 개수는 필터의 개수(채널 수랑 다름)와 일치

 

Stride

- 이미지에 필터를 적용할 때 몇 칸씩 옮겨가며 적용할 것인가

 

Padding

- 컨볼루션은 특성 상 원본 이미지의 크기가 주는데, 유지하기 위한 장치가 패딩

- 입력 데이터의 외각에 지정된 픽셀만큼 특정 값으로 채워 넣음

 

Pooling

- 출력 데이터(이미지)를 입력으로 받아 출력 데이터의 크기를 줄이거나 특정 데이터를 강조하는 용도

- Max Pooling(주로 사용), Average Pooling, Min Pooling

- 윈도우 내에서 최대값을 구한다 -> Max Pooling

 

 

CNN에서의 학습

- Filter가 weight matrix의 역할

- 필터는 랜덤하게 초기화

- 오류 역전파에 의해 필터의 값들이 업데이트

- 학습을 마치면 필터 매트릭스를 얻음


 

층이 깊어질 수록 피쳐 맵이 많아지는 이유

-> 더 복잡한 특징을 이해해야 하기 때문

 

컨볼루션 레이어 출력 데이터 크기 계산

입력 데이터 높이: H

입력 데이터 폭: W

필터 높이: FH

필터 폭: FW

Stride 크기: S

패딩 사이즈: P

 

OH(Output Height) : ( H + 2P - FH ) / S + 1

OW(Output Width) : ( W + 2P - FW ) / S + 1

 

풀링 레이어 크기 계산

OutputHeight = InputHeight / PoolingSize_Height

OutputWidth = InputWidth / PoolingSize_Width

 

Convolution layer -> Fully Connected layer

fully connected layer는 1차원 데이터만 받는데

convolution layer는 3차원 데이터임

flatten layer가 필요

12x17x20의 피쳐맵을 펼치면 4080

일렬로 세워서 4080짜리 레이어가 만들어지고 이게 fully connected layer와 연결

 

from keras.models import Sequential
from keras.layers import Dense, Input, Convolution2D, MaxPooling2D, Flatten

model = Sequential()
model.add( Input( shape=(120, 160, 1) ) )
model.add( Convolution2D(12, kernel_size=(5, 5), activation='relu') )
model.add( MaxPooling2D( pool_size=(2, 2) ) )
model.add( Convolution2D(16, kernel_size=(5, 5), activation='relu') )
model.add( MaxPooling2D( pool_size=(2, 2) ) )
model.add( Convolution2D(20, kernel_size=(4, 4), activation='relu') )
model.add( MaxPooling2D( pool_size=(2, 2) ) )
model.add( Convolution2D(20, kernel_size=(2, 2), activation='relu') )
model.add( Flatten() )
model.add( Dense(512, activation='relu') )
model.add( Dense(128, activation='relu') )
model.add( Dense(4, activation='softmax') )

keras에서 이런식으로 사용 가능

 

 

Keras에서 CNN 모델을 정의하는 방법

1. Sequential

- 레이어들을 순차적으로 쌓아 올리는 간단한 모델에 적합

- 코드 가독성이 좋고 사용하기 쉽지만 입력이 여러 개이거나 분기가 있는 복잡한 모델 구조를 만들 수 없음

 

2. Functional API

- 레이어들을 함수처럼 사용하여 다음 레이어의 입력으로 전달하는 방식

- 여러 개의 입력과 츨력, 레이어들이 교차하는 복잡한 네트워크 구조를 만들 수 있음

'학부 > 딥러닝' 카테고리의 다른 글

Keras CNN - Argumentation  (0) 2025.10.25
Keras CNN - MNIST  (0) 2025.10.25
Keras - MNIST  (0) 2025.10.25
Keras 개요  (0) 2025.10.18
DNN  (0) 2025.10.18