티스토리 뷰

딥러닝

[keras] ResNet (residual block)

기루광 2020. 1. 12. 13:22

 

■  Degradation 문제


Deep Residual Learning for Image Recognition 논문을 보면 시작은 

56-layer를 사용하면 이론적으로 더 error 가 낮아야 하지만, 20-layer 보다 더 높은 값을 나타내고 있습니다.

이는 다시말하면 layer가 깊어질수록 overfitting 의 문제가 아닌, training error 가 증가한다는 말로  

네트워크가 학습이 잘 진행이 되지 않는다는 것을 의미합니다.

 

 

■  Shortcut connection (skip connection)


Degradation 문제를 해결하기 위해 논문에서 제안한 방법이 shutcut connection 이란 방법으로

Gradient 를 유지할 수 있도록 shorcut을 만든 다는 것이 핵심입니다.  

$y_{l} = h(x_l) + F(x_l, W_l) \qquad h:identity mapping,\quad x: input $

$x_{l+1} = f(y_{l}) \qquad x_{l+1}:output, \quad f: activation function$

  일반화  

$x_{l+2} = x_{l+1} + F(x_{l+1}, W_{l+1}) = x_{l} + F(x_{l}, W_{l}) + F(x_{l+1},W_{l+1})= x_l+ \dots +$

$x_{L} = x_{l} + \sum_{i=1}^{L-1}F(x_i,W_i)$

 

 

  역전파(Back propagation) 

$\frac{\partial \varepsilon }{\partial x_l} = \frac{\partial \varepsilon }{\partial x_L} \frac{\partial x_L }{\partial x_l} = \frac{\partial \varepsilon }{\partial x_L} (1 + \frac{\partial}{\partial x_l}\sum_{i=1}^{L-1}F(x_i,W_i))$

 

$ (1 + \frac{\partial}{\partial x_l}\sum_{i=1}^{L-1}F(x_i,W_i)) $ 왼쪽 항과 오른쪽 항으로 구분되게 됩니다.

Mini batch 로 진행된다고 가정하면 실제 오른쪽 항이 전부 -1을 만족하는 경우가 거의 없기에 Gradient 값이 유지됩니다.

 

■  Identity Block / Convolutional Block

 


  Identity Block  

Shortcut 의 channel 과 main path 의 channel 이 일치할 경우 단순 add 연산만 진행하는 블록을 identity block 이라고 합니다.

Identity Block

  Convolution Block  

Shortcut 의 channel 과 main path 의 channel 이 다를 경우 shortcut path 를 적절히 변환해주는 작업

즉, projection 을 통해 channel 을 맞춰주는 작업이(projection shortcut) 추가되기에 이를 convolution block 이라고 합니다.

Convoltional Block

 

  Resnet-50 Structure  

Total Structure of ResNet-50

* 그림 출처: https://github.com/YBIGTA/DeepNLP-Study/wiki/Day-02-Paper-Review:-ResNet

* 참고 : https://arxiv.org/pdf/1512.03385.pdf

 

■  Residual Block (Keras)



from keras import layers

def residual_block(x, filters_in, filters_out, k_size):
    shortcut = x
    x = layers.Conv2D(filters_in, kernel_size=(1, 1), strides=(1, 1), padding="same")(x)
    x = layers.BatchNormalization()(x)
    x = layers.LeakyReLU()(x)
    
    x = layers.Conv2D(filters_in, kernel_size=(k_size, k_size), strides=(1, 1), padding="same")(x)
    x = layers.BatchNormalization()(x)
    x = layers.LeakyReLU()(x)    
    
    x = layers.Conv2D(filters_out, kernel_size=(1, 1), strides=(1, 1), padding="same")(x)
    x = layers.BatchNormalization()(x)
    
    shortcut_channel = x.shape.as_list()[-1]
    
    if shortcut_channel != filters_out:
        shortcut = layers.Conv2D(filters_out, kernel_size=(1, 1), strides=(1, 1), padding="same")(shortcut)
        
    x = layers.Add()([x, shortcut])
    return layers.LeakyReLU()(x)

 

'딥러닝' 카테고리의 다른 글

[keras] GAN 이해 및 구현  (0) 2020.01.19
[keras] vae spectrum generator  (0) 2019.04.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함