본문 바로가기
ML/CNN

[CNN] GoogLeNet 요약

by 나른한 사람 2021. 8. 2.

Deep Learning

CNN은 일반적으로 네트워크가 넓고 깊어질수록 성능이 좋아진다. 하지만 Overfitting, Gradient Vanishing, 연산량 등의 문제점이 발생할 수 있다.

GoogLeNet

GoogLeNet은 ILSVRC14에서 좋은 성적을 낸 CNN 모델.
그 전체적인 구조는 아래와 같다.

GoogLeNet의 구조

네트워크의 시작부분에서는 Inception module을 사용하지 않았는데, 논문에 따르면 해당 부분에서 Inception의 효과가 없었다고 한다.
이후로는 Inception module이 깊게 쌓여있으며, 크기를 줄어들게 하기 위한 MaxPool 레이어도 존재한다.
또한, Fully Connected layer와 Softmax Activation으로 이어지는 Classifier가 마지막 부분이 아닌 가운데 부분에도 몇개가 있는데, 이는 Gradient Vanishing 문제를 방지하기 위한 것으로, 추가적인 Classifier에서도 loss를 계산해 동시에 학습하게 된다. 추가 Classifier에서 지나친 영향을 끼치는 것을 막기 위해 적절한 값을 곱해준다고 한다.

Inception Network

Inception module

효과적인 feature 추출을 위해 1x1 pixel value, 3x3, 5x5의 Convolution 연산을 수행하고, maxpooling 연산까지 수행
하지만, 이러한 연산을 모두 수행하려면 연산량이 너무 많이 필요하기 때문에 bottleneck 구조를 사용한다.

Inception module bottleneck

3x3 convolution을 예로 들면, 이와 같이 1x1 convolution을 적용 후 3x3 convolution을 수행한다. 이렇게 되면 연산량이 훨씬 줄어들게 되는데 확인해보자면 아래와 같다.

약 2배 가까이 연산량이 줄어들었다.

GoogLeNet Architecture


위 구조를 보고 대략적인 구성을 짜면 아래와 같을 것이다.

input_shape = (224,224,3)
Conv2D(64, (7,7), strides = 2, padding = 'same', activation='relu') #(112,112,64)
MaxPooling2D((3,3), strides = 2, padding = 'same') #(56,56,64)
LocalRespNorm()
Conv2D(64, (1,1), strides = 1, padding='same', activation='relu') #(56,56,64)
Conv2D(192, (3,3), strides = 1, padding='same', activation='relu') #(56,56,192)
LocalRespNorm()
MaxPooling2D((3,3), strides = 2, padding = 'same') #(28,28,192)
InceptionModule() #(28,28,256)
InceptionModule() #(28,28,480)
MaxPooling2D((3,3), strides = 2, padding = 'same') #(14,14,480)
InceptionModule() #(14,14,512)
InceptionModule(), ExtraSoftMax()
...
...
AveragePooling2D((7,7), strides = 1, padding = 'valid')
Dense(1000, activation = 'softmax')
InceptionModule(f1, f3r, f3, f5r, f5, pool_proj) :
    Conv2D(f1, (1,1), padding='same', activation='relu')

    Conv2D(f3r, (1,1), padding='same', activation='relu')
    Conv2D(f3, (3,3), padding='same', activation='relu')

    Conv2D(f5r, (1,1), padding='same', activation='relu')
    Conv2D(f5, (5,5), padding='same', activation='relu')

    MaxPooling2D((3,3), strides=1, padding='same')
    Conv2D(pool_proj, (1,1), padding='same', activation='relu')

    concatenate()

'ML > CNN' 카테고리의 다른 글

[CNN] ResNet50 Implementation(Keras)  (0) 2021.08.09
[CNN] GoogLeNet Implementation (Keras)  (0) 2021.08.06
[CNN] DenseNet 요약  (0) 2021.08.04
[CNN] ResNet 요약  (0) 2021.08.03
Convolutional : Autoencoder / Neural Network  (0) 2021.07.29

댓글