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

0651390981640327f3cb99a1cdb6ea5e.png

原文链接:

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

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中输入数组中的

是输出数组中
的感受野。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3 UnicodeEncodeError: 'ascii' 错误

2019独角兽企业重金招聘Python工程师标准>>> python 3.4 使用urllib.request.urlopen() 打开url时候,如果url中包含中文,出现了“UnicodeEncodeError: ascii codec cant encode ”的错误,修复步骤如下 在url中有中文的地方加入…

小女生的Linux技术~~~Linux常识~~21-30

小女生的Linux技术~~~Linux常识~~21-30 Q21 如何查看当前用户的系统行为? A: 使用命令w查看当前用户的系统行为, w root Q22 如何查看曾经登录系统的用户名 ? A:使用who命令查看当前用户登录情况 who -u更详细些 Q23查看所有进程的方法是什么&#xff…

让批处理文件(.bat)程序无窗口(隐藏/静默)运行

将下面的代码保存为.vbs 文件,把 test.bat 改成你的批处理文件,然后运行.vbs 文件 --------------------------------------------------------------set GuWSWScript.CreateObject("WScript.Shell") GuWS.Run "test.bat",vbhide转载…

女朋友的道歉方式

1 女朋友的道歉方式2 看吧,无聊的时候什么事都干得出来3 这猫太坏了!4 还以为是特效,原来是实物 5 叉子的妙用6 也太信任这块玻璃了吧……7 棉花糖炸酱面......大家感受一下你点的每个赞,我都认真当成了喜欢

单元测试(三)基本使用

介绍本文来演示一下同事教导后的写法,同样有些单元测试是为了演示而写的单元测试。本文使用组件:Xunit、Moq以及dotNet相关知识注:本文内容基于上一篇操作首先指定一个方法编写单元测试,并且要保证没有其他因素干扰的情况下去进行…

重力模型matlab代码,STK基础教程.doc

STK基础教程STK基础教程By appe1943西安交通大学目 录TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc367480315" 1 STK软件简介 PAGEREF _Toc367480315 \h 1HYPERLINK \l "_Toc367480316" 1.1 STK软件简介 PAGEREF _Toc367480316 \h 1HYPERLINK \l &…

帆软帮助文档_帆软:像阿甘一样,奔跑在商业智能的赛道上

戳蓝字“CSDN云计算”关注我们哦!作者 | 晶少出品 | CSDN云计算(ID:CSDNcloud)故事开始于一片洁白的羽毛,从空中降落缓缓飘过房屋、街道、树梢,最终落在了主人公阿甘的脚旁,他没有过多思考就将羽毛轻轻收藏书中……这是…

sed简单用法

一、替换1、将替换后的文本显示在屏幕上sed s/pattern/replace_string/ file或者通过管道cat file|sed s/pattern/replace_string/2、替换源文件中的文本sed s/pattern/replace_string/g file或者sed -i s/pattern/replace_string/ file从第N处开始替换匹配的行sed s/pattern/r…

字符串表达式求值 C#实现

using System;using System.Collections.Generic;using System.Windows.Forms; namespace ExpressionResult1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } //建立一个数栈和一个操作符栈 …

叫板BBC!80后湖南姑娘,花3年首次拍出水下的中国,惊艳了全世界

全世界只有3.14 % 的人关注了爆炸吧知识众所周知,中国拥有约960万平方公里的陆地面积,我们生活在这片大地之上。但却鲜有人知道,中国的水下也有一座城。这是一座位于杭州千岛湖下的千年古城,历经61年,它们在水底&#…

php开启mysqlnd,如何启用mysqlnd的php?

我有PHP安装和运行(版本:5.3.17),我想切换到mysqlnd(在phpinfo mysqlnd不存在)。我读了,为了设置它,你需要更新./configure命令:./configure --with-mysqlmysqlnd \--with-mysqlimysqlnd \--with-pdo-mysqlmysqlnd \当…

***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象...

http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value (存一个对象的时候key存) 将哈希表 key 中的域 field 的值设为 value 。 如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。 如果域 field 已经存在于哈希表中&#xff…

lua loadstring传递参数_lua学习之函数篇

函数函数是对语句和表达式进行抽象的主要机制两种用法一是可以完成特定的任务,一句函数调用被视为一条语句二是以只用来计算并返回特定的结果,视为一句表达式print("Hello, World")a math.sin(3) math.cos(10)print(os.date())​无论哪种用法…

Redhat Linux编译安装LAMP环境

一:准备软件包存放/home/xiutuo/software/目录下。主要软件包:1. httpd-2.2.6.tar.gz 2. mysql-5.0.45-linux-i686-glibc23.tar.gz (这个版本是已编译好的压缩包,解压后稍做配置即可使用)3. php-5.2.5.tar.gz安装php所需的软件包(…

EF Core 6 简化的数据库上下文注册

EF Core 6 简化的数据库上下文注册IntroEF Core 6 将简化现在的服务注册,DbContext 的服务注册将会更简单一些Sample直接来看示例代码吧:现在我们注册 EF Core 的 DbContext 通常是这样的:const string connectionString "DataSourcete…

Nginx指南

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。更多的请见官方wiki:http://wiki.nginx.org/Main 。 其优点…

快要“成精”的波士顿机械狗,开始卖了,价格不贵准备搞一只

全世界只有3.14 % 的人关注了爆炸吧知识重磅消息:这只全球著名的网红狗终于。。开!售!了!哦,不对,放错图了!应该是这只!一起来看看视频介绍——6月17日,据科技时报&#…

php3.23,MySQL 3.23.40 又发布了-PHP教程,PHP基础

mysql 3.23.40 又发布了。修正了–low-priority-updates 和 insert 的问题。修正了从进程在一些特别的情况下超前主进程 22 字节的问题。为复制增加了 slave_wait_timeout修正了 update 和 bdb 表的问题。修正了bdb 表使用 key parts 的问题。修正了使用 grant file on databas…

用java写了一个汉诺塔

package com.brzhang;/*** 汉诺塔* 开始盘子全部都放在第一根柱子上* 目的:将第一根柱子上的盘子全部移动到第三根柱子上,规则是不能编号较大的盘子放在编号交小的盘子上面。**/ public class HanoTa {private long steps 1l;/**** param n 盘子个数* p…

python with循环_Python for循环、while循环

Python中有两种循环,分别为:for循环和while循环。for循环for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次)。for循环的基本结构如下:具体看这个案例:设…