Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
作者:zcyanqiu 发布时间:2021-12-24 13:28:27
今天在看文档的时候,发现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) – 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
这个文档中的公式对我来说,并不能看的清楚
一通道卷积核卷积过程:
比如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 中的展示为
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
来源:https://zhuanlan.zhihu.com/p/32190799
猜你喜欢
- 引子上下文管理器是一种简化代码的有力方式,其内部也蕴含了很多Python的编程思想,今天我们就来探究一下Python的上下文管理器。大家之前
- 本文详细介绍了asp中如何使用sql语句删除数据库中的记录,初学asp者来看看!1,首先要明确删除哪条记录无非还就是SQL语句了,比如对应到
- Web2.0时代,体验式营销,体验式网站设计开始走向主流,那么体验式网站到底意味着什么?具体表现在那些地方?周末,根据建站的一点经验和观察,
- 星爷的一部“国产007”应该是无人不晓,其中一个片段是将“007”向MM展示他的秘密武器。皮鞋可以吹头发,大哥大可以刮胡子……把真实功能隐蔽
- 本文实例讲述了php中常量DIRECTORY_SEPARATOR用法。分享给大家供大家参考。具体如下:DIRECTORY_SEPARATOR
- 元编程,一个听起来特别酷的词,强大的Lisp在这方面是好手,对于Python,尽管没有完善的元编程范式,一些天才的开发者还是创作了很多元编程
- asp之家注:asp中FSO组件的功能很强大,如果没有FSO很难想象ASP会变成什么样。对于学习asp编程的朋友一定会接触到FSO相关的操作
- 前言:大概一年前写的,前段时间跑了下,发现还能用,就分享出来了供大家学习,代码的很多细节不太记得了,也尽力做了优化。因为毕竟是微博,反爬技术
- 对于python2.7字符串在Python2.7内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,
- Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下:Tkinter: Tkinter 模块(Tk 接口)是 P
- 1.列表:list# 1.list:Python内置的一种数据类型,列表;# 2.list是一种有序的集合,可以随时添加和删除其中的元素;#
- python标准库syssys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运行时配置以及资源,从而可以与前当程
- 如何制作关联的下拉菜单?看看代码:<form name=f1 METHOD="POST">
- SELECT语句具有种类繁多的各类选项,这些选项可以用来控制数据返回的方式。这些选项以子句、关键词和函数的形式存在。 子句是一种修改结果的语
- 隐藏并修改文件的最后修改时间的asp-webshell。源码:<% '隐藏并修改文件的最后修改时间的aspshell '
- 所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,而且一旦被访问后,结果将会被缓存起来,不用每次都计算。
- Gtalk 软件的最下方有个很好又很实用的功能,就是 Gmail 邮件提醒功能。会定时更新你 Gmail 中未读新邮件的数量。试想
- 一、前言本文使用的是 kaggle 猫狗大战的数据集:https://www.kaggle.com/c/dogs-vs-cats/data训
- 在PyQt5教程的这一部分,我们将讨论拖放操作。在电脑图形用户界面,拖放事件就是点击一个虚拟对象,并将其拖动到其他位置或到另一个虚拟物体的动
- 如何在SQL2000的查询中使用XML-Data?具体程序如下:orders.asp<%@ Language=VBScrip