pytorch源码解读-3 Inception V3

参考原文:https://blog.csdn.net/sinat_33487968/article/details/83582299

关于inception系列的论文笔记可以查看https://blog.csdn.net/sinat_33487968/article/details/83588372

首先因为有很多卷积的操作是重复的,所以定义了一个BasicConv2d的类,

BasicConv2d:conv+bn

这个类实现了最基本的卷积加上BN的操作,因为in_channels和out_channels是我们可以自己定义的,而且**kwargs的意思是能接收多个赋值,这也意味着我们我可以定义卷积的stride大小,padding的大小等等。我们将会在下面的inception模块中不断复用这个类

然后inception系列的网络架构最最重点的当然是module的构建,这里实现了inceptionA~E五种不同结构的inception  module,但是我发现并没有在原论文里面完全一样,可能是实现的时候修改了吧。不管怎么样,module的样子大概就是下图这样:


inception A

来看看这个inceptionA。这里的结构大致是一个module里面有四个分支,__init__里面就是结构的定义。第一个分支是branch1,只有一个1*1的卷积;第二个分支是两个5*5的卷积;第三个分支是三个3*3的卷积;而第四个分支没有卷积,是一个简单的pooling。你可能会有疑问为什么不同的卷积核的输出大小是一样大,因为这里特别的针对每个分支有不同的padding(零填充),然后每个分支stride的步数都为1,最后就回输出大小相同的卷积结果。

值得我们注意的是最后outputs = [branch1x1, branch5x5, branch3x3dbl, branch_pool]这个操作就是将不同的分支都concaternation相结合在一起。

值得我们注意的是最后outputs = [branch1x1, branch5x5, branch3x3dbl, branch_pool]这个操作就是将不同的分支都concaternation相结合在一起。

Inception A

同理其他的module也是大同小异,这里就不多说.

下图是v1版本的完整结构图

inception V1

我们来看一下特别的network in network 结构,这里的意思是有一个特殊的module它里面有两重分支。在这里这个分支叫InceptionE。下面完整的代码可以看到在第二个分支self.branch3x3_1后面有两个层self.branch3x3_2a和self.branch3x3_2b,他们就是在第一层传递之后第二层分叉了,最后又在重点结合在一起。怎么做到的呢?


inception E、


此外还有一个比较特殊的结构是辅助分类结构,这就是在完整网络中间某层输出结果以一定的比例添加到最终结果分类的意思。他跟网络最后的分类是类似的,只是他是在中间分支出来的辅助结果。结构是卷积到一层线性分类,没有之前VGG版本Alexnet版本的全连接,参数大大减少。


辅助分类结构

你可能感兴趣的:(pytorch源码解读-3 Inception V3)