Dilated convolution空洞卷积的理解以及Pytorch实现

Dilated convolution空洞卷积的理解以及Pytorch实现,第1张

       DilatedDilated convolution:空洞卷积或者扩张卷积(同 Atrous convolutionconvolution)

       Dialted convolution最先在使用图像分割领域,图像输入到CNN中提取特征(如FCN),FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同尺旁时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测(upsampling一般采用deconv反卷积 *** 作,deconv可参见知乎答案 如何理陪困颤解深度学习中的deconvolution networks? )总结来说:包括pooling *** 作增加感受野和Upsampling扩大至原图尺寸。但是此过程中会由于Pooling *** 作产生信息的损失,不利于分割或者目标检测。Dilated convolution就是为了在不是用pooling *** 作损失信息也能增加感受野。

        Dilated 示意图如下:

        概念介绍:空洞卷积的rate,代表传统卷积核的相邻之间插入rate-1个空洞数。当rate=1时,相当于传统的卷积核。

       从两个角度考虑空洞卷积:

     (1)从kernel(卷积核)角度:相当于在标准概念的kernel(卷积核)中,相邻点之间添加rate-1个0,然后使用扩张后的kernel(卷积核)与原图进行卷积。如下图rate=2,相当于标准的3*3卷积核变为5*5卷积核,每一行中间添加2-1个0

     (2)从原图角度:使用标准概念的kernel(卷积核)在原图中每隔rate-1进行像素点卷积采样。如下图rate=2,在原图中每隔rate-1进行卷积。

        F*F的Feature map经过kernel size(k),padding(p), stride(s), rate(r) Dilated convolution卷积输出的大小:

        使用标准卷积的计算为:

        使用Dilated卷积的计算公式为:

        例子:7*7的feature map,kernel size = 3, padding = 0,stride = 1,rate =2

        标准卷积后大小F为(7-3+0)/1+1 = 5,Dilated卷积后大小F为[7-(3+2*1)+0]/1+1=3

        在Pytorch中可以在torch.nn.Conv2D(,,,,,,,dilated=rate)实现。

        上述例子使用Pytorch实现过程如下:

  芦败       知乎:如何理解空洞卷积(dilated convolution)?

        https://blog.csdn.net/silence2015/article/details/79748729

pytorch保存模型非常简单,主要有两种方法:

一般地,采用一条语句即可保存参数

其中model指定义的模型 实例变量 ,如 model=vgg16( ), path是保存参数的路径,如 path='./model.pth' , path='./model.tar', path='./model.pkl', 保存参数的文件一定要有后缀扩展名。

特别地,如果还想保存某一次训练采用的优化器、epochs等信息,可将这些信息组合起来构成一个字典,然后将字典保存起来:

针对上述第一种情况,也只需要一句即可加载模型:

针对上述第二种以字典形式保存的方法,加载方式如下:

需要注意的是,只保存参数的方法在加载的时候要事先定义好跟原模型一致的模型,并在该模型的实例对象(假设名为model)上进行加载,即在使用上述隐并老加载语句前已经有定义了一个和原模型一样的Net, 并且进行了实例化 model=Net( ) 。

另外,如果每一个epoch或每n个epoch都要保存一次参数,可设置不同的path,如 path='./model' + str(epoch) +'.pth',这样,不同epoch的参数就能保存在不同的文件中,选择保存识别率最大的模型参数也一样,只需在保存模型语句前加个if判断语句即可。

下面给出一个具体的例子程序,该程灶升序只保存最新的参数:

在训练模型的时候可能会因为一些问题导致程序中断,或者常常需要观察训练情况的变化来更改学习率等参数,这时候就需要加载中断前保存的模型,并在此基础上继续训练,这时蔽兆候只需要对上例中的 main() 函数做相应的修改即可,修改后的 main() 函数如下:

以上方法,如果想在命令行进行 *** 作执行,都只需加入argpase模块参数即可,相关方法可参考我的 博客

用法可参照上例。

这篇博客是一个快速上手指南,想深入了解PyTorch保存和加载模型中的相关函数和方法,请移步我的这篇博客: PyTorch模型保存深入理解


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12314132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存