티스토리 뷰
■ 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 이라고 합니다.
Convolution Block
Shortcut 의 channel 과 main path 의 channel 이 다를 경우 shortcut path 를 적절히 변환해주는 작업
즉, projection 을 통해 channel 을 맞춰주는 작업이(projection shortcut) 추가되기에 이를 convolution block 이라고 합니다.
Resnet-50 Structure
* 그림 출처: 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
- tensorflow serving
- DW
- dct
- SvD
- gPRC
- Residual Block
- keras
- Digital watermarking
- backpropagation
- implementation
- flask serving
- 캡처방지
- numpy
- 네이버웹툰
- DWT-DCT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |