ToB企服应用市场:ToB评测及商务社交产业平台

标题: Machine Learning Specialization 学习笔记(3) [打印本页]

作者: 老婆出轨    时间: 2024-9-21 07:17
标题: Machine Learning Specialization 学习笔记(3)

媒介

博客仅记录个人学习进度和一些查缺补漏。
学习内容:BV1Bq421A74G

一、神经网络

神经网络(Artificial Neural Networks,ANNs)是受人脑布局启发而构建的计算模型,用于模仿大脑神经元网络处置处罚信息的方式。它们是机器学习和深度学习范畴的核心技术之一,能够解决多种复杂的模式识别和猜测问题。
根本概念



根本组成

神经网络由以下根本组件构成:
工作流程

训练过程

训练神经网络通常涉及以下步骤:
类型


应用举例



g->激活函数

基于TensorFlow的简单dense层

差别层次特征的学习

第一层:低级特征
边缘和纹理:第一层的卷积核(filters)通常检测图像的根本边缘、线条和简单的纹理。这些特征包括水平、垂直和对角线方向的边缘。
局部感受野:第一层的卷积核通常应用于图像的小局部区域(称为感受野),这使得它们只能提取局部的一些基础特征。
中央层:中级特征
模式和形状:中央层的神经元结合了前几层检测到的低级特征,形成更复杂的模式和形状,如角元素、曲线、简单几何图形。
增大的感受野:随着层数增长,每层的神经元感受的图像区域会变大,即“感受野”会变大。如许它们可以综合前面层次的信息,识别更加复杂的模式。
高级层:高级特征
物体组件和语义特征:在更深的层中,神经网络开始组合之前学习到的复杂模式,识别出详细物体的部分或更抽象的语义特征。例如,一些神经元大概对人脸的某些组件(如眼睛、鼻子)特别敏感。
全图感知:最深的层一般具有最大的感受野,能够感知到整个输入图像的信息,因而能识别出完整的物体或者整个场景。
为什么从基础特征到复杂特征渐渐推进

在多层神经网络中,尤其是卷积神经网络(CNN),特征提取每每是从基础特征到复杂特征渐渐推进。这是因为:
什么是感受野

感受野(Receptive Field)是一个神经元在输入图像上“看到”或相应的区域。更简单地说,它指的是输出层的一个特定神经元对应于输入图像的哪些位置。
更简单的表明

详细示例

假设你有一个三层卷积神经网络,每一层都有一个3x3的卷积核:

通过层叠更多层次,每个神经元能够渐渐"感知"到输入图像中更大的区域,最终高层的神经元可以拥有整个图像的全局视角,这使得它们能够识别整体的复杂特征和物体。
总结

从基础特征到复杂特征的逐层推进源自网络各层对信息渐渐复杂和综合的处置处罚方式。感受野是帮助理解这一过程的一个关键概念,它直观形貌了每个神经元在输入图像中负责的详细区域。从小感受野到大感受野,使得神经网络能够逐步从细节到整体进行信息处置处罚和特征提取。
二、TensorFlow实现简单神经网络

安装及环境设置

安装TensorFlow的前置:

  1. pip install tensorflow[and-cuda]
复制代码
在~/.bashrc文件末了添加以下内容:(以cuda-12.1为例)
  1. export PATH=/usr/local/cuda-12.1/bin${PATH:+:${PATH}}
  2. export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
复制代码
然后运行source ~/.bashrc来使环境变量见效。
nvcc --version 查看是否安装成功
运行时会出现很多warning,能识别GPU,代码能运行就行。
数据预处置处罚

尺度化

使用 tf.keras.layers.Normalization 进行尺度化处置处罚
尺度化(Standardization)是一种数据预处置处罚技术,它将数据的特征值转换为具有零均值(0)和单元方差(1)的分布。尺度化的公式如下:

其中:

就像之前做的正态分布的尺度化。
  1. print(f"Temperature Max, Min pre normalization: {np.max(X[:,0]):0.2f}, {np.min(X[:,0]):0.2f}")
  2. print(f"Duration    Max, Min pre normalization: {np.max(X[:,1]):0.2f}, {np.min(X[:,1]):0.2f}")
  3. norm_l = tf.keras.layers.Normalization(axis=-1)
  4. norm_l.adapt(X)  # learns mean, variance
  5. Xn = norm_l(X)
  6. print(f"Temperature Max, Min post normalization: {np.max(Xn[:,0]):0.2f}, {np.min(Xn[:,0]):0.2f}")
  7. print(f"Duration    Max, Min post normalization: {np.max(Xn[:,1]):0.2f}, {np.min(Xn[:,1]):0.2f}")
复制代码
在 TensorFlow 中,tf.keras.layers.Normalization 是一个层(Layer),它用于对输入数据进行尺度化处置处罚,使得每个样本的每个特征的均值为0,尺度差为1。这种尺度化通常在数据预处置处罚阶段使用,有助于进步模型的训练服从和性能。
这里的 norm_l 是一个 Normalization 层的实例,它被创建并设置了 axis 参数。axis=-1 表示尺度化将以最后一个轴进行,对这个轴位上的所有数据进行处置处罚,这通常是特征轴。这意味着层将对每个样本的特征进行独立的尺度化,而不是在整个批次或整个特征集上进行。
在机器学习和数据处置处罚中,数据通常以多维数组(例如,二维数组或矩阵)的情势存在。在这些数组中,每个维度(或轴)代表了数据的差别方面。在 TensorFlow 和 Keras 中,axis 参数用于指定在哪个维度上进行操纵。
在本例中:当你在使用 tf.keras.layers.Normalization 层时,axis=-1 的设置意味着尺度化操纵将在输入数据的最后一个维度上进行。在大多数环境下,对于输入数据:

Dense层

Dense的官方文档:https://tensorflow.google.cn/api_docs/python/tf/keras/layers/Dense
  1. tf.random.set_seed(1234)  # applied to achieve consistent results
  2. model = Sequential(
  3.     [
  4.         tf.keras.Input(shape=(2,)),
  5.         Dense(3, activation='sigmoid', name = 'layer1'),
  6.         Dense(1, activation='sigmoid', name = 'layer2')
  7.      ]
  8. )
复制代码
在TensorFlow中,tf.random.set_seed(seed) 函数用于设置随机数生成器的种子,以确保每次运行代码时都能获得同等的结果。这对于实行的可重复性非常重要,因为差别的随机种子大概会导致模型初始化权重的随机性,从而影响模型训练的结果。
界说了一个Sequential模型,它是一个线性堆叠的层序列。模型包含一个Input层和两个Dense层:


注意:W(原输入特征数量,该层w参数的数量)
更直观的:


Convolutional Layer


卷积神经网络

训练

  1. model.compile(
  2.     loss = tf.keras.losses.BinaryCrossentropy(),
  3.     optimizer = tf.keras.optimizers.Adam(learning_rate=0.01),
  4. )
  5. model.fit(
  6.     Xt,Yt,            
  7.     epochs=10,
  8. )
复制代码

DEBUG


三、激活函数

除了经常用于分类的SIGMOD函数,还有其他的激活函数可供使用


须要根据你的标签类型须要去01或是正负或好坏负,事实证明在隐藏层最常用的就是relu。
Q 为什么须要激活函数:
A 引入非线性
无论是多层感知机还是卷积神经网络,若没有激活函数,它们都只会做线性变更,层与层之间的叠加仍然是线性的。这时,无论多少层的神经网络,其输出都可以用一个线性变更来表示,无法捕捉复杂的数据模式和特征。引入非线性激活函数后,神经网络可以学习和表示更复杂的非线性关系,从而加强模型的表达本领。
激发多样性
差别的激活函数使各个神经元对输入信号的相应差别。如许,在网络的差别部分可以捕捉和表示数据的差别特征和模式,从而促进特征学习和分类。
梯度流传
常见的激活函数,例如ReLU、sigmoid和tanh,具有可微性质,允许通过反向流传算法计算和传递梯度。反向流传是神经网络训练的重要方法,只有激活函数使得梯度存在且易于计算,网络才能通过调解权重逐步迫近目标输出。
数值稳固性
得当的激活函数可以帮助缓解梯度消失或爆炸问题。例如,ReLU函数的引入极大地改善了深层神经网络的训练结果,因为它在正区间不饱和,能够有效传递梯度。
引入非线性激活函数使神经网络能够更好地学习复杂特征,重要原因有以下几个方面:
复杂函数迫近:
线性函数的组合仍然是线性函数,无法捕捉输入和输出之间的复杂非线性关系。而由于现实世界中的大多数问题(如图像、语音识别等)每每具有高度非线性和复杂性,单纯的线性变更无法有效地建模这些问题。激活函数如ReLU、sigmoid等引入了非线性,使得网络有本领迫近恣意复杂的非线性函数。这基于闻名的通用迫近定理,该定理指出,具有非线性激活函数的单隐层前馈神经网络在得当的条件下可以迫近恣意一连函数。
特征选取本领:
通过非线性激活函数,每一层的神经元在处置处罚输入数据时可以进行更加多样和丰富的特征变更。例如,ReLU激活函数可以强化正值输入、抑制负值输入,从而有助于提取关键特征,而sigmoid函数则可以将输入映射到0到1的范围,从而有助于概率分布的建模。这些非线性变更使得神经网络能够在多层次上提取和组合特征,从而捕捉更高阶的特征关系。
增长模型复杂度:
激活函数通过引入非线性,使得每一层网络输出的特征变更更加复杂和灵活。多层神经网络中,每一层都对前一层的输出进行加权求和并通过激活函数处置处罚。这些处置处罚步骤叠加起来,使得整体网络具备更强的表达本领,能够学习和表征更加复杂和过细的特征。
决定边界:
没有非线性激活函数,神经网络只能形成线性分类器,学习到的决定边界是线性的,无法分类线性不可分的数据。引入非线性激活函数后,神经网络可以学习到复杂的非线性决定边界,从而能够对复杂的、高维数据进行更有效的分类。
RELU


relu包管了激活后的函数值非负
ReLU(Rectified Linear Unit,修正线性单元)是深度学习中常用的一种激活函数。它的数学表达式非常简单:

这意味着当输入 ( x ) 为正数时,ReLU 函数输出 ( x );当输入 ( x ) 为负数时,ReLU 函数输出 0。这个函数的图形是一个斜率为 1 的直线,从 ( x = 0 ) 开始。
ReLU 激活函数的优点包括:
然而,ReLU 也有一些缺点,例如:
尽管如此,ReLU 及其变体(如 Leaky ReLU、Parametric ReLU(PReLU)、Exponential Linear Unit(ELU)等)在许多深度学习应用中仍然是首选的激活函数之一。在 TensorFlow 中,你可以很容易地在神经网络层中使用 ReLU 激活函数:
Softmax


Softmax 函数是一种在多类分类问题中常用的激活函数,特别是在神经网络的输出层。它的作用是将一个向量或一组实数转换为概率分布,使得每个元素的值都在0到1之间,并且所有元素的和为1。这使得Softmax函数非常适实用作分类使命的输出,因为它可以表明为属于某个种别的概率。
Softmax 函数的数学表达式界说如下:
设z 为一个实数向量,σ(z) 为 Softmax 函数,则对于向量z 中的每个元素z_i ,Softmax 函数界说为:

其中,分子是 z_i 的指数,分母是所有 z 中元素指数的总和。这个公式确保了输出值在0到1之间,并且所有输出值的和为1。
Softmax 函数的特点:
Softmax的优化

之前是做了一步中央厘革将z转换成了a然后再进行损失函数的计算,这就会导致在z->a这一步的softmax激活函数后,过大或者过小的数会损失精度,所以直接将这一层用线性函数激活然后在最终计算损失函数的时候,确认进行逻辑回归(true)。如许在底层TensorFlow就回自动安排计算顺序使得精度增长。

多分类问题


在机器学习和深度学习中,“Multiple Class”(多类)和"Multiple Label"(多标签)是两种差别的分类使命,它们在目标和处置处罚方式上有所区别:
四、高级优化方法


以前的单纯梯度下降,如果学习率太低就回导致进度缓慢,如果学习率太高就会导致震荡

Adam

Adam(Adaptive Moment Estimation)是一种广泛使用的深度学习优化算法,由Diederik P. Kingma和Jimmy Ba在2014年提出。它结合了动量法(Momentum)和RMSProp的头脑,通过计算梯度的一阶矩估计和二阶矩估计来调解每个参数的学习率,从而实现更高效的网络训练。Adam算法的关键组成部分之一是使用指数加权移动平均值来估算梯度的动量和第二力矩,即它使用状态变量来存储这些估计值,并对其进行偏差校正,以确保在训练初期时梯度估计不会偏向于0。
Adam算法的优点包括:
然而,Adam算法也存在一些缺点,如训练过程中大概会出现震荡征象,影响收敛速度,以及算法对于初始参数的选择较为敏感。
在现实应用中,Adam算法的参数设置包括学习率(alpha)、一阶矩估计的指数衰减率(beta1)、二阶矩估计的指数衰减率(beta2)和非常小的数(epsilon),以防止在实现中除以零。通常,这些超参数的默认值在很多环境下都体现良好,但某些问题大概须要仔细的超参数调解。
Adam算法在深度学习范畴内好坏常盛行的算法,因为它能很快地实现精良的结果。在原论文中,作者履历性地证明了Adam算法的收敛性符合理论性的分析,并在多个数据集上应用优化算法,证明了其高效性。
在PyTorch中,使用Adam优化器非常简单,起首须要导入torch.optim模块,然后选择Adam优化器。例如:
  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. # 定义一个简单的线性模型
  5. model = nn.Linear(10, 1)
  6. # 定义损失函数
  7. criterion = nn.MSELoss()
  8. # 定义Adam优化器
  9. optimizer = optim.Adam(model.parameters(), lr=0.001)
复制代码
总的来说,Adam算法是一种高效的优化算法,在深度学习范畴具有广泛的应用前景。随着计算资源和算法技术的不断发展,Adam算法在未来有望在更多范畴取得突破性成果。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4