侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)

Python  /  管理员 发布于 5年前   517

今天在看文档的时候,发现pytorch 的conv操作不是很明白,于是有了一下记录

首先提出两个问题:

1.输入图片是单通道情况下的filters是如何操作的? 即一通道卷积核卷积过程

2.输入图片是多通道情况下的filters是如何操作的? 即多通道多个卷积核卷积过程

这里首先贴出官方文档:

classtorch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)[source]

Parameters:

in_channels (int) C Number of channels in the input image
out_channels (int) C Number of channels produced by the convolution
kernel_size (intortuple) C Size of the convolving kernel
stride (intortuple,optional) C Stride of the convolution. Default: 1
padding (intortuple,optional) C Zero-padding added to both sides of the input. Default: 0
dilation (intortuple,optional) C Spacing between kernel elements. Default: 1
groups (int,optional) C Number of blocked connections from input channels to output channels. Default: 1
bias (bool,optional) C If True, adds a learnable bias to the output. Default: True

这个文档中的公式对我来说,并不能看的清楚

一通道卷积核卷积过程:

比如32个卷积核,可以学习32种特征。在有多个卷积核时,如下图所示:输出就为32个feature map

也就是, 当conv2d( in_channels = 1 , out_channels = N)

有N个filter对输入进行滤波。同时输出N个结果即feature map,每个filter滤波输出一个结果.

import torchfrom torch.autograd import Variable##单位矩阵来模拟输入input=torch.ones(1,1,5,5)input=Variable(input)x=torch.nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,groups=1)out=x(input)print(out)print(list(x.parameters()))

输出out的结果和conv2d 的参数如下,可以看到,conv2d是有3个filter加一个bias

# out的结果Variable containing:(0 ,0 ,.,.) =  -0.3065 -0.3065 -0.3065 -0.3065 -0.3065 -0.3065 -0.3065 -0.3065 -0.3065(0 ,1 ,.,.) =  -0.3046 -0.3046 -0.3046 -0.3046 -0.3046 -0.3046 -0.3046 -0.3046 -0.3046(0 ,2 ,.,.) =  0.0710 0.0710 0.0710 0.0710 0.0710 0.0710 0.0710 0.0710 0.0710[torch.FloatTensor of size 1x3x3x3]# conv2d的参数[Parameter containing:(0 ,0 ,.,.) =  -0.0789 -0.1932 -0.0990 0.1571 -0.1784 -0.2334 0.0311 -0.2595 0.2222(1 ,0 ,.,.) =  -0.0703 -0.3159 -0.3295 0.0723 0.3019 0.2649 -0.2217 0.0680 -0.0699(2 ,0 ,.,.) =  -0.0736 -0.1608 0.1905 0.2738 0.2758 -0.2776 -0.0246 -0.1781 -0.0279[torch.FloatTensor of size 3x1x3x3], Parameter containing: 0.3255-0.0044 0.0733[torch.FloatTensor of size 3]]

验证如下,因为是单位矩阵,所以直接对参数用sum()来模拟卷积过程:

f_p=list(x.parameters())[0]f_p=f_p.data.numpy()print("the result of first channel in image:", f_p[0].sum()+(0.3255))

可以看到结果是和(0 ,0 ,.,.) = -0.3065 ....一样的. 说明操作是通过卷积求和的.

the result of first channel in image: -0.306573044777

多通道卷积核卷积过程:

下图展示了在四个通道上的卷积操作,有两个卷积核,生成两个通道。其中需要注意的是,四个通道上每个通道对应一个卷积核,先将w2忽略,只看w1,那么在w1的某位置(i,j)处的值,是由四个通道上(i,j)处的卷积结果相加得到的。 所以最后得到两个feature map, 即输出层的卷积核核个数为 feature map 的个数。

在pytorch 中的展示为

conv2d( in_channels = X(x>1) , out_channels = N)

有N乘X个filter(N组filters,每组X 个)对输入进行滤波。即每次有一组里X个filter对原X个channels分别进行滤波最后相加输出一个结果,最后输出N个结果即feature map。

验证如下:

##单位矩阵来模拟输入input=torch.ones(1,3,5,5)input=Variable(input)x=torch.nn.Conv2d(in_channels=3,out_channels=4,kernel_size=3,groups=1)out=x(input)print(list(x.parameters()))

可以看到共有4*3=12个filter 和一个1×4的bias 作用在这个(3,5,5)的单位矩阵上

## out输出的结果Variable containing:(0 ,0 ,.,.) =  -0.6390 -0.6390 -0.6390 -0.6390 -0.6390 -0.6390 -0.6390 -0.6390 -0.6390(0 ,1 ,.,.) =  -0.1467 -0.1467 -0.1467 -0.1467 -0.1467 -0.1467 -0.1467 -0.1467 -0.1467(0 ,2 ,.,.) =  0.4138 0.4138 0.4138 0.4138 0.4138 0.4138 0.4138 0.4138 0.4138(0 ,3 ,.,.) =  -0.3981 -0.3981 -0.3981 -0.3981 -0.3981 -0.3981 -0.3981 -0.3981 -0.3981[torch.FloatTensor of size 1x4x3x3]## x的参数设置[Parameter containing:(0 ,0 ,.,.) =  -0.0803 0.1473 -0.0762 0.0284 -0.0050 -0.0246 0.1438 0.0955 -0.0500(0 ,1 ,.,.) =  0.0716 0.0062 -0.1472 0.1793 0.0543 -0.1764 -0.1548 0.1379 0.1143(0 ,2 ,.,.) =  -0.1741 -0.1790 -0.0053 -0.0612 -0.1856 -0.0858 -0.0553 0.1621 -0.1822(1 ,0 ,.,.) =  -0.0773 -0.1385 0.1356 0.1794 -0.0534 -0.1110 -0.0137 -0.1744 -0.0188(1 ,1 ,.,.) =  -0.0396 0.0149 0.1537 0.0846 -0.1123 -0.0556 -0.1047 -0.1783 -0.0630(1 ,2 ,.,.) =  0.1850 0.0325 0.0332 -0.0487 0.0018 0.1668 0.0569 0.0267 0.0124(2 ,0 ,.,.) =  0.1880 -0.0152 -0.1088 -0.0105 0.1805 -0.0343 -0.1676 0.1249 0.1872(2 ,1 ,.,.) =  0.0299 0.0449 0.1179 0.1280 -0.1545 0.0593 -0.1489 0.1378 -0.1495(2 ,2 ,.,.) =  -0.0922 0.1873 -0.1163 0.0970 -0.0682 -0.1110 0.0614 -0.1877 0.1918(3 ,0 ,.,.) =  -0.1257 -0.0814 -0.1923 0.0048 -0.0789 -0.0048 0.0780 -0.0290 0.1287(3 ,1 ,.,.) =  -0.0649 0.0773 -0.0584 0.0092 -0.1168 -0.0923 0.0614 0.1159 0.0134(3 ,2 ,.,.) =  0.0426 -0.1055 0.1022 -0.0810 0.0540 -0.1011 0.0698 -0.0799 -0.0786[torch.FloatTensor of size 4x3x3x3], Parameter containing:-0.1367-0.0410 0.0424 0.1353[torch.FloatTensor of size 4]]

因为是单位矩阵,所以直接对参数用sum()来模拟卷积过程,结果-0.639065589142 与之前的out结果的(0 ,0 ,.,.) = -0.6390 相同, 即conv2d 是通过利用4组filters,每组filter对每个通道分别卷积相加得到结果。

f_p=list(x.parameters())[0]f_p=f_p.data.numpy()print(f_p[0].sum()+(-0.1367))-0.639065589142

再更新

import torchfrom torch.autograd import Variableinput=torch.ones(1,1,5,5)input=Variable(input)x=torch.nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,groups=1)out=x(input)f_p=list(x.parameters())[0]f_p=f_p.data.numpy()f_b=list(x.parameters())[1]f_b=f_b.data.numpy()print("output result is:", out[0][0])print("the result of first channel in image:", f_p[0].sum()+f_b[0])

output result is: Variable containing:
0.6577 0.6577 0.6577
0.6577 0.6577 0.6577
0.6577 0.6577 0.6577
[torch.FloatTensor of size 3x3]

the result of first channel in image: 0.657724

input=torch.ones(1,3,5,5)input=Variable(input)print(input.size())x=torch.nn.Conv2d(in_channels=3,out_channels=4,kernel_size=3,groups=1)out=x(input)f_p=list(x.parameters())[0]f_b=list(x.parameters())[1]f_p=f_p.data.numpy()f_b=f_b.data.numpy()# print(f_p[...,0])# print(f_p[...,0].shape)# print(f_p[...,0].sum()+f_b[0])print("output result :",out[0][0])print("simlatuate the result:", f_p[0].sum()+f_b[0])

torch.Size([1, 3, 5, 5])
output result : Variable containing:
-0.2087 -0.2087 -0.2087
-0.2087 -0.2087 -0.2087
-0.2087 -0.2087 -0.2087
[torch.FloatTensor of size 3x3]

simlatuate the result: -0.208715

以上这篇Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    PyTorch中的padding(边缘填充)操作方式
    下一条:
    PyTorch里面的torch.nn.Parameter()详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客