二维卷积层

在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。

例如:
输入为:input:
[012345678]\begin{bmatrix} 0 & 1 & 2 \\ 3 & 4 &5 \\ 6 & 7 & 8 \end{bmatrix}⎣⎡​036​147​258​⎦⎤​

核为:kernel:
[0123]\begin{bmatrix} 0 & 1 \\ 2 & 3 \end{bmatrix}[02​13​]

则输出为:output

output=input∗kernel=[012345678]∗[0123]=[19253743]output = input * kernel = \begin{bmatrix} 0 & 1 & 2 \\ 3 & 4 &5 \\ 6 & 7 & 8 \end{bmatrix} * \begin{bmatrix} 0 & 1 \\ 2 & 3 \end{bmatrix} = \begin{bmatrix} 19 & 25 \\ 37 & 43 \end{bmatrix}output=input∗kernel=⎣⎡​036​147​258​⎦⎤​∗[02​13​]=[1937​2543​]

输出数组高和宽分别为2,其中的4个元素由二维互相关运算得出:

0×0+1×1+3×2+4×3=19,1×0+2×1+4×2+5×3=25,3×0+4×1+6×2+7×3=37,4×0+5×1+7×2+8×3=43.0\times0+1\times1+3\times2+4\times3=19,\\ 1\times0+2\times1+4\times2+5\times3=25,\\ 3\times0+4\times1+6\times2+7\times3=37,\\ 4\times0+5\times1+7\times2+8\times3=43. 0×0+1×1+3×2+4×3=19,1×0+2×1+4×2+5×3=25,3×0+4×1+6×2+7×3=37,4×0+5×1+7×2+8×3=43.

设计函数实现卷积层的计算:

import torch
from torch import nndef corr2d(X, K): h, w = K.shapeY = torch.zeros((X.shape[0] - h + 1, X.shape[1] - 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]])
corr2d(X, K)

输出:

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

自定义二维卷积层

class conv2d(nn.Module):def __init(self, kernel_size):super(conv2d, self).__init__()self.weight = nn.Parameter(torch.randn(kernel_size))self.bias = nn.Parameter(torch.randn(1))def forward(self, x):return corr2d(x, self.weight) + self.bias

这里我们使用了corr2d函数来实现一个自定义的二维卷积层,这个网络层有weight、bias两个参数,前向计算函数是直接调用corr2d函数再加上偏差。

使用卷积层做图像中物体边缘的检测

检测图像中物体的边缘,即找到像素变化的位置。首先我们构造一张6×86\times 86×8的图像(即高和宽分别为6像素和8像素的图像)。它中间4列为黑(0),其余为白(1)。

X = torch.ones(6, 8)
X[:, 2:6] = 0

构造一个高和宽分别为1和2的卷积核K。当它与输入做互相关运算时,如果横向相邻元素相同,输出为0;否则输出为非0。

K = torch.tensor([[1, -1]])

将输入X和我们设计的卷积核K做互相关运算。计算 将从白到黑的边缘和从黑到白的边缘分别检测成了1和-1。其余部分的输出全是0。

Y  = corr2d(X, K)
print(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.]])

通过这个例子我们能看出,卷积层可以通过重复使用卷积核有效的表示局部空间

通过数据学习出卷积核

使用物体边缘检测中的输入数据X和输出数据Y来学习我们构造的核数组K。
我们首先构造一个卷积层,其卷积核将被初始化成随机数组。接下来在每一次迭代中,我们使用平方误差来比较Y和卷积层的输出,然后计算梯度来更新权重。

model = conv2d(kernel_size=(1,  2))
step = 20 #训练步数
lr = 0.01 #学习率
for i in range(step):y_hat= model(X)l = ((y_hat - y)**2).sum()l.backward()#进行梯度下降model.weight.data -= lr * model.wight.gradmodel.bias.data -= lr * model.bias.gradi+1# 梯度清0conv2d.weight.grad.fill_(0)conv2d.bias.grad.fill_(0)if (i+1)%5 == 0:print('step: %d , loss: %.3f' %(i+1, l.item()))

(pytorch-深度学习系列)CNN二维卷积层-学习笔记相关推荐

  1. [pytorch、学习] - 5.1 二维卷积层

    参考 5.1 二维卷积层 卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer)的神经网络.本章介绍的卷积神经网络均使用最常见的 ...

  2. pytorch学习笔记(十九):二维卷积层

    文章目录 1. 二维互相关运算 2. 二维卷积层 3. 图像中物体边缘检测 4. 通过数据学习核数组 卷积神经网络(convolutional neural network)是含有卷积层(convol ...

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

    原文链接: [动手学深度学习笔记]之二维卷积层​mp.weixin.qq.com 1.二维卷积层 本节介绍卷积神经网络中最常见的二维卷积层.二维卷积层常用来处理图像数据,它具有两个空间维度(高和宽). ...

  4. 面向过程给出《贝叶斯思维:统计建模的Python学习法》——二维彩球问题学习代码

    背景 给出读<艾伯特贝叶斯思维:统计建模的Python学习法.pdf>的时候,写的代码,以面向过程的方式给出. 本章彩弹问题,求似然度的时候,假设已知隐藏点时,射手等概率从各个角度射击. ...

  5. (论文加源码)基于DEAP和MABHOB数据集的二分类脑电情绪识别(pytorch深度神经网络(DNN)和卷积神经网络(CNN))

    该论文发表于2021年的顶级期刊.(pytorch框架) 代码解析部分在个人主页: https://blog.csdn.net/qq_45874683/article/details/13000797 ...

  6. 花书+吴恩达深度学习(十二)卷积神经网络 CNN 之全连接层

    目录 0. 前言 1. 全连接层(fully connected layer) 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 CNN ...

  7. (论文加源码)基于DEAP和MABHOB数据集的二分类脑电情绪识别(pytorch深度神经网络(DNN)和卷积神经网络(CNN))代码解析

    论文解析见个人主页: https://blog.csdn.net/qq_45874683/article/details/130000469?csdn_share_tail=%7B%22type%22 ...

  8. 【OpenCV 例程200篇】54. OpenCV 实现图像二维卷积

    [OpenCV 例程200篇]54. OpenCV 实现图像二维卷积 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

  9. 论文解读:《基于BERT和二维卷积神经网络的DNA增强子序列识别transformer结构》

    论文解读:<A transformer architecture based on BERT and 2D convolutional neural network to identify DN ...

最新文章

  1. Visual Studio服务器控件被警告问题
  2. 使用Java 8流遍历递归数据结构
  3. $动态规划系列(2)——找零钱问题
  4. Android开发记录(转)
  5. Java LocalDate类| isLeapYear()方法与示例
  6. 容器编排技术 -- Kubernetes kubectl create secret docker-registry 命令详解
  7. Galaxy Nexus(i9250)卡在开机画面(‘X’画面)解决方法
  8. Unable to add window -- token android.os.BinderProxy---Android原生开发工作笔记142
  9. Django RESTful规范
  10. HTML5 定位 —— Geolocation API的正确使用
  11. 数据结构基本操作_【算法与数据结构 03】数据处理的基本操作——增删查
  12. 【实习周报】2019年5月 前端开发实习工作周报汇总
  13. hp 服务器 修复,Hp服务器 raid 磁盘故障数据库数据恢复过程
  14. Unity_播放音乐
  15. 希捷移动硬盘官方测试软件,2TB厚度仅9.6mm 希捷超薄移动硬盘测试
  16. electron app 模块说明
  17. 必应每日一图直接获取及接口
  18. ps aux|grep xxx详解
  19. 2022-2027年中国教育云行业市场调研及未来发展趋势预测报告
  20. 2021最新 阿里云PostgreSQL案例精选2 - 图像识别、人脸识别、相似特征检索、相似人群圈选

热门文章

  1. 福昕风腾pdf导出为html,福昕风腾PDF套件快速指引.pdf
  2. 快速实现一个室内空气质量检测仪
  3. 通过VirtualQuery获取当前模块的句柄
  4. mysql 报错解决思考Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column
  5. React Native开发指南-在原生和React Native间通信
  6. C++为什么空格无法输出_OOP 面向对象编程:由 C 到 C++
  7. xftp6设置默认打开文件的程序_xftp6如何使用?xftp6传输文件的使用详细方法--系统之家...
  8. 国嵌c语言深度,国嵌C语言3部全
  9. 所有的图放到一个html,拖放是HTML5标准的组成部分,若想要把drag1图片放入d
  10. str计算机中代表什么,STR到底是待机还是休眠