镜像问题:tensorflow 卷积:设定特定卷积核

动机:

有时候我们希望对神经网络得到的张量进行特定的卷积操作,如求梯度,求边缘等。

或者,有时我们希望把图像进行预处理操作后输入神经网络,而这个预处理可以用卷积操作实现,如求梯度或高斯滤波。我们希望这个卷积操作在GPU上执行,这样可以加快运行速度。

这就需要我们在pytorch中进行自定义的卷积核卷积。

困难:

在常用的pytorch的卷积操作中,只有卷积核的尺寸和通道信息,且定义的卷积核是可训练的变量,无法实现卷积核订制,且保持不变

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

解决方法:

幸运的是,torch.nn.functional.conv2d 可以实现卷积核订制。

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

该函数的参数如下:

  • input – input tensor of shape (minibatch,in_channels,iH,iW) # [N,C,H,W]

  • weight – filters of shape(out_channels,in_channels​,kH,kW) # [C_out,C_in,kH,kW]

  • bias – optional bias tensor of shape (out_channels) . Default: None

  • stride – the stride of the convolving kernel. Can be a single number or a tuple (sH, sW). Default: 1

  • padding – implicit paddings on both sides of the input. Can be a single number or a tuple (padH, padW). Default: 0

  • dilation – the spacing between kernel elements. Can be a single number or a tuple (dH, dW). Default: 1

  • groups – split input into groups, \text{in\_channels}in_channels should be divisible by the number of groups. Default: 1

注意事项:

在torch.nn.functional.conv2d中,input.shape=[B,C,H,W],卷积核weight.shape=[out_channels,in_channels,h,w]。这与tensorflow中的习惯不同。

如果输入的数据的shape=[B,C,H,W],可使用 tensor.permute()操作进行张量维度的重新排列。

应用示例:

import cv2
import torch
import torch.nn as nn
import torch.nn.functional as Fimport numpy as np
import matplotlib.pyplot as pltdef gradient_blur_bhwc(input_bhwc):""":param     input_bhwc: shape=[B,H,W,C]:return:   grad_x_bhwc: x方向梯度图,shape = [B,H,W-1,1]grad_y_bhwc:y方向梯度图,shape = [B,H-1,W,1]"""in_channel = input_bhwc.size()[-1]input_bchw = input_bhwc.permute(0,3,1,2)filter_x = torch.tensor([[[[-1., 1.]]] * in_channel], dtype=torch.float32)  # [outchannel,in_channel,h,w]=>[1,3,1,2]filter_y = torch.tensor([[[[-1.], [1.]]] * in_channel],dtype=torch.float32)  # [outchannel,in_channel,h,w]=>[1,3,2,1]grad_x_bhwc = F.conv2d(input_bchw, weight=filter_x, stride=1).permute(0,2,3,1)grad_y_bhwc = F.conv2d(input_bchw, weight=filter_y, stride=1).permute(0,2,3,1)return grad_x_bhwc,grad_y_bhwcdef gradient_blur_bchw(input_bchw):""":param      input_bchw: shape=[B,C,H,W]:return:  grad_x_bchw: x方向梯度图,shape = [B,1,H,W-1]grad_y_bchw:y方向梯度图,shape = [B,1,H-1,W]"""in_channel = input_bchw.size()[1]filter_x = torch.tensor([[[[-1., 1.]]] * in_channel], dtype=torch.float32)  # [outchannel,in_channel,h,w]=>[1,3,1,2]filter_y = torch.tensor([[[[-1.], [1.]]] * in_channel],dtype=torch.float32)  # [outchannel,in_channel,h,w]=>[1,3,2,1]grad_x_bchw = F.conv2d(input_bchw, weight=filter_x, stride=1)grad_y_bchw = F.conv2d(input_bchw, weight=filter_y, stride=1)return grad_x_bchw, grad_y_bchwinput_bhwc = torch.tensor(np.expand_dims(cv2.imread("001.jpg"),axis=0),dtype=torch.float32) # b,h,w,c
input_bchw = input_bhwc.permute(0,3,1,2)
grad_x_bchw, grad_y_bchw = gradient_blur_bchw(input_bchw)# 可视化
print(grad_x_bchw.shape,grad_y_bchw.shape)
plt.figure()
plt.subplot(131)
plt.imshow(input_bhwc[0,...]/255.,cmap='gray')
plt.subplot(132)
plt.imshow(grad_x_bchw[0,0,...],cmap='gray')
plt.subplot(133)
plt.imshow(grad_y_bchw[0,0,...],cmap='gray')
plt.show()

参考:pytorch 自定义高斯核进行卷积操作

pytorch 自定义卷积核进行卷积--卷积核订制相关推荐

  1. pytorch自定义卷积核权值参数

    pytorch中构建卷积层一般使用nn.Conv2d方法,有些情况下我们需要自定义卷积核的权值weight,而nn.Conv2d中的卷积参数是不允许自定义的,此时可以使用torch.nn.functi ...

  2. PyTorch 自定义卷积核「数据」

    在做一些模型分析的时候可能需要将卷积核内的参数定制化(eg:全为1),此时就没办法直接使用模型中定义好的卷积了,需要将其数据给修改下方能使用,但是其输入输出通道以及卷积核大小需要留用,在此就可以单独的 ...

  3. python pytorch fft_PyTorch 中的傅里叶卷积实现示例

    卷积 卷积在数据分析中无处不在.几十年来,它们一直被用于信号和图像处理.最近,它们成为现代神经网络的重要组成部分.如果你处理数据的话,你可能会遇到错综复杂的问题. 数学上,卷积表示为: 尽管离散卷积在 ...

  4. 基于Pytorch再次解读NiN现代卷积神经网络和批量归一化

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

  5. 基于Pytorch再次解读DenseNet现代卷积神经网络

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

  6. 基于Pytorch再次解读LeNet-5现代卷积神经网络

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

  7. 基于Pytorch再次解读ResNet现代卷积神经网络

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

  8. 基于Pytorch再次解析AlexNet现代卷积神经网络

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

  9. 基于Pytorch再次解读GoogLeNet现代卷积神经网络

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

最新文章

  1. mysql与ofbiz,ofbiz+mysql安装求教
  2. .Net使用SignalR实现消息推送功能预研及Demo
  3. [转] linux下.tar .gz .tgz .bz2 .bz等解、压包命令详解
  4. codeforces 数论分析题
  5. ahp层次分析法matlab代码_(案例)AHP层次决策分析Matlab编码计算
  6. javascript与php数据交换之json
  7. 没有人能拒绝这个网站,没有人!
  8. Python之linspace函数
  9. Web浏览器与Web服务器之间的通信过程
  10. 西门子s7-200的PLC编程软件,帮助程序无法打开问题解决方法
  11. 15、作用域public、private、protected 以及不写时的区别
  12. 植物免疫研究与抗病虫绿色防控:进展、机遇与挑战
  13. Unity_线性空间
  14. 邮箱客户端程序的实现
  15. html5闪光效果,css特效-一道闪光在图片上划过
  16. 如何解决wup.exe文件占用cpu资源,彻底删除
  17. HDU 4416 后缀自动机
  18. 开源的.Net IDE :SharpDevelop
  19. 俗话说:十赌九输。因为大多数赌局的背后都藏有阴谋。不过也不尽然,有些赌局背后藏有的是:“阳谋”。
  20. 汽车销售管理系统 c语言版 课程设计,汽车销售管理系统c语言版.docx

热门文章

  1. Make 是甚麼以及它的用法
  2. python 实现 浏览器页面转图片
  3. 山东大学2019年操作系统试题(回忆)
  4. Unity3D 官方文档 UGUI总览 可互动组件的介绍
  5. oracle数据库初始化失败怎么办,oracle数据库正常停止
  6. sddlm oracle rac,关于oracle的RAC
  7. EDIUS出错,打开后一直出现该内存不能为read
  8. 汇编语言学习笔记(十二)-浮点指令
  9. 从国足1:5输泰国看项目管理之责任该有谁负
  10. 居民消费价格指数变化新鲜出炉,这类商品同比涨幅最大