神经网络(第二周)

一、简介

1.1 需求预测示例

1.1.1 逻辑回归算法

根据价格预测商品是否畅销。特征:T恤的价格;分类:销售量高1/销售量低0;使用逻辑回归算法进行分类,拟合效果如下图所示:

 1.1.2 神经元和神经网络

将逻辑回归的输出记为a(activation),整个逻辑回归算法都视作一个神经元,神经网络如下图所示:

以上是对单个神经元的描述,现在构建神经网络只需要将这些神经元串在一起并将它们连接在一起即可。现在根据多个特征:T恤的价格、运费、营销量,以及材料质量(优质厚棉还是劣质材料)这四个特征来预测商品是否畅销。我们知道,一件T恤是否畅销,可能取决于实惠性、潜在买家的认知度、感知质量这三个因素。我们利用逻辑回归算法构建第一个神经元,将价格、运费这两个特征作为输入,实惠性与否的概率作为输出。再将营销量特征作为输入,潜在买家的认知度高低的概率作为输出,使用逻辑回归算法构建第二个神经元。将价格、材料质量两个特征作为输入,感知质量好坏的概率作为输出,使用逻辑回归算法构建第三个神经元。最后将前面三个神经元的输出作为新的输入,畅销高低的概率作为新的输出,使用逻辑回归算法构建第四个神经元。神经网络如下图所示:

层是一组神经元,它们将相同或相似的特征作为输入, 然后一起输出一些数字。前面三个神经元构成一个“层”,四个输入特征作为“输入层”,前三个神经元的输出作为“激活值”,右侧神经元构成一个“输出层”。 

但是在实际中,设计神经网络的时候,不需要指定哪些特征作为某个神经元的输入,可以将所有的特征都作为任何一个神经元的输入。也不需要指定神经元的输出是何含义。除了“输入层”、“输出层”,中间的所有层都称为“隐藏层”,我们是不需要知道隐藏层中的实现细节。这就是神经网络的强大之处,他会自动计算在某个隐藏层中需要用到的特征。

如上图所示,隐藏层可以有很多个。第一个隐藏层 ,x向量作为输入,由于有三个神经元,因此他的输出是个三维向量的激活向量。第二个隐藏层,以第一个隐藏的输出作为输入,由于有两个神经元,因此它的输出是二维的激活向量。第二个隐藏层的输出作为输出层的输入,最后输出结果。

综上所述,我们构建自己的神经网络时 ,只需考虑的问题是:1、构建几个隐藏层?2、每个隐藏层设计多少个神经元?。

1.2 图像感知示例

做图像识别时,将一张照片的像素点以向量的形式作为输入。神经网络中,隐藏层的功能我们是不知道的,但是将每个隐藏的神经元的输出可视化出来,可能会大致了解神经元做了什么。例如将第一个隐藏层可视化,我们会发现,他的每个神经元试图寻找图片中不同方向的横竖线。第二个隐藏层,每个神经元在寻找脸部特征,例如第一个神经元在寻找左眼睛。第三个隐藏层,每个神经元将面部不同的部分聚合,尝试检测是否存在更大、更粗糙的面部形状。最后,检测面部与不同面部形状的对应程度可以创建一组丰富的特征,然后帮助输出层尝试确定人物图片的身份。

不同隐藏层,他关注的像素矩阵大小不同,越往后越大。上述隐藏层的功能,全是由神经网络自行实现的,不是我们规定第一个隐藏层检测横竖线,第二个检测鼻子眼睛,第三个聚合成更大的面部轮廓。所以神经网络是强大的。

1.3 更复杂的神经网络

按照惯例,当我们说这个神经网络有四层时,它包括输出层和所有的隐藏层,但一般不包括输入层。

上图中,将第三个隐藏层放大,他的输入是第二个隐藏层的输出\overrightarrow{a}^{[2]}。隐藏层中,每个神经元都有属于他自己的模型参数。a向量称为激活值,g()函数称为激活函数(输入前一层的激活值,生成新的激活值),目前我们使用的激活函数是sigmoid函数,实际上激活函数还可以是其他的函数,后面会做相应的介绍。

二、神经网络前向传播

2.1 手写数字识别示例

功能,输入8*8像素矩阵的图片,模块自动预测手写数字是0/1(手写数字有10种,为了简化成二分类问题,我们只预测数字0或者1)。

如上图所示,我们设计的三层神经网络,第一隐藏层25个神经元,第二隐藏层15个神经元,输出层一个神经元。这里的\overrightarrow{x}是输入向量,也可以称之为\overrightarrow{a}^{[0]}。 \overrightarrow{a}^{[1]}是25维向量,第一隐藏层展开的效果图如上图所示。

接下来是计算第二隐藏层:

最后计算预测结果:

先根据\overrightarrow{x}计算\overrightarrow{a}^{[1]},再计算\overrightarrow{a}^{[2]},最后计算\overrightarrow{a}^{[3]}(f(x)),根据f(x)的大小做出二分类的判断,概率大于等于0.5预测1,否侧预测0,整体是从左向右计算的。这也被称为“前向传播”。

2.2 如何用代码实现

Tensorflow和pytorch是机器学习相关的有效工具库。接下来使用Tensorflow进行代码的编写演示:

第一隐藏层,首先定义输入特征向量x,再定义第一隐藏层(形参1:神经元数量   形参2:激活函数),最后计算激活值a1。

第二隐藏层,首先定义layer_2(形参1:神经元数量   形参2:激活函数),最后计算激活值a2。

a2是分类的概率,设定阀值为0.5,如果概率大于等于0.5,预测值为1,否为为0。

2.2.1 单个网络层上的前向传播

首先计算\overrightarrow{a}^{[1]},他是由a_{1}^{[1]}a_{2}^{[1]}a_{3}^{[1]}三个激活值组成的向量,激活值的计算方法如下图所示。

最后计算\overrightarrow{a}^{[2]}

2.2.2 前向传播的一般实现

在上一节中,每一个神经元激活值的计算都是相同的操作,我们可以对此进行简化,封装在dense函数中。输入:上一层的激活值、这一层的w矩阵、b矩阵、激活函数。返回值:激活向量。

2.2.3 前向传播的矢量化实现

在上一节中,dense函数中使用for循环来实现,这会降低计算效率。矢量化的实现方式,会大幅度提高计算速度,下面是矢量化的实现步骤(左边代码是上一节版本,右边代码是对应地矢量化实现代码):

2.2.4 Tensorflow实现

第一步指定模型,告诉TensorFlow如何计算推理。在第二步,需要使用TensorFlow进行编译,关键步骤是要指定使用的损失函数。第三步使用fit函数,它告诉TensorFlow使用在步骤2中指定的成本函数的损失来拟合你在步骤 1中指定的模型和数据集 X,Y。

2.3 Sigmoid激活函数的替代方案

在上图中,第一个隐藏层中的第二个神经元,通过价格、购物成本、市场、材料来预测消费者的认识程度。最初我们使用Sigmoid激活函数,将消费者的认识程度分为两类:认可1、不认可0。但是实际情况,消费者的认识程度可以更加细分为:不认可、稍微认可、认可、非常认可等类别,相对应的可以将激活值设计成从0到正无穷的正数。

上图中,是三种常见的激活函数,左边是线性激活函数(由于g(z)=z,有些时候会被认为没有使用激活函数)、中间是Sigmoid激活函数、右边是ReLU激活函数。

2.3.1 如何选择激活函数

如何为神经网络中的每一个神经元选择合适的激活函数?

  • 二分类问题,选择Sigmoid激活函数
  • 如果标签值y可正可负,选择线性激活函数
  • 如果标签值y取0到正无穷,选择ReLU激活函数

2.3.2 激活函数的意义

如上图所示,我们设计一个具有一个隐藏层、一个输出层的神经网络。假设每一个神经元都使用线性激活函数(等价于不使用激活函数),前向传播过程如右边所示。最终计算结果\vec{a}^{[2]}=wx+b,完全等同于直接使用线性回归,所以说设计的两层神经网络基本没有意义。

对上图的神经网络中,三个隐藏层 使用线性激活函数,输出层使用逻辑回归,最终结果等价于直接使用逻辑回归。输出结果如下图所示:

综上所述:尽量不要在隐藏层使用线性激活函数。 

三、多分类问题

3.1 softmax回归模型 

假设n分类,也就是说y的取值有1,2,3,...,n,激活值如下图所示:

注意,当n=2时,此时又变成了逻辑回归。也就是说softmax回归模型就是逻辑回归模型的推广。

逻辑回归的损失函数如下,其中当y=1时,loss=-loga_{1};当y=0时,loss=-loga_{2}

相对应的softmax回归的损失函数如下:

3.1.1 softmax输出

前面课程中,我们对手写数字只预测0/1,是二分类问题。现在我们预测所有可能的数字0-9,设计的神经网络输出层原本只有一个神经元,现在要变成10个神经元,如下图所示。这样的输出层也被称为softmax输出。

输入还是和原来的一样,是个手写数字图片\vec{x},经过第一个隐藏层得到激活向量\vec{a}^{[1]}。将\vec{a}^{[1]}当作输入,经过第二个隐藏层得到激活向量\vec{a}^{[2]}。将\vec{a}^{[2]}当作输入,经过softmax层,得到每个数字的概率\vec{a}^{[3]}。计算过程如下图所示。

softmax层也被称为softmax激活函数。代码实现如下。注意,以下代码不是最优的,后面的课程中会给出更好的解决方案。

3.1.2 改进实现

x1=2/10000,x2=(1+1/10000)-(1-1/10000),理论上x1=x2,但是计算机计算的时候,他的存储空间是有限的,实际输出如下图所示:

x2更加精确。上一节的代码中softmax代价函数是正确的,但是有一种方式可以减少这些数值舍入误差,从而在TensorFlow中实现更准确的计算。

首先以逻辑回归为示例,我们首先计算激活值a,再计算损失函数loss,代码如下图所示。注意,逻辑回归中数值舍入的误差较小,可以忽略不计,但是softmax回归中,这类误差较大。

我们还可以换一种实现方式,不计算中间值a,直接使用拟合值z计算loss,实现方式如下图所示(输出层使用线性激活函数,这样的话就相当于没有计算中间值a,而是直接使用拟合值z;损失函数增加一个参数)。相比较上一个实现方法,TensorFlow可以重新排列这个表达式中的项,并提出一种在数值上更准确的实现方法来计算这个损失函数。

同理softmax回归也可以进行改进:

3.2 多标签分类

注意区分多类分类、多标签分类:

多标签分类:给一张图片,输出图片中是否有人、是否有车两个二分类的多标签分类。

多类分类:

四、高级优化算法

4.1 Adam算法

我们使用梯度下降算法的时候,学习率\alpha是个定值,他可能会出现两种极端情况。下图左,\alpha偏小,从起始点start开始,逐渐迭代,迭代次数多才能到达最小点。下图右,\alpha偏大,导致每次迭代的震荡大。

而Adam算法可以解决这个问题,他可以根据运算情况,适度调节\alpha的大小。如上图左,若每次迭代的方向大致相同,就应该增大\alpha;如上图右,若每次迭代,参数来回震荡,就应该减小\alpha

模型与之前相同,编译模型的方式与之前一样,不同的是向编译函数添加一个额外的参数,即指定要使用的优化器tf.keras.optimizers.Adam。Adam优化算法需要一些默认的初始学习率 Alpha,上图例子中,将初始学习率设置为0.003。

4.2 卷积层

到目前为止,我们使用的所有神经网络层都是密集层类型,其中该层中的每个神经元都从前一层获得所有激活的输入。

上图中,每个神经元的输入不是前一层的所有激活值,而是专属于他的部分激活值。这样的网络层称之为卷积层。卷积层的优点:1、更快的计算速度。2、需要更少的数据,过度拟合的概率减少。
如果神经网络中有多个卷积层,会被称为卷积神经网络。

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

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

相关文章

【LeetCode刷题-二分查找】--162.寻找峰值

162.寻找峰值 方法一:寻找最大值 题目保证了nums[i]≠nums[i1],所以数组nums中最大值两侧的元素一定严格小于最大值本身,因此最大值所在的位置就是一个可行的峰值位置 class Solution {public int findPeakElement(int[] nums) {int idx 0…

分类网络搭建示例

搭建CNN网络 本章我们来学习一下如何搭建网络,初始化方法,模型的保存,预训练模型的加载方法。本专栏需要搭建的是对分类性能的测试,所以这里我们只以VGG为例。 请注意,这里定义的只是一个简陋的版本,后续一…

什么是数据库事务、事务的ACID、怎么设置/禁止自动提交?

数据库事务及ACID 数据库事务是指作为单个逻辑工作单元执行的一组操作。这组操作要么全部成功地执行,要么全部不执行,不允许出现部分执行的情况。数据库事务通常需要满足ACID属性,即原子性(Atomicity)、一致性&#x…

第2关:还原键盘输入(list)

题目&#xff1a; 知识点&#xff1a; 列表list相较于数组&#xff1a; 优势&#xff1a;可在任意指定位置插入或者删除元素而不影响列表其他地方 。 劣势&#xff1a;无法直接进行下标索引&#xff0c;需要迭代器it逐个遍历。 代码&#xff1a; #include <iostream>…

企业级信息化系统 ERP、OA、CRM、EAM、WMS、MES、PM

微服务架构&#xff0c;前端采用微应用架构&#xff0c;可做到不同服务使用不同数据库独立运行。全平台采用基于模型驱动的设计模式&#xff0c;并在前后端留有大量的代码植入入口&#xff0c;方便开发者对平台进行改造扩充。企业信息中心开发ERP、OA、CRM、EAM、WMS、MES、PM等…

R系组播调优方案

修改/etc/sysctl.conf添加如下内容&#xff1a; Vim /etc/sysctl.con net.ipv4.ip_forward1 net.ipv4.ip_nonlocal_bind1 net.ipv4.conf.all.rp_filter0 net.ipv4.conf.default.rp_filter0 net.bridge.bridge-nf-call-arptables 0 net.bridge.bridge-nf-call-ip6tables 0 …

【踩坑】Putty报错: Can’t agree a key change algorithm

原因可能是putty版本太老了&#xff0c;更新putty就好了 下载地址&#xff1a;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 根据需要选择自己想要下载的版本&#xff0c;我是下载的如下图所示的版本。 另外&#xff0c;了解了一下Putty是用来远程连接…

用excel计算一个矩阵的逆矩阵

假设我们的原矩阵是一个3*3的矩阵&#xff1a; 125346789 我们现在要求该矩阵的逆矩阵&#xff1a; 鼠标点到其它空白的地方&#xff0c;用来存放计算结果&#xff1a; 插入-》函数&#xff1a; 选择MINVERSE函数&#xff0c;这个就是求逆矩阵的函数&#xff1a; 点击“继续…

怎么改变容易紧张的性格?

容易紧张的性格是比较通俗的说法&#xff0c;在艾森克人格测试中&#xff0c;容易紧张的性格就属于神经症人格&#xff0c;神经质不是神-经-病&#xff0c;而是一种人格特征&#xff0c;这种特征包括&#xff1a;敏感&#xff0c;情绪不稳定&#xff0c;易焦虑和紧张。有兴趣的…

中国电子学会2023年09月份青少年软件编程Python等级考试试卷六级真题(含答案)

2023-09 Python六级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 以下选项中&#xff0c;不是tkinter变量类型的是&#xff1f;&#xff08;D &#xff09;(2分) A.IntVar() B.StringVar() C.Do…

Redis缓存穿透、击穿和雪崩

文章目录 前言一、缓存穿透&#xff08;查不到&#xff09;1.概念2.解决方案布隆过滤器缓存空对象 二、缓存击穿&#xff08;量太大&#xff0c;缓存过期&#xff01;&#xff09;1.概述2.解决方案1.设置热点数据永不过期2.加互斥锁 三、缓存雪崩1.概念2.解决方案1.redis高可用…

Xilinx DDR3 MIG系列——ddr3控制器的时钟架构

本节目录 一、ddr3控制器的时钟架构 1、PLL输入时钟——系统时钟system_clk 2、PLL输出时钟——sync_pulse、mem_refclk、freq_refclk、MMCM1的输入时钟 3、MMCM1的输入时钟和输出时钟 4、MMCM2的输入时钟和输出时钟一、ddr3控制器的时钟架构 对于FPGA开发来说,调用IP或者移植…

PHP开源自动化平台CRUD代码生成器

生成CRUD&#xff08;创建、读取、更新、删除&#xff09;代码的实现方式有很多种&#xff0c; 一、实现方式 1. 定义数据模型&#xff1a;首先需要定义数据模型&#xff0c;包括表结构、字段以及数据类型等。 2. 自动生成数据库表&#xff1a;根据数据模型&#xff0c;使用数…

利用爬虫采集外卖数据进行竞争对手分析

目录 一、引言 二、准备工作 三、爬取数据 四、数据处理与存储 五、竞争对手分析 六、结论与展望 一、引言 在当今的数字化时代&#xff0c;数据已经成为企业成功的关键因素之一。对于餐饮外卖行业来说&#xff0c;数据的收集和分析尤为重要。通过对竞争对手的数据进行采…

【LeetCode刷题笔记】滑动窗口

992. K 个不同整数的子数组 解题思路: 滑动窗口 , 题目问题转化为: 求 「最多存在 K 个不同整数的子数组的个数」 与 「最多存在 K - 1 个不同整数的子数组的个数」 之差, 就是题目所求的 「恰好存在 K 个不同整数的子数组的个数」 , 最终问题就变成求解滑动窗口内,以 R …

webpack工作原理

目录 合并代码模块化webpack 的打包webpack 的结构webpack 的源码addEntry 和 _addModuleChainbuildModuleCompilation 的钩子产出构建结果 了解 webpack 实现原理&#xff0c;掌握 webpack 基础的工作流程&#xff0c;在平时使用 webpack 遇见问题时&#xff0c;能够帮助我们洞…

2015年计网408

第33题 通过 POP3 协议接收邮件时, 使用的传输层服务类型是( ) A. 无连接不可靠的数据传输服务 B. 无连接可靠的数据传输服务 C. 有连接不可靠的数据传输服务 D. 有连接可靠的数据传输服务 本题考察邮件接收协议POP3使用的运输层服务类型。 如图所示。接收方用户代理使用pop…

Typora-PicGo-七牛云图床

Typora-PicGo-七牛云图床 问题描述&#xff1a; 每次使用Typora写完笔记后&#xff0c;想要将笔记上传至CSDN会发现一个问题&#xff0c;由于没有配置图床&#xff0c;笔记中的图片需要一张一张的上传到CSDN&#xff0c;非常麻烦&#xff0c;若使用PicGo并搭配七牛云的10G免费…

Spring Security使用总结五,加密用户密码,不再使用明文保存密码

上一章我们成功的注册了一个新用户&#xff0c;按照正常逻辑来说&#xff0c;这一章应该是登录了&#xff0c;但是我们也看到了&#xff0c;这数据库保存的居然是明文密码&#xff0c;这谁受得了&#xff0c;这要是用户信息泄露了&#xff0c;这不让人一锅端了啊&#xff0c;还…

Java编程--单例模式(饿汉模式/懒汉模式)/阻塞队列

前言 逆水行舟&#xff0c;不进则退&#xff01;&#xff01;&#xff01; 目录 单例模式 饿汉模式&#xff1a; 懒汉模式&#xff1a; 什么是阻塞队列 什么是高内聚 低耦合 阻塞队列的实现 单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见…