본문 바로가기

하루 30분 컴퓨터 비전 공부하기

CV(4) CNN 기초 - pooling

01. Pooling

https://velog.io/@psy4072/CNN-Convolutional-Neural-Network

 

  • Pooling : 연산량을 크게 늘리지 않고 down sampling 할 때 사용한다. 
  • 종류
    • Max Pooling : 큰값만 뽑아냄
      • 이미지의 도드라지는 특징만 남기는 효과가 있음 
    • Average Pooling : 평균값을 뽑아냄
      • 일반적인 양상을 보여주며 노이즈를 줄여주는 효과를 기대할 수 있다. 
    • Sum Pooling : 그 영역의 값을 다 더해서 뽑아냄
  • pooling은 겹치는 부분이 생기지 않고 parameter를 사용하지 않고 정보를 압축할 수 있어서 연산량이 효율적이다.
  • feature map으로 표현된 정보를 축약하는 역할을 한다. 
  • 적절하게 중요한 값만 뽑아낼수 있다. 
  • 비선형성을 강화하고, feature map의 크기를 줄여서 연산 성능을 향상시킬 수 있다. 

➞ 비선형성을 강화하면 뭐가 좋은가? 

  • 비선형적이어야 단순 변환에 그치지 않기 때문이다.
  • 참고 링크

 

02. Convolution + Pooling 종합

https://velog.io/@dltjrdud37/CNNConvolutional-Neural-Network

  • CNN 구조의 특징
    • feature extractor와 classification영역으로 구성
    • feature Extraction ➞ convolution과 pooling을 반복
    • 연속적인 CNN연산을 순차적으로 수행하면서 일련의 feature Map을 생성
    • 순차적으로 생성된 feature map의 크기는 줄어들지만 채널(깊이)은 증가
    • 더 복잡하고 다양한 feature정보를 반영하기 위해 , cnn깊이를 증가시키는 방향으로 발전

 

03. CNN 구조 구현하기 

- 기본 CNN

# 모듈 import
import tensorflow as tf

# 가로 28, 세로 28, 채널 수 1의 input 데이터를 받는 input layer 생성하기
input_layer = tf.keras.layers.Input(shape=(28, 28, 1)) 

# 커널의 가로 세로 사이즈는 3이고, 채널 수는 4, zero-padding을 넣고,
# stride는 1로 한 Conv2D layer
x = tf.keras.layers.Conv2D(filters=4, kernel_size=3, strides=1, padding='same', activation='relu')(input_layer)

- pooling layer가 포함된 CNN 

input_tensor = tf.keras.layers.Input(shape=(27,27,1))
x1 = tf.keras.layers.Conv2D(filters = 6, kernel_size = 2, strides = 2, padding = 'same', activation = 'relu')(input_tensor)
x2 = tf.keras.layers.MaxPooling2D(2)(x1) 

# 모델객체 생성
input_layer = tf.keras.layers.Input(shape=(7, 7, 5))
convlayer1 = tf.keras.layers.Conv2D(filters=4, kernel_size=3, strides=1, padding='same')(input_layer)
convlayer2 = tf.keras.layers.Conv2D(filters=8, kernel_size=3, strides=1, padding='valid')(convlayer1)
pooling = tf.keras.layers.MaxPooling2D(2)(convlayer2)

model = tf.keras.Model(inputs=input_layer, outputs=pooling)

- 이미지 분류 CNN 모델

input_tensor = tf.keras.layers.Input(shape=(28, 28, 1))
x = tf.keras.layers.Conv2D(filters=32, kernel_size=3, strides=1, padding='same', activation='relu')(input_tensor) 
x = tf.keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu')(x)
x = tf.keras.layers.MaxPooling2D(2)(x)

# 3차원으로 되어있는 Feature map 결과를 Fully Connected 연결하기 위해서는 Flatten()을 적용해야 합니다.
x = tf.keras.layers.Flatten()(x) 

# Flatten 된 결과를 100의 노드를 가진 Fuly Connected Layer와 연결 
x = tf.keras.layers.Dense(100, activation='relu')(x) 
output = tf.keras.layers.Dense(10, activation='softmax')(x)

# tf.keras.Model을 사용하여 model을 정의해 주세요.
model = tf.keras.Model(inputs = input_tensor, outputs = output)

# 정의해 준 model이 잘 만들어졌는지 summary를 통해 확인해 보세요.
model.summary()