深度学习之卷积神经网络

卷积神经网络简称为CNN

首先我们来回顾一下,我们之前学到的全连接的神经网络:

上面我们通过线性层串行连接起来的神经网络,我们叫做全链接的网络,在线性层里面,我们的输入值和任意的输出值之间都存在权重,也就是说我们的每一个输入节点都要参与到下一层的输出节点的计算上面,因此我们称这样的线性层叫做全连接层(任意两层之间所有的节点都进行连接)。

下面我们介绍二维卷积的神经网络:
例如我们的手写图像识别,我们输入的是一个1*28*28的张量,这三个值分别是channel(通道数),width(宽度),height(高度)。然后我们这个图像要通过卷积层处理得到4*24*24。
为什么不直接使用全链接层呢?(全连接层需要将输入转化为一个向量,向量是一长段的数,不具有空间上的二维特征,不能很好的保留输入之间层与层之间的联系,但是我们图像层与层之间的信息我们还是要保留的,所以我们通过使用卷积,将其转化为具有空间结构的张量,明显全链接的运算只有矩阵运算,维度最高才是二维,包含层级之间的信息比较少)。

我们希望保留图像的空间信息,通过卷积,我们将其转化为四个通道,24*24的像素。(当然也是CWH,通道和长度高度都有可能改变)。显然,一个图像经过卷积层卷积出来的结果仍然是一个三维的张量,接下来我们做一个2*2的下采样。

经过下采样处理之后,我们的输出就变成了4个通道,12*12的像素。在采用下采样的过程中,我们的通道数是不变的,但是图像的宽度和高度会发生改变,下采样的作用是减少我们数据的数据量,减少元素数量,降低计算需求。最终的目标是要做分类,所以不管我们中间层怎么处理,我们的输出都要是一个十维的向量,即10*1的矩阵。那我们就需要采用一些方法:比如先升高,再降低。不管我们使用什么方法,我们最终一定是将1*28*28的三维输入,转化为一个10*1的二维输出(也可以叫做是长度为10的向量)。

事实上我们将其转化的过程如下图:

我们从三阶张量输出一个向量。怎么实现维度转化呢?我们以S2到n1为例,我们将平面沿着通道数展开,就将8*4*4转化为了32*4(即将每个通道里的张量放在同一纬度一次排开)。得到n1,我们再使用全连接层,将其映射到十维的输出。然后我们再接上交叉熵损失,用SoftMax去计算它的分布,最终呢,我们就可以去解决分类问题。那我们在构建神经网络的时候,首先要明确,我们的输入,它的张量的维度,输出的张量的维度,我们要想使我们的网络正常的工作,我们就需要利用我们网络的各种层,进行维度上或者每个维度上尺寸大小的变化,最终使其映射到我们想要的各种输出里面,所以不论是卷积也好,全链接也好,我们都是在做空间变换,所以我们在神经网络里面,前面的卷积也好,下采样也好,其实我们都可以称其为Feature Extraction(特征提取)。
我们能通过卷积运算,找到他们的某种特征,全链接的网络叫做分类器。

讨论卷积之前,我们首先来讨论图像:

明显,这个图像是一只猫,在计算机里面,我们会将图像分割成一个个格子,每个格子都有颜色值,我们将每个格子的颜色都填上去,就构成了图像,这样我们就构成了图像,这叫做栅格图像,从自然界获取图像的手段一般都是栅格图像,不管是用手机,用摄像机,我们获取的图像都是栅格图像。 

除了栅格图像还有一种图像叫做矢量图像,矢量图像不是可以从自然界直接捕获的,而是需要人工生成,或者称之为程序生成的。我们描述矢量图像的时候,不是使用图像的方式,而是描述他的特征,例如用计算机做出一个圆,我们描述它的圆心在哪,直径是多少,边是什么颜色,填充什么颜色。简单的例子就是easyx。

我们拿到一个图像肯定是分成红绿蓝三个通道,也就是我们常说的channel,这个在深度学习里面,我们将默认输入图像的RGB,我们称之为Input Channel。

如果我们在这个图像中取一个小块。

我们使我们的块在图像上依次开始滑动,用块儿的大小,将图像遍历一遍,然后对每一个块儿都进行卷积运算,最后得到输出卷积结果,将输出卷积结果放到一起。

我们得到的块儿的通道数,宽度和高度都有可能改变,例如图中通道数从3变成4,可能是由下面三层进行相加得到的结果作为第四层。当然包含了原有信息,而且又能增加一个新的信息。新的信息获得新的特征。

下面我们来看卷积的运算过程:

假设我们刚开始的输入是一个1*5*5的张量,卷积核是1*3*3的张量。我们要先用3*3的核在输入里面画出一个3*3的窗口,就是输入里面的红圈部分,然后使红圈里面的数据和我们卷积核里面的数据做数乘。

得到的结果作为我们输出的元素,同理,我们将块儿往右边移动(也就是逐渐进行遍历)。做同样的运算,得到的结果作为输出的元素。写入output。

直到全部遍历完成得到输出,注意:这是单通道,也可以说成是矩阵的卷积,但是我们经常做卷积的输入是多通道。三通道用的比较多,但是有时候也会有上百个或者更多的通道。

我们以三个通道为例:

我们对于每个通道都要进行卷积,每个通道对应一个卷积核,那么有多少个通道,我们就需要有多少个卷积核。如果我们输入的通道有五个,那么我们需要五个卷积核。
接下来我们需要对三个矩阵做加法,得到一个通道:

那我们就是3*5*5的输入和3*3*3的卷积核进行相乘(这就叫做卷积运算)。得到一个1*3*3的通道。

那么显然,在这种情况下,我们的输入的通道有三个,但是输出的通道数只有1个。

显然,我们对于3*3的卷积核,我们的输出结果的长和宽对应输入是要分别减去2的。

显然,我们经过n*3*3的卷积核,我们的输出是一个通道,但是,如果我们能使用多个卷积核,我们就能得到多个通道,这些通道按层次叠起,就得到一个多通道的输出。

然后我们将通道按顺序叠起:

由上面的图,我们有以下几个发现:
1,每个卷积核的通道数量要求和输入的通道数量是一样的。
2,这种卷积核的总数要求和输出的通道数量是一样的。
3,卷积核的长和宽是自定义的。

所以我们就可以由输入层和输出层来判断卷积核的维度:

卷积层中卷积核的个数由输出维度决定,每个卷积核中有多少层由输入维度决定。

下面是我们在pytorch中实现的代码分析:

这里的batch_size表示的是输入的个数,卷积核的参数:输入维度,输出维度,卷积核的形状,形状一般表示是正方形,当然,我们也可以表示为长方形。
接下来,我们把我们的输入传给卷积层进行处理得到output输出。

接下来我们来看上面张量形状的输出:符合我们的预期。
当然,我们对于卷积层的形状来说,后面两个参数,宽度和高度是可以我们自己定义的,前面两个参数是要根据输入的形状和输出的形状来决定。

有时候我们希望输入的维度是5,输出的维度也是4,在不改变卷积层的形状的同时,我们需要对输入进行处理,将其扩大一圈(或者多圈),扩大的部分的元素全部填为0,然后再经过卷积层处理,得到我们的结果。 当然,默认是填充0,但是还有很多种选择:

下采样:

我们用到的比较多的下采样方法是最大池化层(MaxPolling),我们要怎么做呢?

以上图为例,最大池化层是没有权重的(前面我们学的那些层,卷积层,全连接层都是带有权重的),2*2的最大池化层它的工作原理是什么样的呢?我们可以把4*4的图像分成2*2一组,然后在每一组中找最大值,然后将最大值拼成2*2的矩阵,作为新的一组输出。

很明显,我们在做最大池化的过程中,我们只是对每个通道进行最大池化,通道之间不能进行最大池化操作的,显然,上图中输入的是一个通道的数据。所以做池化,或者说下采样,通道数量是不改变的,但是形状(指的是宽和高是会改变的)。例如我们使用2*2的池化层,我们的图像大小会缩小到原来的一半,同理,3*3会缩小1/3。

下面我们来具体实现:

首先我们进行卷积处理,我们的卷积层:面积(指的是长*宽)5*5,输入通道是1,输出通道是10。

经过卷积之后,我们还要做一个最大池化,得到一个10*12*12的张量,然后我们再使用一个5*5的卷积核,输入通道和输出通道分别是10和20,得到的输出是20*8*8,最后再做一个池化层,得到20*4*4的张量。

那么现在,我们得到320个元素,然后这320个元素,我们将其转化为一个向量,然后经过全链接层,输出的向量元素个数是10。

卷积层和池化层并不在乎我们输出通道的大小,因为无论输入多少通道,它都能处理,分类器是最在乎。他需要知道元素个数是多少。在图中是320。其实我们可以在分类器处理之前,先将得到的张量的形状输出,得到元素个数,便于设置分类器的参数。

具体的代码实现:

我们在得到20*4*4的张量的时候要进行一次reshape,或者是view。将其转化为一个320个元素的向量。

模型代码如下:

batch_size=x.size(0):获得每一批次的数量。

当我们有GPU的时候,我们可以使用GPU。这段话,有显卡的话,可以使用GPU。

然后我们使用model.to(device)。表示我们将这个模型放在cuda(显卡)里面计算。将CPU的功能全部迁移到GPU上面。

同时Input和target也要放在显卡上面。使用显卡来加速我们的运算过程。

显然,训练很多轮的话,准确率提升到98%。

那么,为什么我们需要花费那么多时间从97%训练到98%呢?只增加这么一点。
我们应该从错误率的角度去考虑,我们是从3%的错误率降低到2%,提高了1/3。那这样是不是伟大很多了呢?!


 


 

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

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

相关文章

05 Redis之Benchmark+简单动态字符串SDS+集合的底层实现

3.8 Benchmark Redis安装完毕后会自动安装一个redis-benchmark测试工具,其是一个压力测试工具,用于测试 Redis 的性能。 src目录下可找到该工具 通过 redis-benchmark –help 命令可以查看到其用法 3.8.1 测试1 3.9 简单动态字符串SDS 无论是 Redis …

中间件系列 - Kafka3.x从入门到精通

前言 学习视频:【尚硅谷】Kafka3.x教程(从入门到调优,深入全面)本内容仅用于个人学习笔记,如有侵扰,联系删除 1 Kafka 概述 1.1 定义 Kafka传统定义: Kafka 是一个分布式的基于发布/订阅模式的消息队列…

JMeter GUI:测试计划和工作台

什么是测试计划? 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试所需的所有元素(如线程组、计时器等)及其相应的设置。 下图显示了测试计划的示例 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试…

OpenCV实战:控制手势实现无触摸拖拽功能

前言: Hello大家好,我是Dream。 今天来学习一下如何使用OpenCV来控制手势,瞬间提升操作体验!跨越界限,OpenCV手势控制拖拽功能现身。 一、主要步骤及库的功能介绍 1.主要步骤 要实现本次实验,主要步骤如下…

设计模式——职责链模式(Chain of Responsibility Pattern)

概述 职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为…

【基础算法】1、快速排序快速选择

快速排序思想: 1、找一个分界点。 2、在分界点两边开始调整范围。 3、递归两边,重复。 例题: 给定你一个长度为 n的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xf…

prism 10 for Mac v10.1.1.270激活版 医学绘图分析软件

GraphPad Prism 10 for Mac是一款专为科研工作者和数据分析师设计的绘图和数据可视化软件。以下是该软件的一些主要功能: 软件下载:prism 10 for Mac v10.1.1.270激活版 数据整理和导入:GraphPad Prism 10支持从多种数据源导入数据&#xff0…

第六讲_JavaScript原型

JavaScript原型 1. 原型的概念2. 原型继承2.1 原型链 3. class类的原型对象 1. 原型的概念 原型是 JavaScript 对象相互继承特性的机制。 每个函数都有一个 prototype 属性,这个属性指向一个对象,这个对象称为原型对象。每个对象都有一个 [[Prototype]…

Linux操作系统权限相关问题(一站式速通权限)

一、sudo命令 sudo yum install -y sl sudo命令的作用 不切换用户,就想让普通用户以root的身份,执行对应的指令 输入密码时,输入的是自己普通用户的密码,而不是root的密码!!! sudo可以进行…

C语言——如何进行文件操作

大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流 本文由:残念ing原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各位→…

在线意间AI绘图接口HTML在线页面

在线意间AI绘图接口写的HTML单页面 自适应单页面,下载可以直接在电脑上双击打开运行 手机上自行放到主机去通过域名访问

ae视频特效制作 -- After Effects 2024

After Effects 2024是一款专业的动态图形和视觉效果制作软件,广泛应用于电影、电视、广告和多媒体制作等领域。相比之前的版本,After Effects 2024在功能和性能方面都有了显著的提升,增加了许多新功能和改进。 首先,After Effect…

Python编辑开发 --- pycharm pro 中文

PyCharm Pro是一款专业的Python集成开发环境(IDE),由JetBrains公司开发。它为Python开发者提供了丰富的功能和工具,使得Python编程变得更加高效和便捷。PyCharm Pro具有智能代码编辑功能,能够自动完成代码、快速导航至…

Guava EventBus详解

概述 EventBus顾名思义,事件总线,是一个轻量级的发布-订阅模式的应用模式。相比于MQ更加简洁,轻量,它可以在一个小系统模块内部使用。 EventBus允许组件之间通过发布-订阅进行通信,而不需要组件之间显示的注册。它专门…

【数据结构 01】栈

一、原理 栈通常从数据结构和内存空间两个角度解释,从数据结构的角度,栈是一种线性结构表,只允许在固定的一端进行插入和删除元素,从内存空间角度,操作系统为函数和变量分配的内存空间通常在栈区,但是无论…

状态码400以及状态码415

首先检查前端传递的参数是放在header里边还是放在body里边。 此图前端传参post请求,定义为’Content-Type’:‘application/x-www-form-urlencoded’ 此刻他的参数在FormData中。看下图 后端接参数应为(此刻参数前边什么都不加默认为requestP…

基于Vue uniapp和java SpringBoot的汽车充电桩微信小程序

摘要: 随着新能源汽车市场的迅猛发展,汽车充电桩的需求日益增长。为了满足市场需求,本课题开发了一款基于Java SpringBoot后端框架和Vue uniapp前端框架的汽车充电桩微信小程序。该小程序旨在为用户提供一个简洁高效的充电服务平台&#xff0…

321倒计时素材视频在哪找?试试这4个软件

321倒计时素材视频在哪找?在这个信息爆炸的时代,视频素材在各种媒体平台上的需求日益增长。而倒计时视频素材作为其中一种,更是因其独特的功能和效果,被广泛应用于各种场景。那么,哪些软件提供倒计时视频素材呢&#x…

su模型库免费下载哪家好?

选择SU模型库免费下载的网站,需要根据个人的需求和偏好进行评估。以下是一些热门的SU模型库免费下载网站,供您参考: ①建e网:这是一个专业的室内设计资源平台,包括各种类型的SU模型,如家装、公装、商业空间…

echarts:获取省、市、区/县、镇的地图数据

目录 第一章 前言 第二章 获取地图的数据(GeoJSON格式) 2.1 获取省、市、区/县地图数据 2.2 获取乡/镇/街道地图数据 第一章 前言 需求:接到要做大屏的需求,其中需要用echarts绘画一个地图,但是需要的地图是区/县…