본문 바로가기
딥러닝

[딥러닝] CNN _ 20241104

by 황오독 2024. 11. 4.

1. CNN

1) Input_shape : 분석 단위인 이미지 한 장의 크기를 설정한다. (픽셀사이즈, 세로, 가로, 채널)

    - 여기서 채널은 색을 말함. (흑백 : 1 / 컬러 : 3로 지정)

    - 학습시키는 데이터는 모두 같은 사이즈로, 동일하게 맞추어야 한다.

    - ex) 사진 60,000 중 고양이 사진 28x28, 3 (컬러)

 

2) Convolutional Layer(합성곱 레이어) : 필터로 지역(영역)적인 특성(feature)를 뽑는 과정.

   - Conv2d

   - 해당 레이어를 거치면서 고유한 패턴(엣지, 텍스처 등)을 학습한다.

   - ex) 고양이 눈, 귀 등을 탐색하고 특징 맵(feature map)으로 변환한다.

 

3) Max Pooling Layer(최대 풀링 레이어) : 뽑은 특징을 요약(압축)

  - Conv2d(5,)는 이미지 한 장당 5개 필터링을 하여 양이 너무 많아진다.

  - 가장 큰 값만 남겨서, 불필요한 부분을 줄이고 중요한 특징만 남긴다.

  - ex) 위 Layer에서 고양이 귀 feature에서 불필요한 부분 (눈, 배경 등)을 제거하여 귀 부분만 남김

 

 

2. 코드 이해

Conv2D(32, kernel_size=(3,3), input_shape=(5,5,1),
	   padding='same', strides=(1,1), activation='relu'

 

1) ConvNet(특히 Conv2D) : 이미지 분석에 주로 사용

   - 필터수 32개, kernal(필터) 사이즈 3X3

   - Strides(1,1) : 가로, 세로 이동칸수

   - padding = 'same' : 만약 Size를 유지하려면 padding 옵션을 사용(Size가 유지되도록 이미지 둘레에 0으로 덧댐)

더보기
  • padding='same': 입력 이미지의 가장자리에 0을 채워 필터가 이미지 전체에 고르게 적용되도록 함. 이렇게 하면 출력의 크기가 입력과 같아지기 때문에, CNN 모델에서 깊이 있는 층을 쌓더라도 데이터의 크기가 급격히 줄어드는 것을 방지할 수 있습니다.
  • padding='valid': 패딩 없이 필터를 적용하는 방식으로, 가장자리를 무시하고 중앙 부분에서만 합성곱을 진행함. 이 경우, 출력(feature map)의 크기가 입력보다 작아짐.

따라서 padding='same'을 사용하면 모델이 이미지의 경계 정보를 놓치지 않으면서 더 깊은 층까지 유용한 특징을 학습할 수 있어, 더 풍부한 정보를 제공함.

2) MaxPooling

MaxPooling2D(pool_size=(2,2), strides(2,2))

 

- 출력데이터 크기 줄이거나 특정 데이터 강조하기 위해 사용

- pooling_size : 풀링 크기 행 X 열 (2x2)

- stirdes : 생략하면 pool_size와 동일

 

더보기
  • strides=1로 설정하면 필터가 한 칸씩 이동하면서 모든 위치에서 풀링을 적용하게 됨. 즉, 겹치는 부분이 많아져 더 세밀하게 정보를 추출하지만 계산량이 더 많아지게 됨.
  • strides=2로 설정하면 필터가 두 칸씩 이동하면서 풀링을 합니다. 이미지를 빠르게 요약하게 되고, 계산량도 줄어듬. 겹치는 영역이 적어지기 때문에 데이터 크기를 빠르게 줄이는 효과도 있음.

=> strides=2로 설정하는 경우 이미지의 크기를 절반으로 줄이면서 중요한 정보만 남기고, 불필요한 부분은 버리는 역할,모델이 더 가볍고 효율적으로 학습하도록 도와줍니다.

3) Flatten과 Dense Layer

Flatten(), # 1차원으로 펼치기
Dense(128, activation='relu'),
Dense(10, activation='softmax')

- 최종 예측 결과로 뽑기 위해서는 (1차원, 혹은 단일 값)

- Dense Layer로 연결이 필요

 

 

3. 전체 코드

model = Sequetial(
	Conv2D(32, kernal_size=3, input_shape(28, 28, 1), # shape(세로(행), 가로(열), 채널(흑백))
    	   padding='same', activation='relu'),
    MaxPooling2D(pool_size=(2,2), strides=2), # strides 기본값 1
	Conv2D(32, kernal_size=3, input_shape(28, 28, 1), actiation='relu'),
    MaxPooling2D(pool_size=(2,2), strides=2),
    Flatten(), # 1차원으로 펼침
    Dense(128, activation='relu'),
    Dense(10, activation='softmax').
])