借助keras的层知识理解理解神经网络层的构成相关概念

embedded/2024/10/23 23:41:34/

在这里插入图片描述

一、概述

机器学习中的神经网络也被称为人工神经网络(Artificial Neural Network, ANN),是一种受生物神经网络启发的数学模型,它试图模拟人脑中神经网络的工作方式来进行智能运算。

二、生物神经元神经元构成的神经网络

下图是生物神经元的示意图:
在这里插入图片描述
生物神经元由细胞体、树突、轴突、轴突末梢四部分构成。

下图是生物神经网络的一个简单示意图:
在这里插入图片描述

生物神经元通过电信号在彼此间传递信号,神经元的各个树突接收输入信号,经过细胞体汇总,如果最终总和高于某个阈值,神经元沿着轴突向末梢发送一个脉冲,这个脉冲信号传递给相邻的神经元树突,满足大于阈值的条件的信号经过一层层的神经元一直向后进行传播处理。这就是生物神经元构成的神经网络的基本工作机制。

生物神经元的这种信号经细胞体处理的过程非常类似线性函数,由n个输入信号,经过细胞体的简单线性加法处理,得到一个新的信号,不过在得到该新的信号后,如果信号值大于阈值,就会由各个末梢将信号传递出去,否则不会往下传递。单个的生物神经元的这种处理模式类似于一个线性函数和一个带预置判断决定输出的函数(该函数称为激活函数)的复合函数组成。

三、神经网络的概念

与生物神经网络类似,ANN人工神经网络也是由很多层组成的,每层网络的输出作为下层网络的输入,每层由多个神经元组成,因此ANN是由许多层组成的计算系统。在ANN中,神经元被简化为节点,下图为一个ANN神经网络的示意图:

在这里插入图片描述

3.1、神经元

神经网络每一层由多个神经元(Neurons)组成,神经元神经网络的基本计算单元,每个神经元可以看成一个复合函数的计算单元,这个复合函数先对输入数据进行线性加权和运算,运算的结果再通过特定的激活函数处理,处理结果作为该层的输出。

线性加权和可以用向量方式表示为: Y = W X + b Y=WX+b Y=WX+b,其中W为行向量,X、Y为列向量,b为标量,Y代表神经元的输出向量、X代表神经元的输入向量。

W代表线性运算中向量X各分量前的系数组成的向量,被称为神经元权重。权重的每个分量就是上图中的连接线表示,第n层的i节点到第n+1层的j节点的权重记为: w i j ( n ) w_{ij}^{(n)} wij(n)

b被称为截距或偏置或偏差,因此每个神经元可以看作是一个带有权重(Weights)和偏置(Biases)的节点,权重和偏置被称为神经元 的参数,所有层的参数就组成了整个神经网络的参数。

在实际应用中,神经元的线性加权和还有另一种表达方式,这种表达方式将向量X扩充一个分量(这个分量一般放在最后),这个分量的值恒定为1,同时将b作为权重W的扩充分量(也是放在最后),这样原有的Y=WX+b可以表示为 Y = ( W , b ) ( X T , 1 ) T Y=(W,b)(X^T,1)^T Y=(W,b)(XT,1)T的模式。

因此一个神经元计算体是由三部分组成的:

  • 权重(Weights):
    权重是连接神经元之间的重要性系数,它们决定了信号在神经元之间传递的强度。权重是通过学习过程不断调整的,以最小化网络的预测误差。

  • 偏置(Biases):
    偏置是加在神经元输入加权和上的一个常数,它决定了神经元激活的阈值。偏置使得模型更加灵活,允许神经元对不同的输入范围做出反应。

  • 激活函数(Activation Functions):
    激活函数是应用于神经元输出的非线性函数,它们为神经网络引入非线性能力,使得网络能够学习和执行更复杂的任务。
    常见的激活函数包括ReLU、Sigmoid、Tanh等。具体请参考老猿在CSDN博文《神经网络激活函数列表大全及keras中的激活函数定义 https://blog.csdn.net/LaoYuanPython/article/details/142731106 》及《神经网络高级激活函数大全及keras中的函数定义 https://blog.csdn.net/LaoYuanPython/article/details/142742719》的介绍。

3.2、神经网络

构成神经网络的层可以粗略地分为三类:输入层(Input Layer)、隐藏层(Hidden Layers)和输出层(Output Layer):

  • 输入层(Input Layer):
    输入层是神经网络的第一层,它接收原始数据输入,这一层不包含任何神经元,仅仅是数据的入口点。
    输入层的设计要与输入数据的特征数量相匹配。

  • 隐藏层(Hidden Layers):
    隐藏层是位于输入层和输出层之间的一层或多层,它们对输入数据进行处理,并提取特征。隐藏层的神经元可以学习到输入数据的复杂模式和表示。隐藏层的数量和每层的神经元数量是神经网络设计中的关键超参数。

  • 输出层(Output Layer):
    输出层是神经网络的最后一层,它产生最终的预测结果或决策。
    输出层的神经元数量取决于任务的类型(例如,二分类问题通常有一个神经元,而多类分类问题有多个神经元,每个类别对应一个)。

神经网络的层通过前向传播(Forward Propagation)和反向传播(Backpropagation)算法协同工作,以学习数据中的模式并进行预测。前向传播涉及数据通过网络的正向流动,而反向传播则涉及误差通过网络的反向流动,用于更新权重和偏置。

keras_70">四、keras中的层

Keras 层是 Keras 模型的主要构建块,是构建神经网络的基本单元。每个层包含一组参数(含权重和偏置),接收输入信息,做一些处理,如线性变换、卷积或激活函数,最后输出转换后的信息,上一层的输出将作为模型的输出或下层的输入。

Keras 的层需要输入的形状 (input_shape)来理解输入数据的结构,初始化器为每个输入设置对应参数,最后激活器(对应激活函数)来转换输出以使其非线性。在这两者之间,约束用于限制并指定要生成的输入数据的权重范围,而正则化器将通过在优化过程中动态应用参数的惩罚来尝试优化层(和模型)。

总而言之,Keras 层需要指定一些层的细节来创建一个完整的层,这些细节包括:

  • 输入数据的形状
  • 层中神经元/单元的数量
  • 初始化程序
  • 正则化器
  • 激活函数
  • 约束

注意:在Keras中,层的定义的参数是包括了偏置的,线性加权和使用的是 Y = ( W , b ) ( X T , 1 ) T Y=(W,b)(X^T,1)^T Y=(W,b)(XT,1)T的模式,因此初始化器是同时初始化权重和偏置。

4.1、输入数据

在机器学习中,所有类型的输入数据,如文本、图像或视频,都将首先转换为数字数组,然后输入算法。输入的数字可以是一维数组、二维数组(矩阵)或多维数组。使用整数元组shape指定维度信息,这就是input_shape。例如,(4,2)表示四行两列的矩阵。

创建模型的第一层(或模型的输入层)时,需要指定输入数据的shape。

4.2、模型的初始权重

模型的权重是模型的参数,模型初始构建时,权重参数的初始化对模型的确定影响比较大,keras中通过initializers模块定义了模型初始化的常见方法。该模块的导入语句和初始化方法定义语句为:

from keras import initializers 
my_init = initializers.initFunXXXXX() 

其中的initFunXXXXX泛指某个初始化方法,在实际使用时根据模型初始化方法使用不同的函数。

是一些常见的模型参数初始化方法及keras对应的具体函数请参考博文《Keras中initializers模块常见模型初始化方法详解:https://blog.csdn.net/LaoYuanPython/article/details/142140285》的详细介绍。

4.3、正则化器(regularizer)

正则化器,又称为正则化项(Regularization Term),是机器学习模型中用于控制模型复杂度的一个附加项。正则化项的作用是使模型“正常化”或“规范化”,避免模型变得过于复杂或异常。它被添加到损失函数中,以防止模型过拟合(即在训练数据上表现很好,但在未见过的数据上表现差)。正则化通过限制模型参数的大小,减少了模型对训练数据的拟合程度,这有助于防止模型学习到数据中的随机噪声,从而提高模型在新数据上的表现。

关于正则化的原来请参考老猿付费专栏博文《机器学习中结构风险最小化的正则化项用途及原理详解:https://blog.csdn.net/LaoYuanPython/article/details/141722434》的介绍。

常见的正则化:

  • L1 正则化(也称为 Lasso 正则化): ∥ w ∥ 1 ∥w∥_1 w1是 L1 范数,即权重的绝对值之和。
  • L2 正则化(也称为 Ridge 正则化): ∥ w ∥ 2 2 ∥w∥_2^2 w22是 L2 范数,即权重的平方和的平方根。
  • 弹性网(Elastic Net)正则化:结合了 L1 和 L2 正则化,形式为 a ∥ w ∥ 1 + b ∥ w ∥ 2 2 a∥w∥_1+b∥w∥_2^2 aw1+bw22,其中 α、b 是介于 0 到 1 之间的系数。

Keras中的正则化项允许在优化过程中对层的参数或层的激活情况进行惩罚, 网络优化的损失函数也包括这些惩罚项,惩罚是以层为对象进行的。

Keras中对层添加正则化项时,可以通过指定函数的三个关键字参数:kernel_regularizer、bias_regularizer、activity_regularizer来分别设定权重的正则化项、偏置的正则化项和激活函数的正则化项。

老猿注:对于线性变换:Y=KX+b 来说,K代表权重参数,b代表偏置,他们都可以是标量或向量。

Keras中的正则化函数包括

  • L1 正则化函数:keras.regularizers.l1(l=0.01),参数l为浮点数,表示 L1 正则化的强度,默认值通常是 0.01。这个参数决定了正则化项对损失函数的贡献程度,就是《机器学习中的模型、策略和算法:https://blog.csdn.net/LaoYuanPython/article/details/141265068》介绍的结构风险最小化中的系数λ
  • L2正则化函数:keras.regularizers.l2(l=0.01)
  • 弹性网(Elastic Net)正则化函数:keras.regularizers.l1_l2(l1=0.01, l2=0.01),具体计算方法为: l 1 ∗ ∥ w ∥ 1 + l 2 ∗ ∥ w ∥ 2 2 l1*∥w∥_1+l2*∥w∥_2^2 l1w1+l2w22
  • 自定义正则化函数:请参考下面的代码例子
from keras import backend as Kdef l1_reg(weight_matrix):return 0.01 * K.sum(K.abs(weight_matrix))model.add(Dense(64, input_dim=64,kernel_regularizer=l1_reg))

4.4、激活函数

在机器学习中,激活函数是神经网络中的一种函数,用于在神经网络的每个神经元中引入非线性。没有激活函数,神经网络就无法学习复杂的模式,因为线性变换的组合仍然是线性的。

神经网络的每层中,将该层所有输入乘以其相应的权重加上总体偏差(y=kx+b的b对应的是偏差,k对应的是权重)的总和,作为激活函数的输入,而激活函数的输出则作为该层的输出。

在Keras中,激活函数可以通过设置单独的 Activation 层实现,也可以在构造层对象时通过传递 activation 参数实现。

例如:

from keras.layers import Activation, Dense
... ...
model.add(Dense(64))
model.add(Activation('tanh'))

最后2行代码等价于:model.add(Dense(64, activation='tanh'))

常见的激活函数请参考老猿博文《[神经网络激活函数列表大全及keras中的激活函数定义:https://blog.csdn.net/LaoYuanPython/article/details/142731106](https://blog.csdn.net/LaoYuanPython/article/details/142731106)》的介绍。

4.5、高级激活函数

对于 Theano/TensorFlow/CNTK 不能表达的复杂激活函数,如含有可学习参数的激活函数,可通过高级激活函数实现,可以在 keras.layers.advanced_activations 模块中找到,这些高级激活函数包括 PReLU 和 LeakyReLU。具体可参考老猿博文《神经网络高级激活函数大全及keras中的函数定义 https://blog.csdn.net/LaoYuanPython/article/details/142742719》的介绍。

4.6、约束

在机器学习中,在优化阶段对权重参数设置约束。Keras中的Constraints 模块提供了不同的功能来设置层上的约束,约束是以层为对象进行的。具体的 API 因层类型而异,但 Dense,Conv1D,Conv2D 和 Conv3D 这些层具有统一的 API。

约束层使用 2 个关键字参数,其中kernel_constraint表示要在层中使用的约束,bias_constraint 表示用于偏置的约束。

一些常用约束函数如下:

  • non_neg:将权重限制为非负,语法:keras.constraints.NonNeg()
  • UnitNorm:将权重约束为具有单位范数,语法:keras.constraints.UnitNorm(axis=0),axis为 整数,需要计算权重范数的轴
  • MaxNorm:将权重限制为小于或等于给定值的范数,映射到每个隐藏单元的权值的约束,使其具有小于或等于期望值的范数。语法:keras.constraints.MaxNorm(max_value=2, axis=0),其中max_value:为输入权值的最大范数,axis为整数,需要计算权值范数的轴。
  • MinMaxNorm:将权重约束为指定的最小值和最大值之间的范数,映射到每个隐藏单元的权值的约束,使其范数在上下界之间。
    语法:keras.constraints.MinMaxNorm(min_value=0.0, max_value=1.0, rate=1.0, axis=0),
    其中rate为强制执行约束的比例,表示约束条件的强制程度。权重将被重新调整为 (1 - rate) * norm + rate * norm.clip(min_value, max_value)。 实际上,这意味着 rate = 1.0 代表严格执行约束,而 rate <1.0 意味着权重将在每一步重新调整缓慢移动到所需区间内的值。

老猿注:关于MinMaxNorm上面的解释是摘抄自官网,但不好理解,甚至可以说这个解释不正确。笔者花了较长的时间进行研究,终于明白了相关处理过程,其真正的处理逻辑及证明请见付费专栏文章《Keras中MinMaxNorm约束的具体计算逻辑和方法解密:https://blog.csdn.net/LaoYuanPython/article/details/142101079》。

更多关于约束的介绍请参考:https://keras-zh.readthedocs.io/constraints/

五、小结

人工神经网络与生物神经网络类似,由很多层组成的计算系统,每层由多个神经元组成,每层网络的输出作为下层网络的输入。每个神经元包含了参数、激活函数、输入、输出以及正则化器、约束等组成部分,每个神经元是相当于进行线性加权和运算后再进行激活处理的计算单元。

更多人工智能知识学习请关注专栏《零基础机器学习入门》后续的文章。

更多人工智能知识学习过程中可能遇到的疑难问题及解决办法请关注专栏《机器学习疑难问题集》后续的文章。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

PythonPython_212">老猿Python,跟老猿学Python

☞ ░ Python/article/details/98245036">前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython

http://www.ppmy.cn/embedded/129930.html

相关文章

Cadence元件A属性和B属性相互覆盖

最近在使用第三方插件集成到Cadence,协助导出BOM到平台上&#xff0c;方便对BOM进行管理和修改&#xff0c;结果因为属性A和属性B不相同&#xff0c;导致导出的BOM错误。如下图&#xff1a; ​​ 本来我们需要导出Q12&#xff0c;结果给我们导出了Q13&#xff0c;或者反之&…

docker 同宿主机不同网络容器通信+跨宿主机容器之间网络互连详解

一 同宿主机不同网络容器通信 方法一&#xff1a;使用 Docker 网络连接 创建一个自定义桥接网络&#xff1a; 创建一个新的自定义桥接网络&#xff0c;然后将需要通信的容器连接到这个网络。docker network create my_custom_network 将容器连接到自定义网络&#xff1a; 将…

上拉电阻和下拉电阻在电路中的作用(一)

上拉电阻和下拉电阻在电路中的作用&#xff08;一&#xff09; 1.什么是上下拉电阻2.上下拉电阻的作用&#xff1a;2.1.维持输入引脚处于稳定状态。2.2.配合三极管和MOS进行电平转换电路设计2.3.OC、OD电路&#xff08;Open Collector集电极开路、Open Drain漏电极开路&#xf…

开源的存储引擎--cantian

cantian 上次稼先社会活动之后&#xff0c;在北京签售的时候见到了三位参天的核心人物。我有感于他们的热情、务实和坦诚&#xff0c;我觉得还应该在深入的做一些事情。至少可以安装体验一下&#xff0c;做做推广。毕竟现在务实的产品不多了&#xff0c;很多都是浮躁的宣传。为…

vuex3入门

vue2 对应的 vuex、vue-router 都为3. 项目创建与框架安装 vue create hellovuex3 npm i vuex3 npm install npm run serve vuex使用 vue集成vuex&#xff0c;数据更新&展示 新建store/index.js import Vue from vue import Vuex from vuexVue.use(Vuex)const store n…

IT运维的365天--017 如何在两台Linux服务器之间快速批量传输文件夹(同时设置免密)

前情提要(两台Linux服务器之间传输批量文件夹): 两台都是外网服务器,都是Linux系统(CentOS),都安装了宝塔,用于搭建巨量的静态网站,由于A服务器准备不要了,所以要在A服务器转移几百个静态网站到B服务器。 Linux下scp单命令传输文件夹测试: 准备工作,先测试转移一…

Cursor零基础小白教程系列 - 开卷有益

最适合小白零基础的Cursor教程 网站lookai.top相同作者&#xff0c;最新文章会在网站更新&#xff0c;欢迎收藏书签 写在前面的话 Cursor在我看来 我认为当下AI时代&#xff0c;Cursor能够极大赋能每个普通人&#xff0c;帮助每个普通人实现自己的创意和想法。 例子&#xff…

Flink时间窗口程序骨架结构

前言 Flink 作业的基本骨架结构包含三部分&#xff1a;创建执行环境、定义数据处理逻辑、提交并执行Flink作业。 日常大部分 Flink 作业是基于时间窗口计算模型的&#xff0c;同样的&#xff0c;开发一个Flink时间窗口作业也有一套基本的骨架结构&#xff0c;了解这套结构有助…