PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)

PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)

PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第1张图片

嗨,我是error。

我来记录PyTorch深度学习实践的笔记了,这会是一个系列,后面会慢慢更新。个人之前都是使用tensorflow进行深度学习实践,这是第一次学习Pytorch,若笔记有误欢迎提出纠正!课件采用自B站"刘二大人"老师的视频【传送门】


本文主要记录如何通过pytorch实现经典的resnet和inception模型。

上一篇基础篇我们主要讲述了如何实现线性的CNN模型,即如下图的结构,没有复杂的跳转,也没有嵌套,整个代码结构其实和线性回归颇有相似之处。
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第2张图片

而今天讲的inception模型,也就是GoogLeNet,从整体图上也能看出有很多相似的结构串联,那在编程的过程中我们很自然而然地就会想到利用函数和类来封装结构达到减少代码重复量的作用。
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第3张图片

下面详细介绍每个inception的结构,是这样的,具体设计思路不详细讲解,主要是通过多种类型的卷积核concat最后由反向传播来决定哪个卷积核的作用更好来决定其权重更大。
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第4张图片

我们使用1x1卷积核的作用主要就是减少运算量和降低通道数,由下图可见同样是减少通道数的操作,利用1x1卷积核竟然达到了减少90%运算量的效果。
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第5张图片

这里老师为了更生动的讲解,将inception模型横过来了,利用类来构造,上面一行的self是写在模型的类里面的,下面的调用是在forward函数里面的。
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第6张图片

然后我们将他们都concat在一起,注意要保持长和宽是一致的,因为我们最后是按照通道数c来进行合并的。

PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第7张图片

下面是完整的代码展示
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第8张图片

其中需要特别注意的就是in_channels和out_channels要匹配,不然会报错

为了解决梯度消失问题(主要是因为反向传播求出来的偏导<1,而多个小于1的数相乘会导致前层的参数无法更新),之前有人提出了锁层的操作,也就是训练好那一层后锁住那一层的参数,但对于CNN模型来讲不太现实,因为层数太多了且复杂。
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第9张图片

这次要将的就是Resnet,通过传递一开始的输入值到最后的输出值导致最后的偏导数为原偏导数+1,也就解决了梯度消失的问题。
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第10张图片

但如果要使用这样的结构,很重要的一环就是要确保输入和输出的维度是相同的,不然在最后无法进行相加的操作。
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第11张图片

下面是实现的代码,和上一节的模型很相似,但要注意这里channels数都是相同,确保最后能相加。
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第12张图片

完整代码如下图PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第13张图片

最后老师还推荐了两篇论文供学习

PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第14张图片
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第15张图片
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第16张图片
PyTorch深度学习实践笔记#6 | 卷积神经网络(高级篇)_第17张图片

你可能感兴趣的:(Pytorch学习笔记,深度学习)