1、主要参考

(1)博主的地址,推荐

Pytorch官方实现的FCN网络结构_哔哩哔哩_bilibili

 (2)博主的github

GitHub - WZMIAOMIAO/deep-learning-for-image-processing: deep learning for image processing including classification and object-detection etc.

(3)另外参考

【深度学习】resnet-50网络结构_何顾长安的博客-CSDN博客_resnet50网络

2、主要原理 

2. 1 FCN基于resnet实现的网络结构

注意:layer3和layer4使用了膨胀卷积 

2.2 对应Resnet50的结构

(1)网络结构图

 (2)网络实现图

 2.3 Resnet50和FCN两者的对应关系

(1)两者层次的对应关系

(2)回顾一下resnet50的layer1和layer2

1)resnet50的layer1

      resnet-50的bottleneck如下,layer1共有3个bottleneck,第2个和第3个block的输入channel为256,注意下图残差结构的升维连接

      也就是resnet50的layer1中的bottleneck重复了下图3次,其中第一次的网络输入是56*56*64,后两次网络的输入是56*56*256。

 2)resnet50的layer2

      resnet-50的layer2第1个bottleneck:identity的卷积核大小应为3x3,为了保证residual前后的shape一致,能够相加,进行了下采样,如下图所示。注意下图残差连接过程中的升维和尺寸缩小,所以s=2(下图有误)

      resnet-50的layer2第2,3,4个bottleneck都如下图所示,注意下图残差结构的直接连接,没有改变维度

 总结,resnet50的layer2的第一个bottleneck先下采样了一次,接下来用了3个一样的bottleneck。

  (3)FCN的layer4和layer5中改变的bottleneck如下:

其中Bottleneck1的残差连接也是等深度的,不有扩充维度s=1

 

2.4 网络输出层

(1)基于resnet50的FCN网络有2个输出层,其中FCN1从layer4引出,如下所示

      注意:最后还原原图大小采用了双线性插值的方法       

(2)其中FCN2从layer3引出训练的时候用到,作用是:防止误差梯度没有办法传递到网络浅层;测试的时候不用;当然训练的时候也可以不用,如下图所示

3. python中__call__函数的使用

参考了

Python class中的__call__()方法_I天辉I的博客-CSDN博客

具体定义:python中,如果在创建class的时候写了call()方法, 那么该class实例化出实例后, 实例名()就是调用call()方法。


class Animal(object):
 
    __call__(self, words):
        print "Hello: ", words
 
if __name__ == "__main__":
    cat = Animal()
    cat("I am cat!")
 
>>> Hello: I am cat!

更多推荐