depthwise separable convolution(깊이별 분리 합성곱)

2021. 7. 7. 14:29Artificial_Intelligence/Computer Vision

SeparableConv2D

입력 채널별로 따로따로 공간 방향의 합성곱 수행 후, 1*1 합성곱 (점별 합성곱)으로 출력 채널을 합치는 것.

이로 인해 공간 특성의 학습과 채널 방향 특성의 학습을 분리하는 효과를 얻을 수 있음.

모델 파라미터와 연산의 수를 크게 줄여주어 더 작고 빠른 모델을 제작할 수 있음.

 

여기서 1 * 1 합성곱이란,

1 * 1 크기의 Convolution Filter 사용한 Convolution Layer를 말하는데, Channel /  Spatial의 특성파악에 도움이 된다.

 

 

이렇게 1*1 합성곱을 쓰면 파라미터 수가 확연히 줄게 된다.

 

일반적으로 합성곱에서 channel을 크게 주면 파라미터 수가 급격히 증가하는데, 1*1 합성곱을 사용하면 효율적으로 모델을 구성할 수 있음. 즉, channel 수를 조절할 수 있음.

 

채널의 수가 줄면 파라미터가 줄어드는 것으로, 동시에 계산량이 같이 줄어듬.

 

이 특성들을 가지고 모델을 더 깊게 구성하면, 기존의 모델보다 더 많은 비선형성 활성화 함수를 사용할 수 있고, 더 구체적인 패턴을 파악해 성능 향상으로 이어짐.

from keras.models import Sequential, Model
from keras import layers

height = 64
width = 64
channels = 3
num_classes = 10

model = Sequential()
model.add(layers.SeparableConv2D(32, 3, activation='relu', input_shape=(height. width, channels,)))
model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layer.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.GlobalAveragePooling2D())

model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(num_classes, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
728x90