Easy Deep Learning——卷积层

news2024/9/29 1:23:45

为什么需要卷积层,深度学习中的卷积是什么?

在介绍卷积之前,先引入一个场景

假设您在草地上漫步,手里拿着一个尺子,想要测量草地上某些物体的大小,比如一片叶子。但是叶子的形状各异,并且草地非常大,您要用一款尺子轻易地测量出草地上所有叶子的大小。

显然,这很难做到,那么引入卷积的概念

于是,您想到了一种方法,即将叶子放在一个网格纸上,并把网格纸放在尺子上。您现在只需要记录纸张上每个网格的大小,然后用它们来计算叶子的大小。 

在深度学习中,直接输入原始数据是可行的,但是如果数据的尺寸很大,比如图像、音频或视频等,那么会遇到以下问题:

  1. 参数数量过多:如果直接将大型图像输入神经网络,由于图像的尺寸可能很大,因此网络的参数数量也会相应增加。这将导致更多的计算量和更多的内存需求。而卷积操作可以共享参数,通过卷积核对输入数据进行特征提取,从而减少了需要训练的参数数量,降低了计算量和内存需求。

  2. 局部相关性:对于大型图像,其中的信息通常是局部相关的。也就是说,相邻的像素通常具有相似的特征。卷积操作通过滑动窗口对输入数据进行卷积操作,可以有效地捕捉局部相关性,从而提高模型的精度。

  3. 平移不变性:图像的很多特征(如边缘、纹理等)在不同位置都是具有相似性质的。卷积操作具有平移不变性,也就是说,无论特征出现在图像的哪个位置,卷积操作都能够将其检测出来。这种平移不变性对于图像识别、物体检测等任务非常重要。

卷积是一种数学运算,用于在信号处理和图像处理中的滤波器操作中,也是卷积神经网络中重要的计算操作。卷积运算的目的是将一个函数(比如图像)与另一个函数(比如卷积核)做积分,从而得到新的函数,实现信号的去噪、特征提取、图像增强等操作。在卷积神经网络中,卷积操作是通过卷积层实现的,可以提取出图像中的特征信息,帮助神经网络更好地学习和分类。

卷积层作为深度学习中的重要组成部分,可以有效地减少参数数量,提高模型的精度,并且具有平移不变性和捕捉局部相关性的优势,因此被广泛应用于图像、音频、视频等数据的处理和分析中。

回到最初的场景中,网格纸就像是一个卷积核,它可以帮助您捕捉叶子的特征并将其转换为数字数据。同样,深度学习中的卷积也是这个原理,它将输入的数据通过卷积核的滑动操作,将每一部分的特征转化为数字数据,进而进行后续的处理和分析。

下面引入卷积对图像的数据处理为例,介绍Pytorch中卷积运行的实现。

图像的卷积计算案例——conv2d

torch.nn模块包含着torch已经准备好的层,方便使用者调用构建网络。

案例:[1] 

上图是一个二维卷积运算的示例,可以发现,卷积操作将周围几个像素的取值经过计算得到一个像素值。



使用卷积运算在图像识别、图像分割、图像重建等应用中有三个好处,即卷积稀疏连接、参数共享、等变表示,正是这些好处让卷积神经网络在图像处理算法中脱颖而出。
在卷积神经网络中,通过输人卷积核来进行卷积操作,使输入单元(图像或特征映射)和输出单元(特征映射)之间的连接是稀疏的,这样能够减少需要训练参数的数量,从而加快网络的计算速度
卷积操作的参数共享特点,主要体现在模型中同一组参数可以被多个函数或操作共同使用。在卷积神经网络中,针对不同的输人会利用同样的卷积核来获得相应的输出。这种参数共享的特点是只需要训练一个参数集,而不需对每个位置学习一个参数集合。由于卷积核尺寸可以远远小于输入尺寸,即减少需要学习的参数的数量,并且针对每个卷积层可以使用多个卷积核获取输入的特征映射,对数据(尤其是图像)具有很强的特征提取和表示能力,并且在卷积运算之后,使得卷积神经网络结构对输入的图像具有平移不变的性质。



在PyTorch中针对卷积操作的对象和使用的场景不同,有一维卷积、二维卷积三维卷积与转置卷积(可以简单理解为卷积操作的逆操作),但它们的使用方法比较相似,都可以从torch.nn模块中调用,需要调用的类如表所示。

针对一张图像,经过二维卷积后的输出会是什么样子呢?下面使用一张图像来展示经过卷积后,输出的特征映射的结果。先导入相关的包和模块,并且使用PIL包读取图像数据,使用matplotlib包来可视化图像和卷积后的结果,程序如下:

import numpy as np
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from PIL import Image

# 读取图像并将其转换为灰度图
img = Image.open("/home/cbc/图片/2.png")
imgGray =np.array(img.convert("L"),dtype=np.float32) #convert("L") 转换为单通道图片

# 绘制灰度图
plt.figure(figsize=(6,6))
plt.imshow(imgGray,cmap=plt.cm.gray)
plt.axis(False) #禁用坐标轴显示
plt.show()

经过上述操作之后,得到一个二维数组,在使用PyTorch进行卷积操作之前,需要将其转化为1×1×高×宽的张量。
将二维的灰度图像转换成四维的张量,维度为(1, 1, imh, imw),表示一个batch(案例数),一个通道,高为imh,宽为imw
imh,imw = imgGray.shape
# 将二维的灰度图像转换成四维的张量,维度为(1, 1, imh, imw),表示一个batch,一个通道,高为imh,宽为imw
imgGray_torch = torch.from_numpy(imgGray.reshape((1,1,imh,imw)))
print(imgGray_torch.shape)

卷积时需要将图像转化为四维来表示[batch,channel,h,w ]。在对图像进行卷积操作后,获得两个特征映射。第一个特征映射使用图像轮廓提取卷积核获取,第二个特征映射使用的卷积核为随机数,卷积核大小为5×5,对图像的边缘不使用0填充。

卷积核中心值为 24,其余为 -1,这种卷积核叫做边缘检测算子。在卷积操作中,卷积核与图像中每个像素的值进行乘积并求和,得到的结果就是该像素的卷积值。

对于边缘检测算子,它会在图像中找到像素值变化最为明显的地方,也就是图像中的边缘部分,因为边缘处的像素值变化较为剧烈。通过卷积操作,边缘部分的卷积值会比其他部分更高,从而实现提取图像轮廓的效果。

对卷积后的两个特征映射进行可视化:
# 定义卷积核大小和卷积核矩阵,其中心为24,其余为-1
kersize = 5
ker = torch.ones(kersize,kersize,dtype=torch.float32) *-1
ker[2,2] =24
ker = ker.reshape((1,1,kersize,kersize))

# 将卷积核矩阵转换成张量,维度为(1, 1, kersize, kersize),表示一个batch,一个通道,卷积核的高和宽分别为kersize
ker = ker.reshape((1,1,kersize,kersize))

# 定义一个2D卷积层,输入通道数为1,输出通道数为2,卷积核的大小为(kersize,kersize),不使用偏置项
conv2d = nn.Conv2d(1,2,(kersize,kersize),bias= False)

# 将卷积核张量赋值给卷积层的权重,第一个通道的权重为ker
conv2d.weight.data[0] = ker

# 对灰度图像进行卷积操作
imconv2dout = conv2d(imgGray_torch)

# 将卷积结果的张量降维成二维数组
imconv2dout_im = imconv2dout.data.squeeze()

# 打印卷积结果的形状
print("卷积后的尺寸:",imconv2dout_im.shape)

# 绘制卷积结果的两个通道
plt.figure(figsize=(12,6))
plt.subplot(1,2,1)
plt.imshow(imconv2dout_im[0],cmap=plt.cm.gray)
plt.axis(False)
plt.subplot(1,2,2)
plt.imshow(imconv2dout_im[1],cmap=plt.cm.gray)
plt.axis(False)
plt.show()

可以看出,使用的边缘特征提取卷积核很好地提取出了图像的边缘信息。而右边的图像使用的卷积核为随机数,得到的卷积结果与原始图像很相似。

 

 [1]《PyTorch 深度学习入门与实战(案例视频精讲)》,孙玉林,余本国

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

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

相关文章

【Unity3D小技巧】Unity3D中判断Animation以及Animator动画播放结束,以及动画播放结束之后执行函数

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在日常开发中,可能会遇到要判断Animation或者Anima…

MySQL workbench数据表和数据结构

数据表和数据结构的关系 数据表 学号姓名位置26002351李晓丽126002589张明伟226003214李雪冬326002132汪涵426006541邱明罕526003654李丽6 怎样去描述上面的数据表,用【数据表结构】表示 表头字段名字段类型位数备注学号xuehao整数/字符8 姓名xingming字符4 座…

煤矿人员精确定位解决方案,维护作业人员生命安全

近日,应急管理部党委书记、部长王祥喜主持召开全国安全防范工作视频会议。会议强调,要深刻吸取内蒙古露天煤矿坍塌等重特大事故教训,举一反三全面排查整治重点行业领域重大安全隐患,坚决遏制重特大事故,切实维护人民群…

【数据结构·考研】后序线索二叉树

之前我们介绍了中序线索二叉树的构造、遍历、寻找前趋和寻找后继;先序线索二叉树的构造、遍历、寻找后继。先序线索二叉树无法解决寻找前趋的任务,中序线索二叉树既可以寻找前趋结点也可以寻找后继结点。 今天我们再来看一下后序线索二叉树的构造&#…

apt-get通过代理更新系统

apt-get通过代理更新系统1. 源由2. 需求3. 分析4. 步骤4.1 安装CCProxy4.2 配置CCProxy4.3 apt-get更新4.4 apt-get升级4.5 apt-get安装5. 补充资料 命令行设置代理6. 参考资料1. 源由 apt-get经典操作就是通过网络与服务器通信,下载相应的包来安装和更新软件。 这…

docker容器内安装gcc(trunk 最新版本)以及LLVM

1、docker内部只有wget以及git命令 项目需要,得更新docker容器中的gcc和LLVM版本但是由于没有预先安装apt、apt-get以及yum,导致很多安装过程就是鸡生蛋蛋生鸡反应。暂时没有找到合适的解决的方法,如果有大佬知道的话,欢迎留言哈…

ZeroTier实现内网穿透详细教程,无需公网IP,实现异地组网

ZeroTier实现内网穿透详细教程,无需公网IP,实现异地组网ZeroTier1.官网注册账号,创建自己的局域网段2.点击创建好的网络,进入设置界面进行设置3.下载客户端,安装客户端,然后连接到网络中4.加入网络成功后&a…

pocsuite3安装及使用

pocsuite3安装及使用简介项目地址环境配置及安装环境要求安装(详情可以参考[https://pocsuite.org/](https://pocsuite.org/))使用方法运行模块加载目标参数:Console模式查看有哪些模块使用Telnet 弱密码模块这里以flask模板注入漏洞为例pocs…

阿里云短信验证

1.了解阿里云用户权限操作 需要通过个人账户获得 授权码(id、密码),再通过这些信息获得服务 阿里云网址 :https://www.aliyun.com/ 1.登陆阿里云服务器2.进入个人账号然后点击 AccessKey 管理3.创建用户组4.添加用户组权限&…

SYSU程设c++(第三周) 对象类、类的成员、类与结构体的区别、类的静态成员

对象&类 类用于指定对象的形式,它包含数据的表示方法和用于处理数据的方法。 • 类中的数据和方法称为类的成员。 • 函数在一个类中也被称为类的成员。 定义一个类,其效果是定义一个数据类型的蓝图。它定义了类的对象包括了什么,以及可…

C++基础了解-08-C++运算符

C运算符 一、C 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 二、算术运算符 下表显示了 C 支持的算术运算符…

led灯性价比最高的是哪款?2023最新的哪种led灯质量比较好

Led作为一种固态半导体,具有自发光、高可控性的特点,高效节能,省电环保,并且根据材料的不同,发出的光线颜色也不同,因此广泛用于各种照明灯具,台灯也不例外。 作为一种适合工作学习或者工作休闲…

跑步耳机入耳好还是不入耳好、十大跑步运动耳机品牌排行榜推荐

健身房经常会播放一些节奏较快的歌曲,这样能够激发大家在运动过程中的动力,所以运动时聆听音乐确实比较有效果,居家运动、室外跑步时选择运动耳机就变成了刚需,首先不能影响其他人、佩戴时要稳定,音质和续航要有保证&a…

npm install 原理

npm基本使用node.jsNode.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。在任何地方安装了node,那么就可以运行JavaScript。所以在服务器上就可以运行js了。js就全栈了。node安装的同时就安装了npm。直接去官网下载,双击安装即可。安装完毕之后…

java基于springboot仓库管理系统的设计与实现

项目介绍 基于 SpringBoot 的仓库管理系统拥有多种角色,可供用户自定义使用。 功能模块 一、业务模块 1、客户管理 2、供应商管理 3、商品管理 4、商品进货管理 5、商品退货管理 6、商品销售管理 7、商品销售退货管理 二、系统模块 菜单管理,角色管…

Java高级工程师特别熟悉的js基础 | 面向对象编程/原型链/继承

面向对象编程/原型链/继承 面向对象编程 什么是面向对象编程? 面向对象是⼀种编程思想,经常被拿来和⾯面向过程⽐比较。其实说的简单点,面向过程关注的重点是动词,是分析出解决问题需要的步骤,然后编写函数实现每个步…

WIFI标签操作步骤

1. 打开并设置手机WIFI热点,设置SSID为ESL,密码为123456789(如下图) ​ 2. 运行APP,设置要接入的WIFI名称密码等信息(如下图) ​ 3. 长按背面按键(长按2-3秒)&#xff0c…

TypeScript 深度剖析:TypeScript 的理解?与 JavaScript 的区别?

一、是什么 TypeScript 是 JavaScript 的类型的超集,支持ES6语法,支持面向对象编程的概念,如类、接口、继承、泛型等 超集,不得不说另外一个概念,子集,怎么理解这两个呢,举个例子,如…

MYSQL 最大连接数

MYSQL 最大连接数? 最大连接数也就是mysql服务最大支持多少客户端连接服务 查看服务支持最大连接数: show variables like %max_connections%;如下: 如何查看 MYSQL 服务被多少个客户端连接了? show processlist;如下: 其中 …

数位dp--Windy数

题目 思路 大体思路其实也跟第一篇博客类似,用前缀和的思想处理区间的方案数,然后求方案数则是通过把每一位数都拆分来,然后根据两种选择0-an-1和选an两种情况进行判断,但是因为前导零会对结果产生不一样的结果(比如0…