[Day 10] 从 tensorflow.keras 开始的 ResNet 生活

0. 前言

https://ithelp.ithome.com.tw/upload/images/20210924/2014129428vWFRZ0n4.png

01
02
有一说一,VGG19跟ResNet34比起来真的很浅(上图)。
ResNet全名为Deep Residual Neural Network,
光看翻译可能不太能理解甚麽是「残差网路」,
所以今天师爷我就来翻译翻译,什麽叫「残差网路」。


1. ResNet50 网路架构详细图解

以下表格中,最中间的就是resnet50的结构,
可以分成几个部分:

  1. conv1:7x7卷积核(共1层)
  2. conv2_x:由三种卷积核(1x1,3x3,1x1)组成一个block,叠3次。(共9层)
  3. conv3_x:由三种卷积核(1x1,3x3,1x1)组成一个block,叠4次。(共12层)
  4. conv4_x:由三种卷积核(1x1,3x3,1x1)组成一个block,叠6次。(共18层)
  5. conv5_x:由三种卷积核(1x1,3x3,1x1)组成一个block,叠3次。(共9层)
  6. output:由pooling+全连接层+softmax组成。(共1层)
    这六个部分加给来共50层,
    第2.到5.部分是ResNet的创新重点!
    03

1.1 ResNet优点

  1. ResNet在VGG的基础上,新增直连通路(skip connection),不会新增任何参数,
    但是可以解决梯度消失的问题
  2. 直连通路与卷积层进行元素点(element-wise)相加,而非直接连接。
    这使某一层模型只需要学习输入与输出之间的残差(residual),大幅度降低了模型学习的难度。
    直连通路
  3. 残差块使用bottleneck形式,将一个3x3卷积核拆分成一组(1x1,3x3,1x1)卷积核,
    可减少模型参数使用量。
  4. 综合前面3点,ResNet保障了深度神经网路的可训练性,
    并且在深度模型上也可以避免使用过多参数量。

1.2 ResNet缺点

  1. 模型推论速度慢:ResNet50比VGG16还慢。

1.3 「成也深度、败也深度」

04
ResNet-152在ImageNet上达到了5.71% top-5 error,
狠狠甩开VGG-16和GoogLeNet,
上表看起来也是152 > 101 > 50。
那为何不要直叠一个1000层的神经网路呢?
cifar10
上图为ResNet作者在CIFAR-10上的实验结果,
ResNet-1202的表现甚至比ResNet-56还差。


2. tf.keras 程序码

没错,就是这麽简单/images/emoticon/emoticon07.gif
其实就是import不同的模组XD

from tensorflow.keras.applications import ResNet50

def build_model(preModel=ResNet50, num_classes=7):

    
    pred_model = preModel(include_top=False, weights='imagenet',
                          input_shape=(48, 48, 3),
                          pooling='max', classifier_activation='softmax')
    output_layer = Dense(
        num_classes, activation="softmax", name="output_layer")

    model = tf.keras.Model(
        pred_model.inputs, output_layer(pred_model.output))

    model.compile(optimizer=tf.keras.optimizers.Adam(),
                  loss=tf.keras.losses.CategoricalCrossentropy(), metrics=['accuracy'])

    return model

3. 结语

ResNet带给我的启示是这样的:
人们知道模型加深可以提高准确率,
但是加深会有许多困难要克服,
例如:1.参数量变大、2.推论时间变久、3.梯度消失严重、4.硬体设备不足。
这些困难导致模型无法训练成功。
而残差网路+bottleneck看似解决了1.和3.,
但也只是减缓模型加深的带来的困难,而非完全解决。
但是ResNetv2对ResNetv1做了改善,
让模型叠到1001层(ResNet-1001[ours])也能够成功训练。
如下图所示:
cifar10v2


参考资料

  1. https://arxiv.org/abs/1512.03385 (ResNetv1)
  2. https://arxiv.org/abs/1603.05027 (ResNetv2)

<<:  ISBN Barcode Scanner实作 Day 20

>>:  Day10 - 补漏

Day24 测试写起乃 - Guard

Guard 可以帮助你在开发时监听,并启用测试,让你在开发阶段可以顺便跑测试,当然我也是第一次玩XD...

[Day11]什麽是智慧合约?

智慧合约是一种可以让你避免有中间人介入的合约。如果你想要签约买车、买房子,都需要透过仲介、业务销售...

unity 物体按住key后移动和转向

//前後移动,左右转向 private int Speed_run = 5; private int...

Day17 Review周期(Issue Board)

专案运行过程,如何将进行方向维持着,不会像YAMAHA一样乱点技能树呢? 这就需要「时时勤拂拭,莫使...

Day25 - 保护你的状态转移,在 XState 中使用 Guard Transition

还记得我们在 Day 15 曾经介绍过 Guard 吗? 今天要来跟大家分享如何在 XState 中...