Pytorch卷积层原理和示例 nn.Conv1d卷积 nn.Conv2d卷积

内容列表

一,前提
二,卷积层原理
1.概念
2.作用
3. 卷积过程
三,nn.conv1d
1,函数定义:
2, 参数说明:
3,代码:
4, 分析计算过程
四,nn.conv2d
1, 函数定义
2, 参数:
3, 代码
4, 分析计算过程

一,前提

在开始前,要使用pytorch实现以下内容,需要掌握tensor和的用法

二,卷积层原理

1.概念

卷积层是用一个固定大小的矩形区去席卷原始数据,将原始数据分成一个个和卷积核大小相同的小块,然后将这些小块和卷积核相乘输出一个卷积值(注意这里是一个单独的值,不再是矩阵了)。

2.作用

特征提取

卷积的本质就是用卷积核的参数来提取原始数据的特征,通过矩阵点乘的运算,提取出和卷积核特征一致的值,如果卷积层有多个卷积核,则神经网络会自动学习卷积核的参数值,使得每个卷积核代表一个特征。

3. 卷积过程

在这里插入图片描述

三,nn.conv1d

这里我们拿最常用的conv1d举例说明卷积过程的计算。

conv1d是一维卷积,它和conv2d的区别在于只对宽度进行卷积,对高度不卷积。

1,函数定义:

torch.nn.functional.conv1d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

2, 参数说明:

**input:**输入的Tensor数据,格式为(batch,channels,W),三维数组,第一维度是样本数量,第二维度是通道数或者记录数。三维度是宽度。

**weight:**卷积核权重,也就是卷积核本身。是一个三维数组,(out_channels, in_channels/groups, kW)。out_channels是卷积核输出层的神经元个数,也就是这层有多少个卷积核;in_channels是输入通道数;kW是卷积核的宽度。

**bias:**位移参数,可选项,一般也不用管。

**stride:**滑动窗口,默认为1,指每次卷积对原数据滑动1个单元格。

**padding:**是否对输入数据填充0。Padding可以将输入数据的区域改造成是卷积核大小的整数倍,这样对不满足卷积核大小的部分数据就不会忽略了。通过padding参数指定填充区域的高度和宽度,默认0(就是填充区域为0,不填充的意思)

**dilation:**卷积核之间的空格,默认1。

**groups:**将输入数据分组,通常不用管这个参数,没有太大意义。

3,代码:

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F

a=range(16)
x = Variable(torch.Tensor(a))
'''
a: range(0, 16)
x: tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13.,
        14., 15.])
'''

x=x.view(1,1,16)
'''
x variable: tensor([[[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13., 14., 15.]]])
'''

b=torch.ones(3)
b[0]=0.1
b[1]=0.2
b[2]=0.3
weights = Variable(b)
weights=weights.view(1,1,3)
'''
weights: tensor([[[0.1000, 0.2000, 0.3000]]])
'''

y=F.conv1d(x, weights, padding=0)
'''
y: tensor([[[0.8000, 1.4000, 2.0000, 2.6000, 3.2000, 3.8000, 4.4000, 5.0000, 5.6000, 6.2000, 6.8000, 7.4000, 8.0000, 8.6000]]])
'''

上面出现了 x.view(1,1,16) view的用法参考我之前的博客
Pytorch-view的用法
上面出现了 Variable(torch.Tensor(a)) Tensor和Variable的用法参考我之前的博客
pytorch入门 Variable 用法
PyTorch Tensor的初始化和基本操作

4, 分析计算过程

(1) 原始数据大小是0-15的一共16个数字,卷积核宽度是3,向量是[0.1,0.2,0.3]。 我们看第一个卷积是对x[0:3]共3个值[0,1,2]进行卷积,公式如下:

00.1+10.2+2*0.3=0.8
在这里插入图片描述

(2) 对第二个目标卷积,是x[1:4]共3个值[1,2,3]进行卷积,公式如下:

10.1+20.2+3*0.3=1.4
在这里插入图片描述

剩下的就以此类推

四,nn.conv2d

1, 函数定义

nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))

2, 参数:

in_channel: 输入数据的通道数,例RGB图片通道数为3;

out_channel: 输出数据的通道数,这个根据模型调整;
  kennel_size: 卷积核大小,可以是int,或tuple;kennel_size=2,意味着卷积大小(2,2), kennel_size=(2,3),意味着卷积大小(2,3)即非正方形卷积
  stride:步长,默认为1,与kennel_size类似,stride=2,意味着步长上下左右扫描皆为2, stride=(2,3),左右扫描步长为2,上下为3;
  padding: 零填充

3, 代码

import torch
import torch.nn as nn
from torch.autograd import Variable

r = torch.randn(5, 8, 10, 5) # batch, channel , height , width
print(r.shape)

r2 = nn.Conv2d(8, 14, (3, 2), (2,1))  # in_channel, out_channel ,kennel_size,stride
print(r2)

r3 = r2(r)
print(r3.shape)
torch.Size([5, 8, 10, 5])
Conv2d(8, 14, kernel_size=(3, 2), stride=(2, 1))
torch.Size([5, 14, 4, 4])

4, 分析计算过程

卷积公式:

h = (h - kennel_size + 2padding) / stride + 1
w = (w - kennel_size + 2padding) / stride + 1

r = ([5, 8, 10, 5]),其中h=10,w=5,对于卷积核长分别是 h:3,w:2 ;对于步长分别是h:2,w:1;padding默认0;

h = (10 - 3 + 20)/ 2 +1 = 7/2 +1 = 3+1 =4
w =(5 - 2 + 20)/ 1 +1 = 3/1 +1 = 3/1+1 =4

batch = 5, out_channel = 14

故: y= ([5, 14, 4, 4])

参考

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QML用ListView实现带section的GridView

QML自带的GridView只能定义delegate,没有section,类似手机相册带时间分组标签的样式就没法做。最简单的方式就是组合ListViewGridView,或者ListViewFlow,但是嵌套View时,子级View一般是完全展开的,只显示该…

「递归算法」:二叉树剪枝

一、题目 给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 node 的后代。 示例 1: 输入:root [1,null,0,0,1] 输出&…

EasyX图形库学习(三、用easyX实现移动的小球、图片-加载、输出)

目录 图像输出 loadimage用于从文件中读取图片 putimage在当前设备上绘制指定图像。 图形界面中的小球与按钮控制 图像输出 在使用图像之前,需要定义一个变量(对象),然后把图片加载进变量才能进行使用。 平时定义变量都是使用的基础数据类型&#x…

RISC-V工业级芯片公司匠芯创,宣布软件开发包SDK正式开源

近日,RISC-V芯片公司匠芯创宣布开源D21x系列工业级应用芯片软硬件开发包SDK。软件开发包涵盖了D21x开源代码、软件API库、开发手册文档、相关调试及烧录工具,并且提供多媒体中间件等多个SDK用例和应用 Demo示例,帮助企业和个人开发者快速上手…

C++ dfs 与图有关的知识(四十七)【第七篇】

今天我们接着来学习树上搜索(dfs深度优先搜索) 1.树的深度与子树大小 树的深度:规定根结点是树的第一层,树根的孩子结点是树的第二层,以此类推,树的深度就是结点的最大层数。 根据定义,如果我们…

基于深度学习算法的轴承故障自主分类

1. 要求 轴承有3种故障:外圈故障,内圈故障,滚珠故障,外加正常的工作状态。如表1所示,结合轴承的3种直径(直径1,直径2,直径3),轴承的工作状态有10类: 表1 轴承故障类别 外…

R语言绘图教程 | 双侧条形图绘制教程

写在前面 双侧条形图在我们的文章中也是比较常见的,那么这样的图形是如何绘制的呢? 以及它使用的数据类型是什么呢? 这些都是我们在绘制图形前需要掌握的,至少我们知道绘图的数据集如何准备,这样才踏出第一步。 今天的教程,我们会从数据的准备,以及数据如何整理,以及…

亲测解决vscode的debug用不了、点了没反应

这个问题在小虎登录vscode同步了设置后出现,原因是launch文件被修改或删除。解决方法是重新添加launch。 坏境配置 win11 + vscode 解决方法 Ctrl + shift + P,搜索debug添加配置: 选择python debugger。 结果生成了一个文件在当前路径: launch内容: {// Use Int…

ubuntu系统下c++ cmakelist vscode debug(带传参的debug)的详细示例

c和cmake的debug,网上很多都需要配置launch.json,cpp.json啥的,记不住也太复杂了,我这里使用cmake插件带有的设置,各位可以看一看啊✌(不知不觉,竟然了解了vscode中配置文件的生效逻辑🤣) 克隆…

Unity3D判断屏幕中某个坐标点的位置是否在指定UI区域内

系列文章目录 unity工具 文章目录 系列文章目录前言一、使用rect.Contains()判断1-1、转换坐标1-2、代码如下:1-3、注意事项1-3、测试效果如下 二、使用坐标计算在不在区域内2-1、方法如下:2-2、注意事项 三、使用RectTransformUtility.ScreenPointToLo…

使用maven对springboot项目进行瘦身

目录 一、什么是Maven 二、springboot 项目 三、springboot 项目瘦身 一、什么是Maven Maven是一个基于Java的项目管理和构建工具。它通过提供一个一致的项目结构、自动化构建脚本和依赖管理系统,简化了Java项目的构建过程。 Maven使用一种称为POM(…

数据结构_找环,破环题-2.5

一. 判断单链表有无环 a. 错误的思路:遍历陷入死循环 1)和相交的遍历思路一样,找指向相同。 错误点 一直在死循环。 思考点:如何破环 b. 个人思路:反转链表回首结点 1)目前的经验,无非就…

macOS Sonoma 14系统安装包

macOS Sonoma 14是苹果公司最新推出的操作系统,为Mac用户带来了全新的使用体验。Sonoma是苹果继Catalina之后的又一重要更新,它在改善系统性能、增加新功能、优化用户界面等方面做出了显著贡献。 macOS Sonoma 14系统有许多令人兴奋的新功能和改进&…

【LangChain-04】利用权重和偏差跟踪和检查LangChain代理的提示

利用权重和偏差跟踪和检查LangChain代理的提示 一、说明 考虑到(生成)人工智能空间,(自主)代理现在无处不在!除了更强大且幸运的是开放的大型语言模型(LLM)之外,LangCh…

JavaScript运行机制

在web前端开发中,JavaScript无疑是一种非常重要的编程语言。它能够为网页添加动态交互功能,提升用户体验。然而,要充分发挥JavaScript的威力,我们需要对它的运行机制有一定的了解。 JavaScript是一种解释执行的脚本语言&#xff…

Goland控制台日志打印错位

现象:Goland控制台打印日志,调整控制台界面大小后偶发性的日志内容错位 原因:未知(大概是bug) 解决方案: shift shift 进入Registry,取消go.run.process.with.pty勾选即可

AI助力农作物自动采摘,基于YOLOv3全系列【yolov3tiny/yolov3/yolov3spp】参数模型开发构建作物生产场景下番茄采摘检测计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物,专家设计出来了很多用于采摘不同农作物的大型机械,看着非常震撼,但是我们国内农业的发展还是相对比较滞后的&#xff0…

K8S之Namespace的介绍和使用

Namespace的理论和实操 Namespace理论说明Namespace实操创建、查看命名空间使用ResouceQuota 对Namespace做资源限额更多ResouceQuota 的使用 Namespace理论说明 命名空间定义 K8s支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间&…

教授LLM思考和行动:ReAct提示词工程

ReAct:论文主页 原文链接:Teaching LLMs to Think and Act: ReAct Prompt Engineering 在人类从事一项需要多个步骤的任务时,而步骤和步骤之间,或者说动作和动作之间,往往会有一个推理过程。让LLM把内心独白说出来&am…

Flink 动态表 (Dynamic Table) 解读

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…