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')