原文链接:

【动手学深度学习笔记】之二维卷积层​mp.weixin.qq.com

1.二维卷积层

本节介绍卷积神经网络中最常见的二维卷积层。二维卷积层常用来处理图像数据,它具有两个空间维度(高和宽)。

1.1二维互相关运算

1.1.1原理分析

在二维互相关运算中,卷积窗口从左上角开始,每次向右滑动一列,直到到达最右边,然后回到最左边的列并向下滑动一行,继续重复上面的动作,直到到达右当卷积窗口滑动到某个位置时,窗口中的输入子片段与卷积窗口阵列按元素相乘并求和,并得到排列中相应位置的元素。

听着实在是复杂,看个实例吧。

我们对大小为

的输入二维数组和大小为
的二维核数组(卷积窗口大小)进行二维互相关运算。

根据互相关运算的过程,首先是核排列会和

进行运算

然后向右滑动一列,核排列与

进行运算

上一次卷积窗体已经滑到了最右列,所以现在卷积窗体返回最垂直列并向下滑动一行,核排列与

进行运算

现在卷积窗口滑动到了右下角,核排列与

进行运算

最后将四次运算的数,与窗口同顺序分开在输出二维排列中,得到输出二维排列。

1.1.2程序实现

分析上述过程可知,输出数组的大小与输入数组,核数组存在关系:

式中,

分别为输出数组,输入数组和核数组的行数;
分别为输出数组,输入数组和核数组的列数。

并且横向滑动次数和

相同,初步滑动次数与
相同。

根据数组行列数之间的关系和运算方法,最终程序实现如下。

def cross(X,K):H_i = X.shape[0]W_i = X.shape[1]h = K.shape[0]w = K.shape[1]Y = torch.zeros((H_i-h+1,W_i-w+1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,j] = (X[i:i+h,j:j+w]*K).sum()return Y

现在来构造输入多重和核分布,测试一下互相关运算函数

X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = torch.tensor([[0, 1], [2, 3]])
cross(X, K)

得到输出相对为

tensor([[19., 25.],[37., 43.]])

1.2二维卷积层

窗口形状为

的卷积层。

二维卷积层的模型参数为卷积核(重量)和标量偏差(bias)。训练模型时,同样是线随机初始化模型参数,然后不断更新迭代参数。二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏差来得到输出。

1.2.1实现二维卷积层

class Conv(nn.Module):def __init__(self, kernel_size):super(Conv, self).__init__()#类型为Parameter的tensor自动添加到参数列表self.weight = nn.Parameter(torch.randn(kernel_size))self.bias = nn.Parameter(torch.randn(1))    #只有一组输出,所以只需要一个偏差参数def forward(self, x):#正向传播:互相关运算之后加上偏差return cross(x, self.weight) + self.bias

1.3互相关运算的应用

下面使用二维卷积层检测图像中物体的边缘(发生变化的位置)。

首先初始化一张

的图像,令它的中间四列为黑(0),其余为白(1)。
X = torch.ones(6,8)
X[:,2:6] = 0

输出X为

tensor([[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.]])

然后构造一个大小为

的卷积核K,当它与输入做互相关运算时,如果横向相邻元素相同,输出为0;否则输出为非0。
K = torch.tensor([[1, -1]])

最后使用互相关运算,计算得到输出值。

Y = cross(X, K)

输出数组Y为:

tensor([[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.]])

可以看出,我们将从白到黑的边缘和从黑到白的边缘分别检测到1和-1。其余部分的输出全是0。使用卷积核可以有效地表征局部空间。

1.4二维卷积层的应用

这一部分将使用1.3中的输入数组X和输出数组Y来训练卷积神经网络,最终得到卷积核。

net = Conv(kernel_size = (1,2))
step =20#训练周期
lr = 0.01#学习率for i in range(step):Y_hat = net(X)l = ((Y_hat - Y) ** 2).sum()l.backward()net.weight.grad.fill_(0)net.bias.grad.fill_(0)if (i+1)%5 ==0:print('Step %d, loss %.3f' % (i + 1, l.item()))print("weight:",net.weight.data)
print("bias:",net.bias.data)

各个学习周期的损失为

Step 5, loss 7.531
Step 10, loss 1.380
Step 15, loss 0.304
Step 20, loss 0.076

训练结束后模型参数为

weight: tensor([[ 0.8960, -0.9054]])
bias: tensor([0.0053])

训练得到的参数与真实参数[1,-1]还是比较接近的。

1.5卷积运算

为了得到卷积运算的输出,我们只需将核重叠到左右并排上下,再与输入数组做互相关运算。

1.6特征图和感受野

二维卷积层输出的二维细分可以被预定输入数组在空间尺寸上某一级的表征,也就是特征图。

如1.1中输入数组中的

是输出数组中
的感受野。

整个输入样本都是输出样本的感受野。

二维数组各行分别求和_【PyTorch入门】之十分钟看懂二维卷积层的运算、实现及应用...相关推荐

  1. 十分钟看懂传统运维、互联网运维和业务运维异同

    从信息化时代到互联网时代,再到如今大幕初启的数字化时代,IT.互联网和移动化已经渗透到工作和生活的方方面面.今年早些时候一群歪果仁评选出中国的新"四大发明"--高铁.网购.支付宝和 ...

  2. 三维家导入户型镜像怎么使用_【业】1分钟看懂三维家定制柜设计

    设计·思 精妙的柜体设计,既严谨又温馨 不仅精通板件与工艺间的关系 还能从中体会生活的烟火气 三维家定制柜设计亮点一览 海量橱柜.衣柜.系统柜参数化模型 内置多种设计风格功能件.装饰件 满足市场90% ...

  3. 耳机接口规则_耳机小白必读 一分钟看懂什么是TRS接口

    新酷产品第一时间免费试玩,还有众多优质达人分享独到生活经验,快来新浪众测,体验各领域最前沿.最有趣.最好玩的产品吧~!下载客户端还能获得专享福利哦! 当我们在使用数码音频产品时,往往面对的第一件事情就 ...

  4. 动圈耳机振膜_新手小白必读 1分钟看懂动圈式耳机振膜

    011分钟看懂动圈式耳机振膜 耳机依照其换能原理可以分为动圈式耳机.动铁式耳机和静电耳机三大类.市面上多见动圈式耳机,其原理与普通喇叭类似--处于永磁场中缠绕的圆柱体状线圈与振膜相连,线圈在信号电流驱 ...

  5. java二维数组杨辉三角_实验----Java的二维数组的应用及杨辉三角的编写

    (1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...

  6. C语言 二维数组遍历 - C语言零基础入门教程

    目录 一.计算一维数组长度 二.计算二维数组长度 1.二维数组行数 2.二维数组列数 3.二维数组的元素个数 = 二维数组行数 * 二维数组列数 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C ...

  7. 怎么看到方法内引用方法的注释_网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制...

    网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制 现在的生活中,无论你是一名上班族还是学生或者什么职业,遇到不会的问题,总是需要上网查资料,找到某些好用的资料,却因为某些原因需要付费才能复制 ...

  8. 三相逆变器双pi控制器参数如何调节_一分钟看懂维也纳三相整流器

    欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 1105621549 高可靠新能源行业顶尖自媒体 在这里有电力电子.新能源干货.行业发展趋势分析.最新产品介绍.众多技术达人与您分享经验,欢 ...

  9. 手机qq表白代码大全可复制_网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制...

    现在的生活中,无论你是一名上班族还是学生或者什么职业,遇到不会的问题,总是需要上网查资料,找到某些好用的资料,却因为某些原因需要付费才能复制文字,那么面对网页内文字无法复制怎么办? 小酱就来教你如何免 ...

最新文章

  1. 中美5G竞争的未来路线图
  2. UVA 10746 Crime Wave - The Sequel
  3. 高通camera驱动分析
  4. 第二章mapper接口 和模糊查询
  5. CanvasRenderingContext2D(渲染上下文对象)
  6. 【渝粤题库】陕西师范大学189101 消费者行为学Ⅰ 作业(高起专)
  7. kali NETCAT NC的使用
  8. ubuntu下安装django
  9. [手把手教]discuzX2插件制作教程__最菜鸟级别的入门坎 【三】
  10. 封装DataList分页
  11. Ext JS 3.2.1 字段组件父类 Ext.form.field.Base
  12. mysql 备份的权限_Mysql 数据库备份权限
  13. 风险投资,扼杀中国互联网创新的黑手
  14. Numpy中常用函数
  15. linux mencoder,linux下mencoder的一些用法
  16. SGMII和RGMII入门学习
  17. android 画爱心进度条_android自定义圆形进度条,实现动态画圆效果
  18. MacBook Pro维修过程
  19. ubuntu 14.04 32位设置1920x1080分辨率
  20. 要想增加流量需要做的几点,淘宝运营新手必看的免费流量小知识

热门文章

  1. 使用kubectl管理k8s集群(三十)
  2. 领域模型架构 eShopOnWeb项目分析 上
  3. Build 2019 上微软的开源动作有点不一样
  4. EntityFramework Core 3.0 Preview
  5. 自定义Visual Studio.net Extensions 开发符合ABP vnext框架代码生成插件[附源码]
  6. surging 微服务引擎 1.0 正式发布
  7. ASP.NET Core中使用表达式树创建URL
  8. ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务
  9. 使用DDD、事件风暴和Actor来设计反应式系统
  10. Visual Studio 2017 针对移动开发的新特性介绍