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


Posted in Python onJanuary 03, 2020

今天在看文档的时候,发现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]

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

Parameters:

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

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

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

一通道卷积核卷积过程:

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

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

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

import torch
from 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.nn.conv2d 过程验证方式(单,多通道卷积过程)

在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 torch
from 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)

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 过程验证方式(单,多通道卷积过程)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python常用列表数据结构小结
Aug 06 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
python利用socketserver实现并发套接字功能
Jan 26 Python
django中静态文件配置static的方法
May 20 Python
python读取并写入mat文件的方法
Jul 12 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
Python中的min及返回最小值索引的操作
May 10 Python
Python使用pandas导入csv文件内容的示例代码
Dec 24 Python
如何基于python实现画不同品种的樱花树
Jan 03 #Python
Python基础之变量基本用法与进阶详解
Jan 03 #Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 #Python
Python实现银行账户资金交易管理系统
Jan 03 #Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 #Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
Jan 03 #Python
python实现上传文件到linux指定目录的方法
Jan 03 #Python
You might like
咖啡语言
2021/03/03 咖啡文化
php header()函数使用说明
2008/07/10 PHP
php SQL Injection with MySQL
2011/02/27 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
JavaScript操作 url 中 search 部分方法函数
2016/06/15 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
angular多语言配置详解
2019/05/16 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
javascrpt密码强度校验函数详解
2020/03/18 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Python实现DDos攻击实例详解
2019/02/02 Python
python英语单词测试小程序代码实例
2019/09/09 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
汽车检测与维修专业求职信
2013/10/30 职场文书
有针对性的求职自荐信
2013/11/14 职场文书
小学三八妇女节活动方案
2014/03/16 职场文书
医院保洁服务方案
2014/06/11 职场文书
高考升学宴答谢词
2015/01/20 职场文书
学生个人总结范文
2015/02/15 职场文书
简历自我评价优缺点
2015/03/11 职场文书
公司年夜饭通知
2015/04/25 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书