10 从0开始学PyTorch | 多层神经网络、激活函数、学习能力

news2024/11/24 19:50:59

前面的训练过程我们已经了解的差不多了,但是我们所用到的模型还是一个线性模型,这一小节就让我们正经开始神经网络的搭建,研究怎么把之前的线性模型替换成神经网络来解决我们的问题。

为了更好的理解神经网络,这里我们把假设的关系改成一个二次函数,接下来的事情就是研究怎么用神经网络来找到其中的参数,模拟这个二次函数。

image.png

人工神经网络

要学习写代码,我们先来学一些概念知识。看看神经网络模型和我们前面用的线性模型有什么区别。大家估计都已经知道了,神经网络这个词大概是受到了大脑神经系统的启发,所以被称作人工神经网络。对神经系统的生物学意义感兴趣的朋友可以在网上找一个神经系统公开课学一下。

神经网络是现在深度学习的核心,神经网络就是一种能够通过简单函数的组合来表示复杂函数的数学实体。

通过上面的描述我们可以大概知道,神经网络中的每一个神经元都是一个简单函数,那么它是怎么去组合的呢?我们来看一下书中的原图。一个神经元内部的构造如下,中间是一个线性变换,就像我们之前的代码中模拟的wx+b这种就属于一个线性变换,但是线性变换大家都看到了,是一条直线,因此这里在线性变换的外面加了一层非线性变换,这个称作激活函数,使得输出成了一个非线性的结果。

image.png

横线下面的部分给出了一些真实的例子,假设我们已经习得w和b这两个参数值(考虑我们之前学的模型学习方案),这时候把样本放进去,在线性变换上得到的结果再经过激活函数,得到了一个新的结果,如我们在这个实例中使用的是tanh激活函数,可以看到,在x为负无穷的时候输出趋近于-1,在x为正无穷的时候输出趋近于1。而在(-1,1)区间的时候结果近似于wx+b的线性结果。

多层神经网络

看完上一个小例子,我们先不纠结里面概念的细节,一个个来解决。让我们不妨先深入看一下,什么是多层神经网络。看过图你大概就明白了,一个多层神经网络也是由我们前面提到的神经元构成。在同一层中,多个神经元是并列关系,而在层与层之间,上一层的输出是下一层的输入,以此为基础将层与层串联起来,在这里说一句,通过很多的试验效果表明,深而窄的网络效果要比浅而宽的效果更好,所以在现今的深度学习中,往往会堆砌很深的层。

image.png

关于这个图需要注意的一点是,这个图上把线性单元和激活函数分开画了两个小圆点,在很多现在流行的深度网络表示图形上,可能不会像这样分开画,如果刚开始看可能会有点困惑。

损失函数

有人说误差函数和损失函数是两个东西,不过大部分认为误差函数就是我们之前说的损失函数,有时候也叫代价函数。虽然理念上多多少少有点区别,但实际在计算中,我们知道损失计算就可以了。

这里为什么要单独把损失函数拿出来说呢,是因为我们前面在线性模型上计算损失的时候,所获得的误差曲线是凸的,我们很容易找到那个最小值,并通过我们的计算方法计算出那个最小值。但是在神经网络上的损失函数的曲线是非凸的,我们没办法通过一个确定的手段去获取到最小值。

激活函数

关于激活函数,我们上面已经介绍了一部分。上面我们知道了,激活函数的作用是把线性模型变成一个非线性模型,从而让神经元的各种组合可以去模拟任意形状的函数。同时,激活函数还有一个作用就是在网络的最后一层去限制输出结果的范围。

image.png

回想我们最开始手工搞得resnet分类模型,假设我们现在有一个识别狗的模型,我们给模型看一个卡车的图片,给的结果可能就是-1000,给一个狗熊的图片结果可能是-1,给一个狗的图片结果可能是100,通过激活函数的运算之后,卡车的结果可能就是-1,狗熊的结果是0.1,狗的结果是0.9,这样我们就可以很容易的设置一些范围来决定哪些可以认为是狗的图片,而不用担心有某些超出范围的事情发生。

各种激活函数

除了tanh,这里列出了几个常用的激活函数,比如sigmoid,ReLU,每一个激活函数都有不同的作用,但是目标都是为了组合出各种不同的复杂函数。

image.png

当然除了这里列的以外,还有很多其他的激活函数,这可能得需要花时间单独写一篇,或者再去网上学习一下关于各种激活函数的知识。
如果你想自己设计一个激活函数也是可以的,让我们看看激活函数有什么特性。

  • 激活函数是非线性的。这是重要特性之一,非线性使得整个神经网络可以逼近任何复杂函数模型。
  • 激活函数是可微的。我们要计算梯度,因此需要可微。
  • 至少有一个敏感区间。就像我们看到的tanh一样,在(-1,1)区间是敏感的,而在其他区间是不敏感的,输入的增大或减小对输出结果影响不大。
强大学习能力

让我们看一下,有了激活函数之后,为什么具备强大学习能力。如下图所示,总共有9个图像。其中左上角的ABCD是原始图形,也可以认为是一个神经元,由一个线性变换+一个激活函数构成。而我们对这些神经元进行简单叠加,比如第一行最后一个使用A+B就构建出一个有波峰和波谷的图形,对于C+D,构建出了一个有大波峰的图形。在第一列最后一行,是在进行了A+B之后再进行C变换,形成了一个波峰更小,而波谷更大的图形。在最后一张图上,进行了C(A+B)+D(A+B)的变换,形成了一个有两个波谷的图形。

image.png

从最基本的图形变换到最后这个,我们只用了4个神经元。按我的理解,A、B可以看做是同一层的两个神经元,C、D可以看做是同一层的神经元,然后C、D把A、B的输出作为输入再次进行变换,就得到了最后那个神奇的图形。

到了这里就可以看到神经网络的强大学习能力,我们并不知道我们的数据所对应的模型函数是什么样的,也不需要预先去定义它,而是给出一堆最基本的线性变换和激活函数,经过我们前几节那样的迭代,找到一些权重,最后就能过模拟出一个很复杂的模型结果,是不是很神奇。

今天这篇没有写代码,纯粹是概念性叙述,下一节我们研究怎么用PyTorch构建一个神经网络来模拟我们的温度变换。

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

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

相关文章

【新版系统架构】第八章-系统质量属性与架构评估

软考-系统架构设计师知识点提炼-系统架构设计师教程(第2版) 第一章-绪论第二章-计算机系统基础知识(一)第二章-计算机系统基础知识(二)第三章-信息系统基础知识第四章-信息安全技术基础知识第五章-软件工程…

(六)python实战——使用Redis库完成redis基本数据类型数据的操作案例

前言 本节内容主要介绍一下在python环境下,使用Redis库实现redis基本数据类型String、List、Set、Zset、Hash等数据的操作,通过案例的演示,学习python环境下,redis缓存数据库的基本使用和操作。 正文 ①使用pip命令安装Redis依…

Redis10大性能优化点(上)

1.Redis真的变慢了吗? 对 Redis 进行基准性能测试 例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就…

计算机基础--->数据结构(6)【AVL树(平衡二叉树)】

文章目录 AVL(平衡二叉树)树性质AVL树的操作(Java)节点的创建AVL树的插入1.判断平衡2.保持树的平衡3.判断是否AVL树4.删除节点 全部代码 AVL(平衡二叉树)树 平衡二叉树是一种特殊的二叉搜索树,他…

不再担心代码丢失!掌握同步代码到两个git仓库的绝妙方法!

最近,我手里的项目由于某些原因,需要从一个代码仓库把所有的代码复制到另一个代码仓库中,并且以后再同步代码的时候,需要同时把本地的代码同步到两个代码仓库。为了满足这一需求,我将为大家介绍两种方案。方案一可以实…

飞行动力学 - 第4节-part1-螺旋桨式飞机的最大最小速度 之 基础点摘要

飞行动力学 - 第4节-part1-螺旋桨式飞机的最大最小速度 之 基础点摘要 1. 最小功率和最大/最小速度概念2. 最小功率2.1 手工推导2.2 PPT推导 3. 最大速度和最小速度函数关系4. 参考资料 1. 最小功率和最大/最小速度概念 最小功率:类似抛物线底部斜率为零的位置最大…

Qt-事件(下)(事件过滤、自定义事件)

文章目录 事件过滤自定义事件 事件过滤 event()函数是一个protected的函数,这意味着我们要想重写event(),必须继承一个已有的组件类,——重写其event()函数。event()函数的确有一定的控制,不过有时候我的需求更严格一些&#xff…

使用Python+Autogluon对“员工自评”进行机器学习建模分析

建模核心代码 #员工自评AutoML from autogluon.tabular import TabularDataset, TabularPredictor import warnings warnings.filterwarnings(ignore) train_data TabularDataset(train_df2)# 预测标签 label 员工自评# 模型保存文件名 save_path ../data/AUO-train/model/…

一种快速拓扑聚类算法

使用场景,节点编号不重叠,可以缺损,确定每个节点的相互关系和最大的节点编号,对节点进行聚类。如下图所示,分三个簇,计算每个簇包含的元素。 插入代码,暂时没有继续优化的空间 // TopologicalC…

嵌入式软件开发面试题(一)

目录 1.用预处理指令表示一年有多少秒 2.写出float x 与“零值”比较的if语句 3.为什么说if(0x)比if(x0)好? 4.将地0x8000中存放的整形变量,清除bit1。 5.linux下用shell命令在当前目录下创建myfolder目录,并将此目录的权限设为拥有者可读写群组和…

携手共赢!润建股份与科士达达成战略合作

7月4日(今日),润建股份有限公司(以下简称”润建股份“)与深圳科士达科技股份有限公司,在科士达光明工业园正式签署战略合作框架协议,双方将发挥各自领域的技术优势,在新能源与数字科…

Android开发之屏幕尺寸的兼容

屏幕尺寸和密度 本部分提供了具有特定屏幕配置(由屏幕尺寸和密度定义)的设备的相对数量数据。为了简化针对不同屏幕配置设计界面的过程,Android 将实际屏幕尺寸和密度的范围划分为多个区间(如下表所示)。 ldpi mdpitv…

MySQL之数据库引擎详解(内附面试题:InnoDB和MyISAM的联系与区别)

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于MySQL数据库引擎的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一. 数据库引擎是什么&#xff…

【kubernetes系列】Kubernetes之生命周期和重启策略

概述 Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少 其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以 失败状态结束而进入 Succeeded 或者 Failed 阶段。 在 Pod 运行期间,k…

(30)精准降落和悬停(IRLock)

文章目录 30.1 概述 30.2 哪里可以买到 30.3 连接到自动驾驶仪 30.4 安装到框架上 30.5 通过任务规划器进行设置 30.6 飞行和测试 30.1 概述 Copter 支持使用 IR-LOCK 传感器(IR-LOCK sensor)和声纳或激光雷达(sonar or lidar)进行精确着陆。使用该系统,当飞行…

畅谈RocketMQ重复消费7个根源问题

在众多关于MQ的面试八股文中有这么一道题,“如何保证MQ消息消费的幂等性”。 为什么需要保证幂等性呢?是因为消息会重复消费。 为什么消息会重复消费? 明明已经消费了,为什么消息会被再次被消费呢? 不同的MQ产生的…

0基础学习VR全景平台篇 第56篇:专业版功能-故事线

功能位置示意 一、本功能将用在哪里? 故事线功能,支持将多个VR视频片段,自由设置剧情,在故事中设置多个路线结局,实现VR视频创作新玩法。 区别传统VR视频单项输出内容,促使用户主动思考,参与剧…

windows、linux部署seata1.3.0

前提:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明Spring Cloud AlibabaSpring CloudSpring BootNacosSeata2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE2.0.31.3.0背景:seata配合nacos使用,并开启nacos,nacos使用默认的namespace,mysql5.7 s…

在Jetpack Compose中使用SurfaceView

在 Android 开发中,SurfaceView 是一种特殊的视图,它拥有自己的专用绘图表面,可以在后台线程中更新,非常适合需要频繁和快速绘制的地方,如游戏和视频播放。然而,在Jetpack Compose(Google的新的…

dxf文件怎么转成dwg格式?分享几种简单的转换方法

将DXF文件转成DWG格式可以提高CAD文件的兼容性和功能性,使其更易于在不同的CAD软件之间传输和共享。如果我们需要与其他人共享CAD图纸,或者想要更好地利用CAD编辑软件的各种功能和工具,将文件转换为DWG格式会更好一些,那么怎么进行…