Datawhale X 李宏毅苹果书 AI夏令营(深度学习进阶)task3

news2024/9/25 11:21:35

批量归一化

其实归一化简单一点理解就类似于我们学过的数学中的每个数值减去平均值除以标准差。

神经网络中的批量归一化(Batch Normalization,BN)就是其中一个“把山铲平”的想法。不要小看优化这个问题,有时候就算误差表面是凸(convex)的,它就是一个碗的形状,都不一定很好训练。

看下面这个图就可以看出来,假设两个参数对损失的斜率差别非常大,在 w1 这个方向上面,斜率变化很小,在 w2 这个方向上面斜率变化很大。

如果是固定的学习率很难得到很好的结果,所以我们才需要使用自适应学习率等各种优化的方法。

但是从另外一个角度想一下,我们能不能把难做的误差表面修改一下得到更好的结果,那么怎么去解决这个问题呢?

第一步:从根本上解决w1,w2为什么会出现斜率大很多的问题。

来看一个简单的线性模型:

其输入是 x1 跟 x2,对应的参数为 w1 跟 w2,它是一个线性的模型,没有激活函数。w1 乘 x1,w2 乘 x2 加上 b 以后就得到 yˆ,然后会计算 yˆ 跟 y 之间的差距当做 e,把所有训练数据 e 加起来就是损失,然后去最小化损失。

如果我们尝试使用大小为1的小批量应用批量规范化,我们将无法学到任何东西。这是因为在减去均 值之后,每个隐藏单元将为0。所以,只有使用足够大的小批量,批量规范化这种方法才是有效且稳定的。请 注意,在应用批量规范化时,批量大小的选择可能比没有批量规范化时更重要。 从形式上来说,用x ∈ B表示一个来自小批量B的输入,批量规范化BN根据以下表达式转换x:

BN(X)=\gamma *\frac{x-\mu \hat{}}{\delta }+\beta

卷积神经网络

我们从卷积神经网络开始,探讨网络的架构设计。卷积神经网络是一种非常典型的网络架构,常用于图像分类等任务。通过卷积神经网络,我们可以知道网络架构如何设计,以及为什么合理的网络架构可以优化网络的表现。

图片分类就是给机器一张图片,机器判断图片中有哪些内容。那么怎么把图片当作模型输入呢?

对于机器,图像可以描述为三维张量(张量可以想成维度大于 2 的矩阵)。一张图像是一个三维的张量,其中一维代表图像的宽,另外一维代表图像的高,还有一维代表图像的通道(channel)的数目。

彩色图片就有三个通道,分别是R、G、B代表红、绿、蓝三色

将代表图片的三维张量输入到网络中

如果把向量当作全连接网络的输入,输入特征向量的长度就是100*100*3.由于每个神经元跟输入的向量中的每个数值都需要一个权重,所以当输入的向量长度是 100 × 100 × 3,且第 1 层有 1000 个神经元时,第 1 层的权重就需要 1000×100×100×3 = 3 ×107 个权重,这是一个非常巨大的数目。更多的参数为模型带来了更好的弹性和更强的能力,但也增加了过拟合的风险。模型的弹性越大,就越容易过拟合。为了避免过拟合,在做图像识别的时候,考虑到图像本身的特性,并不一定需要全连接,即不需要每个神经元跟输入的每个维度都有一个权重。接下来就是针对图像识别这个任务,对图像本身特性进行一些观察。

模型的输出有很多种,根据模型的目标来判断模型输出。如果模型的目标是分类,我们就需要使用独热变量来表示分类的结果,在最终的分类结果中目标类别的数值为1,其他的类别数值为0。例如,输入为一张小猫的图片,最终输出向量y^{'},猫的概率最大,所以最终判断图片的内容是猫。

观察1:检测模式不需要整张图片

假设我们的任务是让网络识别出图像的动物。对一个图像识别的类神经网络里面的神经元而言,它要做的就是检测图像里面有没有出现一些特别重要的模式(pattern),这些模式是代表了某种物体的。比如有三个神经元分别看到鸟嘴、眼睛、鸟爪 3 个模式,这就代表类神经网络看到了一只鸟,如图所示。

人在判断一个物体的时候,往往也是抓最重要的特征。看到这些特征以后,就会直觉地看到了某种物体。对于机器,也许这是一个有效的判断图像中物体的方法。但假设用神经元来判断某种模式是否出现,也许并不需要每个神经元都去看一张完整的图像。因为并不需要看整张完整的图像才能判断重要的模式(比如鸟嘴、眼睛、鸟爪)是否出现,如图 4.5 所示,要知道图像有没有一个鸟嘴,只要看非常小的范围。这些神经元不需要把整张图像当作输入,只需要把图像的一小部分当作输入,就足以让它们检测某些特别关键的模式是否出现,这是第 1 个观察。

简化1:感受野

根据上述对鸟的观察,在每个不同的一小片区域卷积神经网络会设定一个区域,这个区域叫做感受野。每个神经元都只关心自己的感受野里面发生的事情,感受野是由我们自己决定的。蓝色的神经元只关心红框圈到的部分,将这个3*3*3张量输入到神经网络中,由神经元给出每个维度的不同权重,加上偏置后得到输出,这个输出在输给下一个神经元作为输入。

蓝色的神经元看左上角这个范围,这是它的感受野。黄色的神经元看右下角 3 × 3 × 3 的范围。图 4.7 中的一个正方形代表 3 × 3 × 3 的范围,右下角的正方形是黄色神经元的感受野。感受野彼此之间也可以是重叠的,比如绿色的神经元的感受野跟蓝色的、黄色的神经元都有一些重叠的空间。我们没有办法检测所有的模式,所以同个范围可以有多个不同的神经元,即多个神经元可以去守备同一个感受野。接下来我们讨论下如何设计感受野。

感受野可以有大有小,因为模式有的比较小,有的比较大。有的模式也许在 3 × 3 的范围内就可以被检测出来,有的模式也许要 11 × 11 的范围才能被检测出来。此外,感受野可以只考虑某些通道。目前感受野是 RGB 三个通道都考虑,但也许有些模式只在红色或蓝色的通道会出现,即有的神经元可以只考虑一个通道。之后在讲到网络压缩的时候,会讲到这种网络的架构。感受野不仅可以是正方形的,例如刚才举的例子里面 3 × 3、11 × 11,也可以是长方形的,完全可以根据对问题的理解来设计感受野。虽然感受野可以任意设计,但下面要跟大家讲一下最经典的感受野安排方式。

一般在做图像识别的时候,可能不会觉得有些模式只出现在某一个通道里面,所以会看全部的通道。既然会看全部的通道,那么在描述一个感受野的时候,只要讲它的高跟宽,不用讲它的深度,因为它的深度就等于通道数,而高跟宽合起来叫做核大小。图 4.8 中的核大小就是 3 × 3。在图像识别里面,一般核大小不会设太大,3 × 3 的核大小就足够了,7 × 7、9 × 9算是蛮大的核大小。如果核大小都是 3 × 3,意味着我们觉得在做图像识别的时候,重要的模式都只在 3 × 3 这么小的范围内就可以被检测出来了。但有些模式也许很大,也许 3 × 3 的范围没办法检测出来,后面我们会再回答这个问题。常见的感受野设定方式就是核大小为 3 × 3。

根据专家学者们研究出来的特性,感受野可以变化,但是要覆盖所有的通道。感受野每次移动的距离称为不负。举一个例子来说,当步幅stride=2,那么感受野就会这样移动,如下图所示:

但是我们发现了一个问题,当移动到第三个感受野时,最后一列被空在了数据区域的外面,这样的话最后一列的数据就不是有效值,会导致输出出现误差。怎么解决这个问题就需要我们根据需要增加padding填充,在数据的外面加上一圈全0数据,来保证每次都把有效数据充分使用。

观察 2:同样的模式可能会出现在图像的不同区域

下图中可以看到同样的鸟嘴可以在不同的区域出现,如果只需要鸟嘴那么我们就不需要每个感受野都去放一个检测鸟嘴的神经元,那样的话参数太多

简化2:共享参数

那么怎么简化参数,就是我们要学习的共享参数。

举个例子,解释一下这个概念:类似于教务处希望可以推大型的课程一样,假设每个院系都需要深度学习相关的课程,没必要在每个院系都开机器学习的课程,可以开一个比较大型的课程,让所有院系的人都可以修课。

在神经网络中共享参数是两个神经元的权重完全相同。

小总结

感受野+参数共享=卷积层,用到卷积层的网络叫卷积神经网络。卷积神经网络的偏差比较大。但模型偏差大不一定是坏事,因为当模型偏差大,模型的灵活性较低时,比较不容易过拟合。全连接层可以做各式各样的事情,它可以有各式各样的变化,但它可能没有办法在任何特定的任务上做好。而卷积层是专门为图像设计的,感受野、参数共享都是为图像设计的。虽然卷积神经网络模型偏差很大,但用在图像上不是问题。如果把它用在图像之外的任务,就要仔细想想这些任务有没有图像用的特性。

卷积层里面有很多滤波器,这些滤波器的大小是 3 × 3 × 通道。如果图像是彩色的,它有 RGB 三个通道。如果是黑白的图像,它的通道就等于 1。一个卷积层里面就是有一排的滤波器,每个滤波器都是一个 3 × 3 × 通道,其作用是要去图像里面检测某个模式。这些模式要在 3 × 3 × 通道,这个小的范围内,它才能够被这些滤波器检测出来。举个例子,假设通道为 1,也就是图像是黑白的。

卷积层中的滤波器

使用滤波器的例子:

观察 3:下采样不影响模式检测

把一张比较大的图像做下采样(downsampling),把图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的 1/4,但是不会影响里面是什么东西。如图所示,把一张大的鸟的图像缩小,这张小的图像还是一只鸟。

简化 3:汇聚根据第 3 个观察,汇聚也称为池化

池化分为最大池化和平均池化

最大池化就是说在下采样过程中,取每个感受野中数值最大的那个当作计算结果

平均池化是取感受野内所有数据的平均值当作结果

卷积神经网络的应用:下围棋

以 AlphaGo 为例。下围棋其实是一个分类的问题,网络的输入是棋盘上黑子跟白子的位置,输出就是下一步应该要落子的位置。网络的输入是一个向量,棋盘上有 19 × 19 个位置,可以把一个棋盘表示成一个 19 × 19 维的向量。在这个向量里面,如果某个位置有一个黑子,这个位置就填1,如果有白子,就填 -1,如果没有子,就填 0。不一定要黑子是 1,白子是 -1,没有子就是0,这只是一个可能的表示方式。通过把棋盘表示成向量,网络就可以知道棋盘上的盘势。把这个向量输到一个网络里面,下围棋就可以看成一个分类的问题,通过网络去预测下一步应该落子的最佳位置,所以下围棋就是一个有 19 × 19 个类别的分类问题,网络会输出 19 × 19个类别中的最好类别,据此选择下一步落子的位置。这个问题可以用一个全连接网络来解决,但用卷积神经网络的效果更好。

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

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

相关文章

面试基本内容

1.类加载器 类加载器加载过程: 加载:(将字节码文件加载到运行时数据区的方法区中/元空间) 链接:(验证:检查字节码文件是否合法—>准备:静态类变量赋值为默认值,不会实例变量分配初始化—>解析:将常量池引用,转化…

Java | Leetcode Java题解之第382题链表随机节点

题目: 题解: class Solution {ListNode head;Random random;public Solution(ListNode head) {this.head head;random new Random();}public int getRandom() {int i 1, ans 0;for (ListNode node head; node ! null; node node.next) {if (rando…

14.神经网络的基本骨架 - nn.Module 的使用

神经网络的基本骨架 - nn.Module 的使用 Pytorch官网左侧:Python API(相当于package,提供了一些不同的工具) 关于神经网络的工具主要在torch.nn里 网站地址:torch.nn — PyTorch 1.8.1 documentation Containers C…

【Linux】CodeServer:云IDE部署

Code-server 是一个开源项目,它允许你在任何地方通过浏览器访问 Visual Studio Code(VS Code)编辑器。这意味着你可以在远程服务器或云端运行 VS Code,并通过浏览器进行编码、调试和开发,而不需要在本地安装 VS Code。…

EtherCAT 转 ModbusTCP 网关

设备简介 本产品是 EtherCAT 和 Modbus TCP 网关,使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站,接 TwinCAT 、 CodeSYS 、 PLC等;在 ModbusTCP 侧做为 ModbusTCP 主站( Client )或从站…

<数据集>无人机识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:9229张 标注数量(xml文件个数):9229 标注数量(txt文件个数):9229 标注类别数:1 标注类别名称:[UAV] 使用标注工具:labelImg 标注规则:对类别…

我如何解决 java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter

优质博文:IT-BLOG-CN 问题 我如何解决java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter 2024-08-25T02:31:25.46202:00 ERROR 21868 --- [fintonic-oauth] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet…

springAI框架学习总结

springAI 1.springAI基本介绍 springAI是一个AI工程应用框架,其目标是将 Spring 生态系统设计原则(例如可移植性和模块化设计)应用于 AI 领域,并推广使用 POJO 作为 AI 领域应用程序的构建块。 2.特性 灵活的AIP支持chat,text…

Matlab R2022b使用Camera Calibrator工具箱张正友标定法进行相机标定附带标定前后对比代码

打开Camera Calibrator 在这添加你拍摄的图片 根据你每个方块的实际边长填写,我是15mm。 通俗一点,要k3就选3 Coefficients,否则为0;要p1、p2就选Tangential Distortion。然后进行计算。 可以点击右侧误差高的选中图像进行移…

【计算机网络】计算机网络的分层结构

为什么要分层?为什么要制定协议? 计算机网络功能复杂→采用分层结构,将诸多功能合理地划分在不同层次→对等层之间制定协议,以实现功能。

探索Scratch编程:重温《西游记-大战蜘蛛精》

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 在编程教育的浪潮中,Scratch以其简单易用的特点,成为了孩子们学习编程的热门选择。今天,我们很高兴向大家介绍一款精彩的Scratch教学案例作品——《西游记-大战蜘蛛精》。这不仅…

【JAVA入门】Day27 - 集合体系结构综述

【JAVA入门】Day27 - 集合体系结构综述 文章目录 【JAVA入门】Day27 - 集合体系结构综述一、单列集合体系结构1.1 Collection 集合的基本方法1.2 Collection 集合的遍历方式1.2.1 迭代器遍历1.2.2 增强 for 遍历1.2.3 利用 Lambda 表达式进行遍历 1.3 List 集合的基本方法1.4 L…

pyhton __init__.py

文章目录 包和模块__init__.py概述导入包和使用模块控制导入行为 包和模块 在这样一个工程中,pkg是包(package),module1.py和module2.py是模块(module),在模块中还有定义的方法、变量等,可以统称为功能。 import可以导入包&…

Node-RED解析巴法云/小米的传感器数据

在前面的博文(Node-RED订阅巴法云的数据并展示-CSDN博客)中提到过,Node-RED对JSON格式的数据很友好,直接可以解析。不过巴法云默认的格式是小米所采用的格式,即:#温度#湿度#开关#。采用这种格式的好处就是巴…

【C++二分查找】2271. 毯子覆盖的最多白色砖块数

本文涉及的基础知识点 C二分查找 LeetCode2271. 毯子覆盖的最多白色砖块数 给你一个二维整数数组 tiles &#xff0c;其中 tiles[i] [li, ri] &#xff0c;表示所有在 li < j < ri 之间的每个瓷砖位置 j 都被涂成了白色。 同时给你一个整数 carpetLen &#xff0c;表…

C++ | Leetcode C++题解之第381题O(1)时间插入、删除和获取随机元素-允许重复

题目&#xff1a; 题解&#xff1a; class RandomizedCollection { public:unordered_map<int, unordered_set<int>> idx;vector<int> nums;/** Initialize your data structure here. */RandomizedCollection() {}/** Inserts a value to the collection. …

笔记报警管理

1. IOT创建新产品 睡眠检测带 2. 养老后台 添加了一个设备 睡眠检测带_201_1 3. 新增了模拟器(3个模拟js运行) 4. 创建了消费者组(默认DEFAULT) 5. 创建订阅(3个产品的上报信息 传给DEFAULT)消息处理 前面我们已经完成了设备的管理&#xff0c;现在&#xff0c;我们就来处…

50.x86游戏实战-XXX副本内瞬图

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

《前端攻城狮 · Snowflake 雪花算法》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

Ruff :是一个用Rust编写的极快的 Python linter 和代码格式化程序

安装 pip install ruff 语法检查 要对代码运行 linter&#xff0c;我们使用 ruff check . 如果你想在单个文件上运行它&#xff0c;请这样做 ruff check <filename.py> 总共有 415 个错误。其中 33 个可以修复&#xff01; 为了修复它们&#xff0c;我们使用标志--f…