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删除windows垃圾文件的方法
Jul 14 Python
Python实现的快速排序算法详解
Aug 01 Python
python用户管理系统
Mar 13 Python
对numpy的array和python中自带的list之间相互转化详解
Apr 13 Python
Python rstrip()方法实例详解
Nov 11 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
Django基础三之视图函数的使用方法
Jul 18 Python
pip安装python库的方法总结
Aug 02 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
Mar 18 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Python函数调用追踪实现代码
Nov 27 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
php使用GeoIP库实例
2014/06/27 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
分享vue里swiper的一些坑
2018/08/30 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
Python应用库大全总结
2018/05/30 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
python实现自动解数独小程序
2019/01/21 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
浅谈Python type的使用
2019/11/19 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
文员岗位职责
2013/11/09 职场文书
安全承诺书范文
2014/03/26 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
婚纱店策划方案
2014/05/22 职场文书
硕士学位论文评语
2014/12/31 职场文书
2015年外联部工作总结
2015/04/03 职场文书
工作态度怎么写
2015/06/25 职场文书
公司管理建议书
2015/09/14 职场文书
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle