30. 深度学习进阶 - 池化
Hi,你好。我是茶桁。
上一节课,我们详细的学习了卷积的原理,在这个过程中给大家讲了一个比较重要的概念,叫做input channel
,和output channel
。
当然现在不需要直接去实现, 卷积的原理PyTorch、或者TensorFlow什么的其实都实现了。但我们现在如果要用PyTorch的卷积操作,它就会有一个input channel和output channel的一个写法。
这里的方法是Conv2d
,表示这里所应用的filter是一个2d的。那么它如何去做3d的? 是将每一层的结果加在一起。
与此对应的还有一个Conv3d
, 这个时候filter就是很多个不一样的。
我们一般在使用的时候,应用的都是Conv2d
。感觉上好像觉得Conv3d里,我们每一层的值不一样其实会更好。但其实现在得到的这个filter是咱们人工写的,但是我们为了提取出来大自然中非常非常多的特征,其实我们会让机器自动生成、自动初始化一堆filter,这些filter的结果全部都是随机的。
就是说,这个filter的结果在深度学习中其实这些结果都是随机的,然后通过训练和反向传播,这些filter会自动地学习出来一个值。也就是说它会自动地收敛到某个数值上,而这个数值在这种环境下卷积应该怎么提取特征,那么我们做成2D的话所需要拟合的参数其实就少了。
假如filters前边的input channel很多、很深,那么这个filters需要拟合的参数也很多,如果是2D的话,只需要拟合2D的这一层就可以了。这就是2D和3D的区别,以及为什么一般要用2D不用3D。
如果现在要用卷积的话,第一个参数就是input channel。第二个就是output channel。output channel其实就是有多少个filters。
那kernel size指的就是做卷积的时候这个卷积的大小。比方说是3 * 3的,那么Kernel size就是3,也可以写成(3,3)。
还有一个参数叫做stride,这个stride就是步幅。那这个步幅是干什么的?我们一般用filter去卷积图像的时候,在矩阵上是一个单位一个单位从左到右从上到下移动的,这个步幅是为了加快移动,从而设置的间隔。比如[10, 9, 8, 7, 6]
, 那我就拿一行来举例,知道意思就行了。比如这样一个数列,如果filter是3列,那按顺序就应该先是[10, 9, 8]
,然后是[9, 8, 7]
, 但是我设置了stride就可以跳步来执行。在[10, 9, 8]
之后,可以是[8, 7, 6]
。stride默认为1。
下面一个参数, padding。假如是一个6 * 6的图像矩阵,有一个3 * 3的filter, 那么对这6 * 6的图像进行卷积,会先变成一个4 * 4,然后变成2 * 2。显示出来的结果就是在不断地变小,代表抽象层次越来越高。
那么因为每一次window都在不断变化,在进行下一轮的时候,如果这中间要加一些什么操作,维度发生变化,会导致每一次中间要连接什么东西的时候维度都得重新去计算。
也就说维度不断的变化,会导致写代码的时候计算会变得更复杂。
那第二,就是我们也不希望减少的太快了。举个极端情况,把1万 * 1万的图像很快就变成一个2 * 2的了。抽象层次太高信息就少了。
第三个解释起来比较复杂,我们脑子里想想一下,一个filter在图像上进行从左到右移动,那么在依次进行卷积计算的时候,最左边的一列就只计算了一次,但是中间位置就会被卷入计算多次。我们希望的是边上的的数据也能被计算多次,就是也能被反复的提取。
要解决这三个问题有一个很简单的方法,就是padding。它的意思就是在这个图形外边加了一圈或者两圈0。如果你要加一圈0的话,padding=1
。如果等于2的话,就加两圈0。
接下来,dilation
。这个是在我们做图形的分割的时候用的。在图形识别的时候大家现在先不用去学习它。
我们一张图片进行卷积的时候,会越来越小,这个叫做下采样, down sampling。进行完下采样之后,如果要做图像的切分,我们要把图像里边主体部分全部给它涂黑,别的地方全部涂白,需要基于这个小的采样又把它给扩大,慢慢恢复到原来大小,这个叫做上采样。上采样时,有时候会用到dilation
。
重要的就是这几个参数。这几个参数给大家说完,其实基本上卷积的几个重要的特性就说明白了。
池化
除了卷积之外,还有一个比较重要的操作: pooling
, 池化操作。
池化操作其实很简单,我们给定一个图片,卷积操作是选了一个window和filter,做了一个f乘w然后给它做相加. sum(f*w)
. pooling是一个很直接的操作, 把w这里边所有的值给它取个平均值, 也有可能取个最大值。假如是它最大值,那么值最大就代表着是在这个图形里边对他影响最重的这个点。
那么做了pooling之后,每一次这样一个操作,图形变小了,但是图像基本上保持了原来的样子。就是pooling操作前后的图像是相似的,它取了最重要的信息。
我们现在来思考一下,如果有一个图片,不管是卷积还是pooling都会让其缩小。那我们思考下, 既然两个操作都会导致图像缩小,那为什么会存在两个操作呢?
咱们机器学习里面最头疼的事情就是所谓的过拟合,过拟合就是在训练的时候效果挺好,结果在实际中效果就不好了。
而控制过拟合最主要的就是能够减少参数,在越少的参数能达到效果的时候,我们期望参数越少越好,在同样的数据量下就越能防止过拟合。
卷积里面这些值以前的时候是人来确定,但现在其实是期望机器自动的去求,也就是说这个参数是需要自己去求解的。而pooling并不需要去设定参数,它没有参数,这样会减少参数。
用了pooling之后不仅减少了参数, 还减少了接下来x的维度。所以最核心的其实是我们减少了所需要训练的参数。
之所以用pooling是因为可以减少参数,可以让它的过拟合的问题减弱。但是如果你的数据量本身就很多,或者说模型本身就比较好训练、好收敛,那你没有这个pooling操作其实也是可以的。
权值共享和位置平移
那么这个时候就要跟大家来讲一个比较重要的概念,叫做权值共享和局部不变性: Parameters Sharing and Location Invariant
.这个Loction Invariant也有人把它叫做shifting Invariant。CNN的最重要的两个特点,第一个特点就是它的权值共享。
我们给定一个图片,就之前我那个头像,假如有一个filter,它是3 * 3的,那么这3 * 3的这个网格它在每一个窗口上都是和这个filter做的运算。
那么大家想一下,假如有一个1,000乘以1,000的一个图形,我们这1,000 * 1,000的图形我们要把它写成wx+b
的话,这个x是100万维的,那么这个w也是100万维的。
那么如果我们要做训练的话,就要训练100万个w。这是拟合一个线性变化,那么我们如果现在是要去拟合一个卷积,假如output channel是10,那我们需要拟合的参数是多少?
卷积核是3 * 3, 有10个。 那就是9 * 9再乘以10。不管这个地方是1,000 * 1,000还是1万 * 1万,我们要拟合的都是卷积核里的这个参数。
我们做一层卷积,哪怕给了10个卷积核,也是九十个。如果要给它做一层线性变化,得100万个,这两个相差特别大。
为什么相差这么大?是因为不同的位置上用的filter的值是一样的。filter的参数整个图像共享了。这就是卷积神经网络的权值共享。
那么我们现在想一下,我们有了这个Parameters Sharing,它的作用是什么?
减少参数量的作用是防止过拟合,防止过拟合的最终体现就是我们在各种计算机视觉上的任务,表现就好。除此之外还有一个特性,它可以大大的提升我们的计算速度。
本来我们以前如果你有这么多参数的话,要反向传播一次要进行100万个反向传播。现在我们只要进行九十个就行了。
所以权值共享其实是卷积神经网络为什么效果特别好的原因。
2012年的时候,计算机视觉的测试效果一下子有了突飞猛进。当时就是因为用了卷积神经网络。
以前大家在实验室环境下,在训练集上的效果都挺不错,但是一拿到测试集的时候效果就很差。后来用卷积神经网络之后,这个错误率一下就下降了。
权值共享这个特性因此带来了一个特点,就是Loction Invariant。就是一个局部的东西,我们把它信息连接在一块了。
我们分别有两张图片,比如下面这张我以前画的一幅画,我把构图分别改变一下。
这两个图像数据表征上是很不一样,但是眼睛所在的位置经过卷积之后,只要用的是同一个卷积核,产生的结果是相似的。所以这个Loction Invariant指的意思是,不管这个眼睛在哪我们都能提取出来。
假设我们在train的时候, 眼睛不管在哪,只要把这个filter训练出来了,在test数据集上就算它的位置变了我们依然能够提取出来它的特征,依然能够计算出来和它相似的这个值,这个就叫做Loction Invariant。
这两个特性是极其重要的。
搭建卷积神经网络这个事,说实话最主要的还是要看经验。那么前人的总结就很值得借鉴,下节课,我们就来看看几种经典的神经网络结构。
相关文章:
30. 深度学习进阶 - 池化
Hi,你好。我是茶桁。 上一节课,我们详细的学习了卷积的原理,在这个过程中给大家讲了一个比较重要的概念,叫做input channel,和output channel。 当然现在不需要直接去实现, 卷积的原理PyTorch、或者TensorFlow什么的…...
工业应用新典范,飞凌嵌入式FET-D9360-C核心板发布!
来源:飞凌嵌入式官网 当前新一轮科技革命和产业变革突飞猛进,工业领域对高性能、高可靠性、高稳定性的计算需求也在日益增长。为了更好地满足这一需求,飞凌嵌入式与芯驰科技(SemiDrive)强强联合,基于芯驰D9…...
Webrtc 学习交流
花了几周的时间研究了一下webrtc ,并开发了一个小项目,用来点对点私密聊天 交流传输文件等…后续会继续扩展其功能。 体验地址,大狗子的ID,我在线时可以连接测试到我 f3e0d6d0-cfd7-44a4-b333-e82c821cd927 项目特点 除了交换信令与stun 没…...
华为云之轻松搭建 Nginx 静态网站
华为云之轻松搭建 Nginx 静态网站 一、本次实践介绍1. 本次实践目的2. 本次实践环境 二、ECS弹性云服务器介绍三、准备实践环境1. 预置环境2. 查看ECS服务器的账号密码信息3. 登录华为云4. 远程登录ECS服务器 四、安装配置 Nginx1. 安装nginx2. 启动nginx3. 浏览器中访问nginx服…...
【pytorch】图像运行过程中,保证梯度情况下变换
部分操作是危险的,会中断梯度流。 self.patch_transformer(adv_patch, lab_batch, img_size, do_rotateTrue, rand_locFalse)p_img_batch self.patch_applier(img_batch, adv_batch_t) # torch.Size([56, 3, 329, 416])可行危险操作 torch.clamp(adv_batch, 0…...
学习Java第70天,过滤器Filter简介
过滤器概述 Filter,即过滤器,是JAVAEE技术规范之一,作用目标资源的请求进行过滤的一套技术规范,是Java Web项目中最为实用的技术之一 Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口 Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest和…...
Ubuntu Desktop 22.04 设置 ssh 超时时间
Ubuntu Desktop 22.04 使用 ssh 连接服务器时,发现一段时间不操作就会自动断开连接,解决方法如下: 打开 /etc/ssh/ssh_config 文件: sudo vim /etc/ssh/ssh_config在文件最后添加: # ssh 客户端会每隔 30 秒发送一个…...
【微服务】Spring Aop原理深入解析
目录 一、前言 二、aop概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk代理示例 3.1.2 jdk动态代理模拟实现…...
Spring Boot JSON中文文档
本文为官方文档直译版本。原文链接 Spring Boot JSON中文文档 引言Jackson自定义序列化器和反序列化器混入 GsonJSON-B 引言 Spring Boot 提供与三个 JSON 映射库的集成: GsonJacksonJSON-B Jackson 是首选的默认库。 Jackson Spring-boot-starter-json 提供了…...
Flink系列之:State Time-To-Live (TTL)
Flink系列之:State Time-To-Live TTL 一、TTL二、TTL实现代码三、过期状态的清理 一、TTL Flink的TTL(Time-To-Live)是一种数据过期策略,用于指定数据在流处理中的存活时间。TTL可以应用于Flink中的状态或事件时间窗口࿰…...
数据结构(Chapter Two -01)—线性表及顺序表
2.1 线性表 线性表是具有相同数据类型的n个数据元素的有限序列。第一个元素为表头元素,最后一个元素为表尾元素。除第一个元素,每个元素有且仅有一个直接前驱。除最后一个元素,每个元素都仅有一个直接后继。 其中线性表包括以下(…...
【刷题笔记1】
笔记1 string s;while(cin>>s);cout<<s.length()<<endl;输入为hello nowcoder时,输出为8 (nowcoder的长度) 2.字符串的输入(有空格) string a;getline(cin, a);cout<<a<<endl;输入为ABCabc a 输出为ABCabc a …...
视频数据卡设计方案:120-基于PCIe的视频数据卡
一、产品概述 基于PCIe的一款视频数据收发卡,并通过PCIe传输到存储计算服务器,实现信号的采集、分析、模拟输出,存储。 产品固化FPGA逻辑,实现PCIe的连续采集,单次采集容量2GB,开源的PCIe QT客…...
Windows使用VNC Viewer远程桌面Ubuntu【内网穿透】
文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…...
javascript 数组处理的两个利器: `forEach` 和 `map`(上)
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
【C语言】SCU安全项目1-FindKeys
目录 前言 命令行参数 16进制转字符串 extract_message1 process_keys12 extract_message2 main process_keys34 前言 因为这个学期基本都在搞CTF的web方向,C语言不免荒废。所幸还会一点指针相关的知识,故第一个安全项目做的挺顺利的,…...
IDA pro软件 如何修改.exe小程序打开对话框显示的文字?
环境: Win10 专业版 IDA pro Version 7.5.201028 .exe小程序 问题描述: IDA pro软件 如何修改.exe小程序打开对话框显示的文字? 解决方案: 一、在IDA Python脚本中编写代码来修改.rdata段中的静态字符串可以使用以下示例代码作为起点(未成功) import idc# 定义要修…...
Ubuntu22.04切换用户
一、只有一个用户时没有切换用户菜单项 1、用户信息 cat /etc/passwd 2、系统菜单 二、添加用户 添加新用户ym,全名yang mi 三、有两个及以上的用户时出现切换用户菜单项 1、用户信息 cat /etc/passwd 2、系统菜单 四、切换用户 1、点击上图中Switch User …...
torch.gather(...)
1. Abstract 对于 pytorch 中的函数 torch.gather(input, # (Tensor) the source tensordim, # (int) the axis along which to indexindex, # (LongTensor) the indices of elements to gather*,sparse_gradFalse,outNone ) → Tensor有点绕,很多博客画各…...
vscode如何开发微信小程序?JS与TS的主要区别?
要在 VS Code 中编写微信小程序代码并同步到 Git,需要安装以下插件: 1. 微信小程序插件(WeChat Mini Program):此插件提供了微信小程序的语法高亮、代码提示、调试、上传等功能。 2. Git 插件(GitLens、…...
产品入门第五讲:Axure交互和情境
目录 一.Axure交互和情境的介绍 1.交互介绍 概念 常见的Axure交互设计技巧 2.情境介绍 概念 常见的Axure情境设计技巧: 二.实例展示 1.ERP登录页到主页的跳转 2.ERP的菜单跳转到各个页面 📚📚 🏅我是默,一个…...
Python 自动化之收发邮件(一)
imapclient / smtplib 收发邮件 文章目录 imapclient / smtplib 收发邮件前言一、基本内容二、发送邮件1.整体代码 三、获取邮件1.整体代码 总结 前言 简单给大家写个如何用Python进行发邮件和查看邮件教程,希望对各位有所帮助。 一、基本内容 本文主要分为两部分…...
Flutter开发笔记 —— sqflite插件数据库应用
前言 今天在观阅掘金大佬文章的时候,了解到了该 sqflite 插件,结合官网教程和自己实践,由此总结出该文,希望对大家的学习有帮助! 插件详情 Flutter的 SQLite 插件。支持 iOS、Android 和 MacOS。 支持事务和batch模式…...
OxLint 发布了,Eslint 何去何从?
由于最近的rust在前端领域的崛起,基于rust的前端生态链遭到rust底层重构,最近又爆出OxLint,是一款基于Rust的linter工具Oxlint在国外前端圈引起热烈讨论,很多大佬给出了高度评价;你或许不知道OxLint,相比ES…...
第一次使用ThreadPoolExecutor处理业务
通过对业务逻辑的分析,进行编码,先把第一条sql查出来的数据进行分组,然后分别使用不同的线程去查询数据返回,并添加到原来的数据中。 总感觉哪里写的不对,但是同事们都没用过这个,请大家指教一下ÿ…...
Sharding-Jdbc(6):Sharding-Jdbc日志分析
1 修改配置 将配置文件中的开启分片日志从false改为true Sharding-JDBC中的路由结果是通过分片字段和分片方法来确定的,如果查询条件中有 id 字段的情况还好,查询将会落到某个具体的分片;如果查询没有分片的字段,会向所有的db或者是表都会查…...
centos安装了curl却报 -bash: curl: command not found
前因 我服务器上想用curl下载docker-compress,发现没有curl命令,就去下载安装,安装完成之后,报-bash: curl: command not found 解决方法 [rootcentos ~]# rpm -e --nodeps curl warning: file /usr/bin/curl: remove failed: …...
Re58:读论文 REALM: Retrieval-Augmented Language Model Pre-Training
诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称:REALM: Retrieval-Augmented Language Model Pre-Training 模型名称:Retrieval-Augmented Language Model pre-training (REALM) 本文是2020年ICML论文,作者来自…...
java的json解析
import com.alibaba.fastjson.*; public class JsonParser { public static void main(String[] args) { String jsonStr "{\"name\":\"John\", \"age\":30}"; // JSON字符串示例 // 将JSON字符串转换为JSONObject对象 JSONObje…...
Spring事务失效的几种情况
Spring事务失效的几种情况 1、未被Spring管理的类中的方法 这种情况是指:没有在类上添加Service、Repository、Component等注解将类交由Spring管理,然后该类中还有加上了Transactional注解 例如: Service //如果没有添加Service这个注解…...
网站改版建设情况的汇报/集客营销软件官方网站
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式一般涉及到的角色有: 抽象角色&am…...
基于工作过程的商务网站建设 网页制作/店铺推广怎么做
IOS 字典模型互转框架 MJExtension能做什么? MJExtension是一套字典和模型之间互相转换的超轻量级框架 MJExtension能完成的功能 字典(JSON) --> 模型(Model) 模型(Model) --> 字典&…...
房地网站制作/2345网址导航下载桌面
你鼓捣完了那20个HTTP请求,安装的过程如果,提示python[api]错误rpm -Uvh python* --no-deps后面的 --no-deps在我的机器上没用,所以我去掉了太刺激了,现在是凌晨3:09.你可以根据你的机器型号去找源码包.CSDN有时候还是管用的.最起码有个思路.倒霉啊,修改下面这个文件.修改这个文…...
郑州网站建设一汉狮网络/网站设计公司官网
近年来,无论是在业务上、运营中、还是在流程上,数字化转型已经让许多组织和公司能够在可扩展性、生产效率、以及灵活性方面得到了大幅提升。不过,凡事都有利弊。新的数字化技术也会带来各种数据泄露、以及网络攻击事件的频发。因此࿰…...
开发网站用什么工具做设计/如何在百度搜索到自己的网站
在java中,垃圾意味着未引用的对象。垃圾收集是自动回收运行时未使用内存的过程。 换句话说,它是一种销毁未使用对象的方法。它类似于,在C语言中使用free()函数,在C中使用delete()。 但是,在java中这些会自动执行。因此…...
网站备案文件吗/网站流量宝
C#: substring(第一参数,第二参数)// 第一参数:从第几位开始截,初始是从0位开始 第二参数:截取几位 substring(参数) 如果传入参数为一个长整, 且大于等于0,则以这个长整的位置为起始,截取之后余下所有作为字串。 …...