pytorch 自定义卷积核进行卷积操作方式

 更新时间:2019年12月30日 15:23:30   作者:月亮是蓝色  
今天小编就为大家分享一篇pytorch 自定义卷积核进行卷积操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

一 卷积操作:在pytorch搭建起网络时,大家通常都使用已有的框架进行训练,在网络中使用最多就是卷积操作,最熟悉不过的就是

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

通过上面的输入发现想自定义自己的卷积核,比如高斯核,发现是行不通的,因为上面的参数里面只有卷积核尺寸,而权值weight是通过梯度一直更新的,是不确定的。

二 需要自己定义卷积核的目的:目前是需要通过一个VGG网络提取特征特后需要对其进行高斯卷积,卷积后再继续输入到网络中训练。

三 解决方案。使用

torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

这里注意下weight的参数。与nn.Conv2d的参数不一样

可以发现F.conv2d可以直接输入卷积的权值weight,也就是卷积核。那么接下来就要首先生成一个高斯权重了。这里不直接一步步写了,直接输入就行。

kernel = [[0.03797616, 0.044863533, 0.03797616],
     [0.044863533, 0.053, 0.044863533],
     [0.03797616, 0.044863533, 0.03797616]]

四 完整代码

class GaussianBlur(nn.Module):
  def __init__(self):
    super(GaussianBlur, self).__init__()
    kernel = [[0.03797616, 0.044863533, 0.03797616],
         [0.044863533, 0.053, 0.044863533],
         [0.03797616, 0.044863533, 0.03797616]]
    kernel = torch.FloatTensor(kernel).unsqueeze(0).unsqueeze(0)
    self.weight = nn.Parameter(data=kernel, requires_grad=False)
 
  def forward(self, x):
    x1 = x[:, 0]
    x2 = x[:, 1]
    x3 = x[:, 2]
    x1 = F.conv2d(x1.unsqueeze(1), self.weight, padding=2)
    x2 = F.conv2d(x2.unsqueeze(1), self.weight, padding=2)
    x3 = F.conv2d(x3.unsqueeze(1), self.weight, padding=2)
    x = torch.cat([x1, x2, x3], dim=1)
    return x

这里为了网络模型需要写成了一个类,这里假设输入的x也就是经过网络提取后的三通道特征图(当然不一定是三通道可以是任意通道)

如果是任意通道的话,使用torch.expand()向输入的维度前面进行扩充。如下:

  def blur(self, tensor_image):
    kernel = [[0.03797616, 0.044863533, 0.03797616],
        [0.044863533, 0.053, 0.044863533],
        [0.03797616, 0.044863533, 0.03797616]]
    
    min_batch=tensor_image.size()[0]
    channels=tensor_image.size()[1]
    out_channel=channels
    kernel = torch.FloatTensor(kernel).expand(out_channel,channels,3,3)
    self.weight = nn.Parameter(data=kernel, requires_grad=False)
 
    return F.conv2d(tensor_image,self.weight,1,1)

以上这篇pytorch 自定义卷积核进行卷积操作方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python实现微信机器人的方法

    Python实现微信机器人的方法

    这篇文章主要介绍了Python实现微信机器人的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Python爬取数据保存为Json格式的代码示例

    Python爬取数据保存为Json格式的代码示例

    今天小编就为大家分享一篇关于Python爬取数据保存为Json格式的代码示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 基于opencv对高空拍摄视频消抖处理方法

    基于opencv对高空拍摄视频消抖处理方法

    这篇文章主要介绍了基于opencv对高空拍摄视频消抖处理,首先对视频进行抽第一帧与最后一帧,为什么抽取两帧?这样做的主要目的是,我们在做帧对齐时,使用帧中静态物的关键点做对齐,需要的朋友可以参考下
    2022-10-10
  • python破解zip加密文件的方法

    python破解zip加密文件的方法

    这篇文章主要介绍了python破解zip加密文件的方法,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2018-05-05
  • Python实现爬取亚马逊数据并打印出Excel文件操作示例

    Python实现爬取亚马逊数据并打印出Excel文件操作示例

    这篇文章主要介绍了Python实现爬取亚马逊数据并打印出Excel文件操作,结合实例形式分析了Python针对亚马逊图书数据的爬取操作,以及数据打印输出Excel相关实现技巧,需要的朋友可以参考下
    2019-05-05
  • python中kmeans聚类实现代码

    python中kmeans聚类实现代码

    这篇文章主要为大家详细介绍了python中kmeans聚类的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 深入理解Pytorch中的torch. matmul()

    深入理解Pytorch中的torch. matmul()

    这篇文章主要介绍了Pytorch中的torch. matmul()的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • PYQT5实现控制台显示功能的方法

    PYQT5实现控制台显示功能的方法

    今天小编大家分享一篇PYQT5实现控制台显示功能的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python绘制堆叠条形图介绍

    python绘制堆叠条形图介绍

    大家好,本篇文章主要讲的是python绘制堆叠条形图介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Python 字符串、列表、元组的截取与切片操作示例

    Python 字符串、列表、元组的截取与切片操作示例

    这篇文章主要介绍了Python 字符串、列表、元组的截取与切片操作,结合实例形式分析了Python针对字符串、列表、元组的截取与切片相关操作技巧,需要的朋友可以参考下
    2019-09-09

最新评论