2020. 12. 14. 20:40ㆍDeep Learning/개념
GoogleNet부터 시작하여 InceptionV2, V3까지 살펴보려 합니다. 프로젝트를 진행할 때 Inception의 결과가 대체로 가장 좋았던 것 같습니다.
Inception V1, GoogleNet은 네트워크가 깊고 레이어가 넓어서(deep and wide NN) vanishing gradient 문제 해결을 위해서 sparse한 노드간의 연결을 사용했습니다(관련성 높은 노드들끼리만 연결) 그 결과 연산량과 과적합을 줄이는 효과가 있었습니다. Dropout과 같은 역할이라고 보면 될 것 같습니다.
그러나 실제로는 sparse matrix연산 > Dense matrix 연산이라고 합니다.(단점)
inception module이 핵심이라고 할 수 있죠, googlenet엔 inception module이 9개 들어가 있습니다.
inception module은 4가지 연산을 채널방향으로 합치는 구조인데요,
특이하게도 1x1필터가 있습니다. 1x1필터는 채널수를 조절하고 채널간 정보를 고려해 3x3필터는 지역정보에만 집중할 수 있도록 일종의 역할분담의 역할입니다.
또한 파라미터 수를 줄이는 역할도 합니다. 실제로 CNN보다 깊은 구조에도 불구하고 파라미터수가 더 적습니다.
conv-max-conv-max 로 이뤄진 stem영역은 layer초반엔 inception module의 효과가 떨어지므로 일반적인 conv-pool style을 유지합니다.(V3까지)
그림에는 나오지 않지만 논문을 보면 중간에도 예측부분이 존재한다고 합니다. 즉 중간층에서도 backpropagation 수행해 파라미터들을 갱신합니다.
deep하기 때문에 vanishing gradient 문제를 방지하기 위해 중간예측의 loss값을 일정비율 최종 loss에 반영하는 방법을 사용합니다.
softmax는 3개 존재하는데, 마지막이 진짜고 나머지는 보조 역할을 합니다.(train에만 사용하고, test에는 사용하지 않습니다) 즉 pre-trained model엔 softmax가 하나만 존재하겠죠. 이것 또한 vanishing gradient 문제를 예방하기 위함입니다.
# keras를 통한 googlenet구현
from keras import layers
from keras.datasets import mnist #mnist기준
from keras.models import Sequential, Model
from keras.optimizer import Adam
from keras.models import load_moder
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
img_shape = (224, 224, 3)
input_ = layers.Input(shape=img_shape)
x = layers.Conv2D(64, 7, strides=2, padding='same')(input_)
x = layers.Maxpooling2D(pool_size=(3,3), strides=2, padding='same')(x)
x = layers.BatchNormalization()(x)
x = layers.Conv2D(64, 1, strides=1)(x)
x = layers.Conv2D(192, 3, strides=1, padding='same')(x)
x = layers.BatchNormalization()(x)
x = layers.MaxPooling2D(pool_size(3, 3), strides=2, padding='same')(x)
x = inception_modile(x, o_1=64, r_3=64, o_3=128, r_5=16, o_5=32, pool=32)
x = inception_modile(x, o_1=128, r_3=128, o_3=192, r_5=32, o_5=96, pool=64)
x = inception_modile(x, o_1=192, r_3=96, o_3=208, r_5=16, o_5=48, pool=64)
x = inception_modile(x, o_1=160, r_3=112, o_3=224, r_5=24, o_5=64, pool=64)
x = inception_modile(x, o_1=128, r_3=128, o_3=256, r_5=24, o_5=64, pool=64)
x = inception_modile(x, o_1=112, r_3=144, o_3=288, r_5=32, o_5=64, pool=64)
x = inception_modile(x, o_1=256, r_3=160, o_3=320, r_5=32, o_5=128, pool=128)
x = layers.MaxPooling2D(pool_size=(3,3), strides=2, padding='same')(x)
x = inception_modile(x, o_1=256, r_3=160, o_3=320, r_5=32, o_5=128, pool=128)
x = inception_modile(x, o_1=384, r_3=192, o_3=384, r_5=48, o_5=128, pool=128)
x = layers.AveragePoolint(pool_size=(7,7), strides=1)(x)
x = layers.Dropout(0.4)(x)
x = layers.Dense(1000)(x)
output = layers.Activation('softmax')(x)
googlenet = Model(input_, output)
'Deep Learning > 개념' 카테고리의 다른 글
Batch Normalization (0) | 2021.04.02 |
---|---|
여러가지 Convolution연산 (0) | 2021.03.19 |
VGG16 (0) | 2020.12.14 |
GAN (0) | 2020.12.14 |
RNN (0) | 2020.12.13 |