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实现获取序列中最小的几个元素
Sep 25 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
python 用下标截取字符串的实例
Dec 25 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
利用Python代码实现一键抠背景功能
Dec 29 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
Jan 08 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
如何使用python传入不确定个数参数
Feb 18 Python
python实现四人制扑克牌游戏
Apr 22 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
Python+OpenCV图像处理——图像二值化的实现
Oct 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
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
JavaScript 序列化对象实现代码
2009/12/18 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
vue解决使用$http获取数据时报错的问题
2019/10/30 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
python可视化实现KNN算法
2019/10/16 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
python 将html转换为pdf的几种方法
2020/12/29 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
幼师自荐信范文
2013/10/06 职场文书
高级护理专业毕业生推荐信
2013/12/25 职场文书
2014年库房工作总结
2014/11/26 职场文书
小学优秀教师材料
2014/12/15 职场文书
学生不参加考试检讨书
2015/02/19 职场文书