ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ResNet50结构

2021-07-06 07:01:16  阅读:278  来源: 互联网

标签:ResNet50 卷积 shortcut 64 128 256 block 结构


ResNet50结构

ResNet简介

随着网络的加深,出现了训练集准确率下降的现象,可以确定这不是由于Overfit过拟合造成的(过拟合的情况训练集应该准确率很高);针对这个问题提出了一种全新的网络,称为深度残差网络,允许网络尽可能的加深,其中引入了全新的结构如图。

 

 

 残差指的是什么?

其中ResNet提出了两种mapping:一种是identity mapping,指的就是图中”弯弯的曲线”,另一种residual mapping,指的就是除了”弯弯的曲线“那部分,所以最后的输出是 y= F(x)+x

identity mapping顾名思义,指本身,也就是公式中的x,而residual mapping指的是“差”,也就是y−x,所以残差指的就是F(x)部分。

resnet50详解

block_sizes=[3, 4, 6, 3]指的是stage1(first pool)之后的4个layer的block数, 分别对应res2, res3, res4, res5。

    每一个layer的第一个block在shortcut上做conv+BN, 即Conv Block

inputs: (1, 720, 1280, 3)

initial_conv:

    conv2d_fixed_padding()

    1. kernel_size=7, 先做padding(1, 720, 1280, 3) -> (1, 726, 1286, 3)

    2. conv2d kernels=[7, 7, 3, 64], stride=2, VALID 卷积. 7x7的kernel, padding都为3, 为了保证左上角和卷积核中心点对其

       (1, 726, 1286, 3) -> (1, 360, 640, 64)

    3. BN, Relu (只有resnetv1在第一次conv后面做BN和Relu)

initial_max_pool:

    k=3, s=2, padding='SAME', (1, 360, 640, 64) -> (1, 180, 320, 64)

以下均为不使用bottleneck的building_block

block_layer1:

    (有3个block, layer间stride=1(上一层做pool了), 64个filter, 不使用bottleneck(若使用bottleneck 卷积核数量,需乘4))

    1. 第一个block:

    Conv Block有projection_shortcut, 且strides可以等于1或者2

    Identity Block没有projection_shortcut, 且strides只能等于1

        `inputs = block_fn(inputs, filters, training, projection_shortcut, strides, data_format)`

        shortcut做[1, 1, 64, 64], stride=1的conv和BN, shape不变

        然后和主要分支里input做3次卷积后的结果相加, 一起Relu, 注意block里最后一次卷积后只有BN没有Relu

        input:    conv-bn-relu-conv-bn-relu-conv-bn  和shortcut相加后再做relu

        shortcut: conv-bn                           

        shortcut: [1, 1, 64, 64], s=1, (1, 180, 320, 64) -> (1, 180, 320, 64)

        input做两次[3, 3, 64, 64], s=1的卷积, shape不变(1, 180, 320, 64) -> (1, 180, 320, 64) -> (1, 180, 320, 64)

        inputs += shortcut, 再relu

    2. 对剩下的2个block, 每个block操作相同:

        `inputs = block_fn(inputs, filters, training, None, 1, data_format)`

        shortcut直接和input卷积结果相加, 不做conv-bn

        input做两次[3, 3, 64, 64], s=1的卷积, shape不变(1, 180, 320, 64) -> (1, 180, 320, 64) -> (1, 180, 320, 64)

        inputs += shortcut, 再relu

block_layer2/3/4同block_layer1, 只是每个layer的identity block数量不同, 卷积核数量和layer间stride也不同, 不过仍然只有第一个conv block的shortcut做conv-bn

block_layer2: 4个block, 128个filter, layer间stride=2 (因为上一层出来后没有pool)

    1. 第一个block:

        对shortcut做kernel=[1, 1, 64, 128], s=2的conv和BN, (1, 180, 320, 64) -> (1, 90, 160, 128)

        对主要分支先做kernel=[3, 3, 64, 128], s=2的卷积, padding='VALID', (1, 180, 320, 64) -> (1, 90, 160, 128)

                再做kernel=[3, 3, 128, 128], s=1的卷积, padding='SAME', (1, 90, 160, 128) -> (1, 90, 160, 128)

    2. 剩下的3个block, 每个block操作相同:

        shortcut不操作直接和结果相加做Relu

        对主要分支做两次[3, 3, 128, 128], s=1的卷积, padding='SAME', (1, 90, 160, 128) -> (1, 90, 160, 128) -> (1, 90, 160, 128)

block_layer3: 6个block, 256个filter, layer间stride=2

    1. 第一个block:

        对shortcut做kernel=[1, 1, 128, 256], s=2的conv和BN, (1, 90, 160, 128) -> (1, 45, 80, 256)

        对主要分支先做kernel=[3, 3, 128, 256], s=2的卷积, padding='VALID', (1, 90, 160, 128) -> (1, 45, 80, 256)

                再做kernel=[3, 3, 256, 256], s=1的卷积, padding='SAME', (1, 45, 80, 256) -> (1, 45, 80, 256)

    2. 剩下的5个block, 每个block操作相同:

        shortcut不操作直接和结果相加做Relu

        对主要分支做两次[3, 3, 256, 256], s=1的卷积, padding='SAME', (1, 45, 80, 256) -> (1, 45, 80, 256) -> (1, 45, 80, 256)

block_layer4: 3个block, 512个filter, layer间stride=2

    1. 第一个block:

        对shortcut做kernel=[1, 1, 256, 512], s=2的conv和BN, (1, 45, 80, 256) -> (1, 23, 40, 512)

        对主要分支先做kernel=[3, 3, 256, 512], s=2的卷积, padding='VALID', (1, 45, 80, 256) -> (1, 23, 40, 512)

                再做kernel=[3, 3, 512, 512], s=1的卷积, padding='SAME', (1, 23, 40, 512) -> (1, 23, 40, 512)

    2. 剩下的2个block, 每个block操作相同:

        shortcut不操作直接和结果相加做Relu

        对主要分支做两次[3, 3, 512, 512], s=1的卷积, padding='SAME', (1, 23, 40, 512) -> (1, 23, 40, 512)

avg_pool, 7*7

FC, output1000

softmax

输出prediction

Resnet-18,Resnet-50,等等,不过是层数不一罢了,如下图,惯用的是Resnet-50与101

 

 

 如下图,每个大block里面的

第一个都是IN !==OUT情况,左侧支线,命名为:Conv Block

其他都是    IN  ==OUT情况,右侧支线,   命名为:ID      Block

3 = 左+右+右

4 = 左+右+右+右

6 = 左+右+右+右+右+右

3 = 左+右+右

 

 

 

 

 resnet50图解

 

 

  

参考链接:

https://blog.csdn.net/zjc910997316/article/details/102912175

https://blog.csdn.net/lanran2/article/details/79057994

https://www.cnblogs.com/qianchaomoon/p/12315906.html

 

标签:ResNet50,卷积,shortcut,64,128,256,block,结构
来源: https://www.cnblogs.com/wujianming-110117/p/14975136.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有