新手小白的,Python人工智能的学习,pytorch的学习
TensorBoard是一个用于可视化和监控深度学习模型训练过程的工具。通过图形化的界面,开发者可以直观地看到模型的训练过程、数据的流动以及各种统计信息,从而更好地调试和优化模型。
1.问题:为什么模型跑了越来越多次模型mse,rmse,mae,smape反而升高?
当您在多次训练模型后发现MSE(均方误差)、RMSE(均方根误差)、MAE(平均绝对误差)以及SMAPE(对称平均绝对百分比误差)等指标反而升高时,这可能是由于以下几个原因造成的:
- 过拟合(Overfitting):
- 过拟合是模型在训练数据上表现很好,但在未见过的数据(如验证集或测试集)上表现不佳的现象。如果模型变得过于复杂,它可能会学习到训练数据中的噪声或异常值,导致在训练集上的误差很低,但在其他数据集上的误差很高。
- 解决方法:使用正则化技术(如L1/L2正则化、Dropout)、增加数据量、简化模型架构、使用早停法(early stopping)等。
- 欠拟合(Underfitting):
- 虽然这通常不会直接导致MSE、RMSE、MAE等指标在多次训练后升高,但如果模型一直无法很好地拟合训练数据(即训练集上的误差也很高),那么这可能是模型架构过于简单或学习能力不足。
- 解决方法:增加模型复杂度(如增加层数、神经元数量、使用更复杂的网络结构)、优化超参数(如学习率、批大小)、使用更适合任务的模型架构等。
- 数据问题:
- 训练集和测试集之间的分布差异可能导致模型在测试集上表现不佳。
- 训练数据可能存在噪声、异常值或标签错误。
- 解决方法:检查数据清洗和预处理的步骤,确保训练集和测试集具有相似的分布,清理噪声和异常值,验证标签的准确性。
- 随机性和初始化:
- 神经网络的训练过程可能受到随机初始化和随机梯度下降等随机因素的影响。
- 解决方法:尝试多次训练并取平均结果,或使用更稳定的优化算法。
- 超参数调整不当:
- 在多次训练过程中,如果超参数(如学习率、批大小、正则化强度等)没有得到适当的调整,可能会导致模型性能下降。
- 解决方法:使用网格搜索、随机搜索或贝叶斯优化等技术来找到最佳的超参数组合。
- 模型退化(Model Degeneration):
- 在某些情况下,尤其是在使用深度神经网络时,模型可能会在训练过程中逐渐失去其学习能力,这可能是由于梯度消失或梯度爆炸等问题导致的。
- 解决方法:使用适当的激活函数(如ReLU及其变体)、批量归一化、梯度裁剪等技术来稳定训练过程。
- 目标函数与评估指标不匹配:
- 确保您正在优化的目标函数与评估模型性能的指标相匹配。例如,如果您关心的是绝对误差(如MAE),那么确保在训练过程中也将其作为优化目标之一。
为了诊断问题并找到解决方案,您可以尝试以下步骤:
- 检查训练集和测试集上的性能差异,以确定是否存在过拟合或欠拟合。
- 检查数据清洗和预处理的步骤,确保数据的准确性和一致性。
- 使用验证集来监控训练过程中的性能,并在验证集性能开始下降时停止训练。
- 尝试不同的模型架构和超参数组合,以找到最适合您任务的模型。
- 监控训练过程中的梯度、损失和其他重要指标,以确保训练过程稳定且有效。
2. 优化器
优化器的任务是根据计算得到的梯度,调整模型的参数,以最小化损失函数。具体来说:
- 前向传播: 计算模型的输出,并根据实际标签计算损失。
- 反向传播: 计算损失对每个模型参数的梯度。
- 优化步骤: 使用计算出的梯度来更新模型的参数,以减小损失函数的值。
而优化器的目标则是通过更新模型的权重和偏置等参数。
3.pytorch
步骤:1.准备数据 2.定义模型 3.训练模型 4.评估模型 5.做出模型。
张量:

tensor(张量)是一个核心概念,它通常指的是多维数组(multi-dimensional array)或矩阵(matrix)的推广形式。

4. tensorboard是什么?
TensorBoard是TensorFlow提供的一组可视化工具,它不仅限于TensorFlow框架,还可以与其他深度学习框架(如PyTorch)结合使用。以下是对TensorBoard的详细介绍:
一、基本概述
TensorBoard是一个用于可视化和监控深度学习模型训练过程的工具。通过图形化的界面,开发者可以直观地看到模型的训练过程、数据的流动以及各种统计信息,从而更好地调试和优化模型。
二、主要功能
- 可视化模型结构:TensorBoard可以展示深度学习模型的结构,包括各层的连接关系和参数数量,帮助开发者更好地理解模型的整体架构。
- 显示训练过程指标:在训练过程中,TensorBoard可以实时展示损失函数、准确率等关键指标的变化情况,使开发者能够实时监控模型的训练进展。
- 可视化模型图像:对于模型中的图像数据,如特征图、卷积核等,TensorBoard也能进行可视化展示,帮助开发者理解模型在图像处理方面的性能。
- 显示计算图:TensorBoard能够展示深度学习模型的计算图,帮助开发者深入理解模型的前向传播和反向传播过程。
- 可视化嵌入向量:对于包含嵌入向量的模型(如Word2Vec),TensorBoard可以将这些嵌入向量可视化为二维或三维空间中的点,帮助开发者观察和理解嵌入向量之间的关系。
- 可视化训练曲线:除了上述指标外,TensorBoard还可以展示训练过程中的学习率、梯度大小等指标的变化情况,为模型的优化提供数据支持。
- 显示模型的直方图:TensorBoard能够展示模型中各层权重和偏置的直方图,帮助开发者了解模型参数的分布情况。
三、使用方式
使用TensorBoard通常需要将相关的日志数据写入到TensorBoard支持的格式中。对于TensorFlow用户,TensorBoard会自动收集TensorFlow程序在训练过程中产生的日志数据。对于其他框架的用户,如PyTorch,则需要通过额外的库(如torch.utils.tensorboard)来将日志数据写入到TensorBoard可识别的格式中。
四、应用场景
TensorBoard广泛应用于深度学习领域的模型训练、调试和优化过程中。无论是研究人员还是开发人员,都可以通过TensorBoard来监控和分析模型的训练情况,进而对模型进行针对性的优化和调整。
综上所述,TensorBoard是一个功能强大的深度学习可视化工具,它以其直观、便捷的特点受到了广大开发者的青睐。
SummaryWriter类:
使用SummaryWriter的基本步骤包括:
- 导入
SummaryWriter类。 - 创建一个
SummaryWriter对象,指定日志文件的保存路径(可选)。 - 在训练循环中,使用
SummaryWriter提供的方法添加需要可视化的数据。 - 训练结束后,关闭
SummaryWriter对象。
通过这种方式,开发者可以利用TensorBoard来监控和分析模型的训练过程,包括损失函数的变化趋势、准确率的提升情况、模型权重的分布等,从而帮助更好地理解和优化模型。
add_image() 和 add_scalar() 是 SummaryWriter 类中用于向 TensorBoard 添加不同类型数据的两个方法。
5.不同的模型不同的损失函数,不同的预处理方法是不是对的?
是的,不同的模型、不同的损失函数以及不同的预处理方法在机器学习和深度学习中是常见且正确的做法。这些选择通常取决于问题的具体需求、数据的特性以及模型的预期性能。
下面分别解释这三个方面的选择:
-
不同的模型:
不同的机器学习或深度学习模型具有不同的假设、结构和学习能力。例如,线性回归模型适合处理线性关系的问题,而神经网络则能够学习复杂的非线性关系。对于图像识别任务,卷积神经网络(CNN)通常比传统的机器学习模型(如逻辑回归或决策树)表现更好。选择合适的模型是解决问题的第一步,它直接影响到模型的性能和效率。 -
不同的损失函数:
损失函数用于评估模型的预测值与真实值之间的差异,是模型训练过程中优化的目标。不同的损失函数适用于不同的场景和需求。例如,在分类问题中,常用的损失函数有交叉熵损失(对于二分类和多分类问题)、合页损失(用于支持向量机SVM)等;在回归问题中,常用的损失函数有均方误差(MSE)、平均绝对误差(MAE)等。选择合适的损失函数有助于模型更准确地拟合数据。 -
不同的预处理方法:
数据预处理是机器学习和深度学习中的一个重要步骤,它旨在改善数据质量,提高模型的性能。不同的预处理方法包括数据清洗(如去除噪声、处理缺失值)、数据转换(如归一化、标准化、编码类别变量)、特征选择(选择对模型最有用的特征)等。预处理的方法取决于数据的特性和模型的需求。例如,对于神经网络,输入数据的归一化或标准化可以加速训练过程并提高模型性能;而对于某些基于距离计算的算法(如K-近邻),特征缩放尤为重要。
6.全连接神经网络(单元到整体)
全连接神经网络(Fully Connected Neural Network,简称FCNN),也被称为多层感知器(Multilayer Perceptron,MLP),是人工神经网络中的一种基础且广泛应用的模型。其特点在于网络中的每个神经元都与前一层和后一层的所有神经元相连接,形成密集的连接结构。以下是全连接神经网络的详细解释:
一、基本结构
全连接神经网络主要由以下几部分组成:
-
输入层:接收原始数据作为输入。输入层神经元的数量与输入数据的维度相同,每个输入节点对应于数据的一个特征。
-
隐藏层:位于输入层和输出层之间,负责对输入数据进行非线性变换和特征提取。隐藏层可以有多层,每层包含多个神经元。每个神经元都连接到上一层的所有神经元,并将它们的输出进行加权求和。隐藏层的数量和每层的神经元数量可以根据具体任务进行调整。
-
输出层:输出网络的预测结果。输出层神经元的数量取决于任务的需求。例如,在二分类任务中,输出层通常有一个神经元;在多分类任务中,输出层神经元的数量等于类别数。
二、工作原理
-
前向传播:数据通过输入层进入神经网络,经过隐藏层的非线性变换,最终到达输出层并产生输出结果。在前向传播过程中,每一层的神经元都接收来自前一层神经元的输出,并通过加权求和、激活函数等运算后输出到下一层。
-
激活函数:每个隐藏层节点的输出都会经过激活函数的处理,以引入非线性因素。常用的激活函数包括ReLU、Sigmoid、Tanh等。这些激活函数能够将输入信号转换为输出值,并帮助网络拟合复杂的数据分布。
-
损失函数:输出层的输出值与实际标签进行比较,损失函数用于度量神经网络的输出与真实值之间的误差。损失函数的选择取决于具体的任务和目标。
-
反向传播:通过反向传播算法,根据损失函数的导数来调整网络中每个连接的权重和偏置,以减小损失函数的值。反向传播算法会迭代多次,直到达到最优解或者达到指定的停止条件。
三、应用场景
全连接神经网络由于其灵活的网络结构和广泛的应用场景,在机器学习领域具有重要地位。它可以应用于各种任务,包括但不限于:
- 分类任务:如图像分类、文本分类等。
- 回归任务:如房价预测、股票价格预测等。
- 无监督学习任务:虽然全连接神经网络更常用于有监督学习,但也可以通过一些方法(如自编码器)应用于无监督学习任务。
四、优缺点
优点:
- 结构简单,易于理解和实现。
- 适用于处理各种类型的数据。
- 通过调整隐藏层的数量和每层的神经元数量,可以构建出不同复杂度的网络模型。
缺点:
- 参数较多,容易导致过拟合。
- 对于大规模数据集和复杂任务,可能需要较长的训练时间和较高的计算资源。
综上所述,全连接神经网络是一种基础且重要的人工神经网络模型,在机器学习领域具有广泛的应用前景。

全连接神经网络单元结构 :

激活函数:
激活函数(Activation Function)是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。激活函数是神经网络中用于增加非线性因素的函数,它使得神经网络能够逼近任何非线性函数,从而应用到各种非线性模型中。通过激活函数,神经网络能够学习到数据中的复杂模式,并做出准确的预测或分类。
sigmoid激活函数:
非常适合用于二分类问题的输出层,因为输出值可以解释为概率。例如,在逻辑回归中,输出值大于0.5通常被解释为正类,小于0.5被解释为负类。
Sigmoid函数是平滑的,这意味着它的导数存在且处处可导。这对于使用梯度下降等优化算法进行神经网络训练时非常重要。
Sigmoid函数在输入值极大或极小时,其梯度(导数)会趋近于0,这会导致在训练过程中出现梯度消失问题。梯度消失会使得反向传播算法中的权重更新变得非常缓慢,甚至停止学习。
Tanh函数(双曲正切函数):
是一个非线性函数,能够将输入值映射到区间(-1, 1)内。
优点:
- 输出范围在(-1, 1)之间,有助于保持数据的稳定性。
- 相比于Sigmoid函数,
Tanh函数是零中心的,这有助于优化算法更快地收敛。
缺点:
- 仍然存在梯度饱和问题,当输入值极端时,梯度会接近0,导致权重更新缓慢。
- 计算量相对较大,因为涉及到指数运算。
ReLU函数:
函数是深度学习中非常流行的激活函数,特别是在卷积神经网络(CNN)和许多其他类型的神经网络中。ReLU函数的主要优点是它计算简单、收敛速度快,并且在一定程度上缓解了梯度消失问题。
Leaky ReLU函数:

它的主要作用是引入非线性因素,同时解决梯度消失问题,并加快训练速度。
梯度?梯度下降法?
梯度(Gradient)是一个在多元函数的值域中,表示某一点上的函数值变化率最快的方向以及这个方向上的变化率大小的向量。在数学中,梯度通常表示为一个向量场,其方向指向函数值增加最快的方向,而梯度的大小(即向量的模)则代表了函数在该点沿该方向变化的速率。
在机器学习中,梯度下降法是一种常用的优化算法,用于寻找函数的最小值。通过计算目标函数关于参数的梯度,然后沿着梯度的反方向(即函数值减小的方向)更新参数,可以逐步逼近函数的最小值点。
梯度下降法(Gradient Descent)是一种常用的优化算法,用于寻找函数的局部最小值。它通过迭代的方式更新参数,以减小目标函数(即损失函数或成本函数)的值。梯度下降法广泛应用于机器学习、深度学习、统计优化等领域,特别是在训练神经网络时,它是不可或缺的算法之一。
梯度下降法有多种变体,主要包括:
-
批量梯度下降(Batch Gradient Descent, BGD):每次迭代使用全部样本来计算梯度并更新参数,计算量大但能保证收敛到全局最小值(如果损失函数是凸函数)。
-
随机梯度下降(Stochastic Gradient Descent, SGD):每次迭代仅使用一个样本来计算梯度并更新参数,计算量小但可能导致收敛过程震荡,甚至无法收敛到全局最小值。
-
小批量梯度下降(Mini-batch Gradient Descent, MBGD):每次迭代使用一小批样本来计算梯度并更新参数,是批量梯度下降和随机梯度下降的折中方案,既保证了计算的效率,又提高了收敛的稳定性。
代价函数=损失函数?
代价函数(有的地方也叫损失函数:Loss Function)在机器学习中的每一种算法中都很重要,因为训练模型的过程就是优化代价函数的过程,代价函数对每个参数的偏导数就是梯度下降中提到的梯度,防止过拟和时添加的正则化项也是加在代价函数后面的。
梯度是代价函数的导数。
一个好的代价函数需要满足两个最基本的要求:能够评价模型的准确性,对参数θ可微。
代价函数的常见形式:
2.1 均方误差在回归用
在线性回归中,最常用的是均方误差(Mean squared error),具体形式为:


2.交叉熵在分类用
(Cross Entropy)是用来衡量两个概率分布之间的差异性的一种方法。在机器学习和深度学习中,交叉熵常常被用作损失函数,用来衡量模型预测的结果与真实结果之间的差距。
交叉熵越小,表示模型预测的结果与真实结果越接近,反之则越不接近。因此,在机器学习中,我们通常将交叉熵作为损失函数,用来指导模型的优化。
梯度下降干什么?

学习率?
学习率(Learning Rate)是一个超参数,它控制着模型在每一次权重更新时的步长大小。在训练过程中,模型通过迭代地调整其内部参数(如权重和偏置)来最小化损失函数(Loss Function),这个调整过程通常是通过梯度下降(Gradient Descent)或其变体(如随机梯度下降SGD、批量梯度下降BGD、小批量梯度下降Mini-batch GD等)来实现的。
学习率决定了参数更新的幅度。具体来说,学习率乘以损失函数关于参数的梯度,得到参数的更新量。如果学习率设置得太高,模型可能会在最优解附近震荡,甚至发散,导致无法收敛;如果学习率设置得太低,虽然模型最终会收敛到最优解,但训练过程会非常缓慢,需要更多的迭代次数。
因此,选择合适的学习率对于模型的训练至关重要。在实际应用中,通常会通过一些策略来动态调整学习率,如学习率衰减(Learning Rate Decay)、学习率预热(Learning Rate Warmup)等,以在训练初期快速接近最优解,并在后期进行精细调整以达到更好的收敛效果。
算法改进的方向?

前向传播?
前向传播(Forward Propagation)是神经网络中的一个关键步骤,它指的是从输入数据开始,通过神经网络的各层逐层计算并传递数据,最终得到模型的输出结果的过程。具体来说,前向传播的过程可以细化为以下几个步骤:
-
输入层接收数据:神经网络的输入层接收来自外部的数据,这些数据是神经网络进行预测或分类的基础。
-
加权求和与激活:在神经网络的每一层中,输入数据(或前一层的输出)会与当前层的权重进行加权求和,然后加上偏置项。之后,这个结果会通过一个激活函数进行非线性变换,以引入非线性因素,使得神经网络能够处理更复杂的问题。
-
逐层传递:经过加权求和与激活处理后的数据会作为下一层的输入,继续重复上述过程,直到达到输出层。
-
输出层输出结果:在输出层,经过最后一层处理的数据会被转换为最终的输出结果。这个输出结果可以是分类问题的类别标签、回归问题的连续值等。
前向传播的目的是计算模型的预测值。在神经网络训练过程中,前向传播是第一步,它允许我们根据输入数据生成预测结果。随后,这些预测结果会与真实标签进行比较,以计算损失函数(如均方误差、交叉熵等),进而通过反向传播算法来更新神经网络的权重和偏置,以优化模型的性能。

线性回归?

线性回归的基本假设是,因变量(Y)与一个或多个自变量(X)之间存在线性关系,即可以表示为Y = aX + b的形式,
反向传播?
反向传递,在神经网络和机器学习的上下文中,通常指的是反向传播(Backpropagation)算法。这是一种用于训练人工神经网络的常用且有效的算法,其核心思想是通过链式法则(Chain Rule)递归地计算损失函数对每个参数的梯度,并据此更新网络的参数,以最小化损失函数,从而提高模型的预测准确性。反向传播算法之所以被称为“反向”,是因为梯度信息的传播方向与数据的前向传播方向相反。通过不断地迭代前向传播和反向传播过程,神经网络的参数会逐渐收敛到最优解,从而提高模型的性能。
卷积神经网络?
卷积计算?


卷积的步幅?
在进行卷积操作时,卷积核在输入数据上按行和列滑动的距离。步幅可以是一个正整数,通常用于控制卷积核在输入数据上滑动的“跳跃”程度。

卷积的填充?
卷积的填充(Padding)在卷积神经网络(CNN)中是一个重要的概念,它指的是在进行卷积操作之前,对输入数据的边界进行额外的填充,以增加输入数据的大小。填充的主要作用包括控制输出特征图的大小和形状,以及保持图像边缘信息,避免在卷积过程中丢失重要信息。
填充的类型
- 零填充(Zero Padding):这是最常见的填充方式,通过在输入数据的边界填充零值来增加输入数据的大小。零填充可以保持输出特征图的尺寸不变,或者根据需要调整其尺寸。
- 对称填充(Symmetric Padding):在这种方式中,填充的像素是原始图像边缘像素的镜像。这有助于保留图像边缘的更多信息,但实现起来相对复杂。
- 反射填充(Reflect Padding):与对称填充类似,但反射填充是将边缘像素向外反射,形成一种“镜像”效果。这种方式同样有助于保留边缘信息,并减少卷积操作对图像边缘的敏感性。

3x3的变成5x5的,乘以2x2的,为4x4的。
输出层的计算?

池化运算?
池化(Pooling)是卷积神经网络(CNN)中一种非常重要的操作,它主要用于降低特征图的维度(即宽度、高度),从而减少计算量,同时也有助于减少过拟合,提高模型的泛化能力。池化操作通常紧跟在卷积层之后。
池化层通过对输入特征图(feature map)的某个区域进行聚合统计(如取最大值、平均值等),来生成新的、维度较小的特征图。这种聚合统计的方式也被称为池化函数或池化方法。最常用的池化方法有两种:
-
最大池化(Max Pooling):在池化窗口(通常是一个2x2或3x3的矩形区域)内,选择最大值作为该区域池化后的值。这种方式可以保留图像中的纹理信息。
-
平均池化(Average Pooling):在池化窗口内,计算所有值的平均值,并将这个平均值作为该区域池化后的值。这种方式可以保留图像的背景信息。


LeNet-5?
5,表示有五层神经网络层。
卷积核才算层,而池化层是一个运算的



class LeNet5(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 6, 5, padding=2)
self.pool1 = nn.AvgPool2d(2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.pool2 = nn.AvgPool2d(2)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = torch.tanh(self.conv1(x))
x = self.pool1(x)
x = torch.tanh(self.conv2(x))
x = self.pool2(x)
x = x.view(-1, 16 * 5 * 5)
x = self.fc1(x)
x = self.fc2(x)
x = self.fc3(x)
return x

AlexNet?
- 名称来源:AlexNet的名字来源于其第一作者Alex Krizhevsky,他是加拿大多伦多大学的一名研究生,该网络结构是在他的导师Geoffrey Hinton的指导下研发的。
- 发表背景:AlexNet是在2012年的ImageNet Large Scale Visual Recognition Challenge(ILSVRC)竞赛中首次亮相,并以其出色的性能夺得冠军,从而引起了学术界和工业界对深度学习和卷积神经网络的广泛关注。
- 层次结构:AlexNet包含5个卷积层(Convolutional Layers)和3个全连接层(Fully Connected Layers),这些层之间通过ReLU(Rectified Linear Unit)激活函数和池化层(Pooling Layers)进行连接。
- 特点:
- 更深的网络结构:相比于之前的LeNet-5等网络,AlexNet具有更深的层次结构,能够更好地提取图像中的复杂特征。
- ReLU激活函数:AlexNet首次在卷积神经网络中大规模使用ReLU作为激活函数,有效缓解了梯度消失问题,并加速了训练过程。
- Dropout技术:为了防止过拟合,AlexNet在训练过程中使用了Dropout技术,随机丢弃一部分神经元的输出。
- 数据增强:通过图像平移、翻转等操作来增加训练数据的多样性,进一步提高模型的泛化能力。


Dropout?
是一种常用的正则化技术,特别是在深度学习模型的训练过程中。它的主要目的是通过减少神经元之间的复杂共适应性,来防止模型过拟合,从而提高模型的泛化能力。
Dropout的工作原理
在训练过程中,Dropout会随机选择神经网络中的一部分神经元,并将其输出暂时设置为零(或等价地,将其权重或激活值置为零)。这意味着在每次前向传播时,神经网络的结构都会有所不同,因为有一部分神经元被“丢弃”了。这种随机性有助于模型学习到更加鲁棒的特征表示,因为它不再依赖于任何特定的神经元组合。
Dropout的目的与效果
- 减少神经元之间的复杂共适应性:通过随机丢弃部分神经元,Dropout减少了神经元之间的复杂依赖关系,使得模型在训练过程中不会过于依赖某些特定的神经元组合。
- 防止过拟合:由于每次训练迭代时神经网络的结构都有所不同,Dropout迫使模型学习到更加广泛的特征,而不是仅仅记住训练数据中的噪声或特定模式。这有助于减少模型在未见数据上的过拟合现象。
- 提高模型的泛化能力:通过增加模型的鲁棒性和减少过拟合,Dropout显著提高了模型在新数据上的表现能力,即模型的泛化能力。
- Dropout的应用场景
Dropout技术主要应用于具有深度结构的人工神经网络中,特别是在卷积神经网络(CNN)和全连接神经网络(FCN)中效果显著。在训练数据有限的情况下,Dropout通过减少模型的复杂性来防止过拟合,从而提高了模型的性能。
Dropout的实现方式
在实际应用中,Dropout通常通过定义一个保留概率(如0.5)来实现。每个神经元在训练过程中都有该概率被保留(即不被丢弃),否则被丢弃。保留概率的补数(如1-0.5=0.5)即为丢弃神经元的比例,这是一个可调参数,需要根据具体任务和网络结构进行调整以达到最佳效果。
图像增强技术?
在PyTorch中,图像增强是一种技术,用于提高图像数据集的多样性和质量,从而改善深度学习模型的性能和鲁棒性。具体来说,图像增强通过在原始图像上应用一系列变换来生成新的图像,这些变换可以是几何变换(如旋转、翻转、裁剪等)、颜色变换(如亮度调整、对比度调整、色彩调整等)或其他更复杂的变换(如高斯模糊、锐化、去噪等)。
LRN正则化?
LRN正则化,全称为Local Response Normalization(局部响应归一化),是一种在深度学习,特别是在卷积神经网络(CNN)中常用的正则化技术。该技术旨在通过模拟生物视觉系统中的侧抑制现象,优化神经网络的性能,减少同一特征映射上相邻单元之间的响应差异过大问题,从而提高模型的泛化能力。
LRN正则化的基本原理
LRN正则化通过对每个神经元的输出值进行归一化处理,使其不仅依赖于自身的激活程度,还受到其邻近神经元激活程度的影响。具体来说,LRN会计算每个神经元输出值与其邻近神经元输出值之间的某种关系(通常是平方和),然后根据这个关系调整该神经元的输出值。这种调整方式可以抑制响应过强的神经元,同时增强响应较弱的神经元,从而实现特征映射的自适应归一化。
LRN正则化的数学表达

其中,n代表邻域大小,即考虑的邻近神经元的数量;α和β是可训练参数,用于控制归一化的程度;k是一个很小的常数,用于避免除零错误;N表示总的感受野大小。
标准化和归一化?
标准化是一种数据预处理的技术,它的主要目的是将数据按比例缩放,使之符合一个特定的分布或范围,以便于后续的数据处理和分析。在机器学习和数据科学中,标准化通常指的是将数据转换为均值为0,标准差为1的分布,这个过程也被称为Z-score标准化。
标准化的具体步骤如下:
-
计算均值(Mean):首先,需要计算数据的均值,即所有观测值的平均值。
-
计算标准差(Standard Deviation):然后,计算数据的标准差,它衡量了数据点与其均值的偏离程度。
-
转换数据:最后,将每个数据点减去均值,并除以标准差,得到标准化后的数据。转换公式为:z=σx−μ
其中,x是原始数据点,μ是均值,σ是标准差,z是标准化后的数据点。
标准化的好处包括:
- 统一量纲:标准化后的数据具有相同的尺度,便于不同特征之间的比较和加权。
- 减少异常值影响:通过转换到均值为0、标准差为1的分布,标准化可以减少异常值对模型训练的影响。
- 提升模型性能:对于许多基于梯度的算法(如线性回归、逻辑回归、神经网络等),标准化可以加快收敛速度,提高模型的精度和稳定性。
归一化处理(Normalization)是数据预处理的一种重要技术,它指的是将数据按比例缩放,使之落入一个小的特定区间,比如[0, 1]或[-1, 1]。归一化的目的是去除不同维度数据的量纲影响,使各维度数据处于同一数量级,从而便于后续的数据处理和分析工作。
归一化处理对于很多机器学习算法来说都是非常重要的,因为很多算法都是基于梯度下降的,而梯度下降法要求数据具有一定的数值稳定性,归一化能够加快梯度下降的收敛速度,提高算法的精度和效率。
归一化处理的方法有很多种,常见的有:
-
最小-最大归一化(Min-Max Normalization):
这种方法将原始数据线性地转换到[0, 1]的范围内。转换公式为:
其中,x是原始数据,xmin和xmax分别是数据集中的最小值和最大值,xnorm是归一化后的数据。
-
Z-score标准化(Z-score Normalization):
也称为标准差标准化,这种方法基于原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。转换后的数据符合标准正态分布,即均值为0,标准差为1。转换公式为:
其中,x是原始数据,μ是原始数据的均值,σ是原始数据的标准差,z是标准化后的数据。
-
对数归一化:
对于某些数值范围差异特别大的数据,可以使用对数函数进行归一化,如对数函数y=log10(x),这种方法可以缩小数据的范围,使其更加平稳。 -
反余切归一化:
使用反余切函数y=arctan(x)∗π2,将数据转换到(−21,21)的范围内。这种方法特别适用于将大范围的数值映射到较小的区间。
归一化处理是数据预处理中非常重要的一步,它可以提高机器学习模型的性能,加快模型的收敛速度,提高模型的精度和稳定性。但是,需要注意的是,归一化处理并不适用于所有情况,比如在使用决策树、随机森林等基于树的算法时,通常不需要进行归一化处理。
- 标准化:适用于大多数需要计算距离的算法,如SVM、KNN、LR以及神经网络等。这些算法对数据的尺度敏感,标准化可以消除不同特征之间的尺度差异,提高模型的性能。此外,标准化也适用于数据的最大值和最小值未知,或存在孤立点的情况。
- 归一化:适用于对参数大小敏感,或者最大最小值已知的场景,如梯度下降、深度学习等。归一化可以确保所有特征都在同一尺度上,有助于算法的收敛和稳定性。此外,归一化也常用于需要将数据限制在特定范围内的场景,如图像处理中的像素值归一化。
搭建神经网络模型?
import torch
from torch import nn
from torchsummary import summary
1.PyTorch库。2.nn模块是PyTorch中用于构建神经网络的模块,它包含了许多构建神经网络所需的层。3. 用于快速查看神经网络模型的架构和每层输出的尺寸。
其实写神经网络模型的套路是一样的,只是卷积层数不一样而已。
class LeNet(nn.Module):
nn.Module:是指继承一个已经写好的类。
def __init__(self):
当你创建一个类的新实例时,Python会自动调用这个方法来初始化该实例。构造函数是类的一个特殊方法,它的名字以双下划线开头和结尾(__init__),并且它至少有一个参数,通常是 self。
self参数是对类实例本身的引用。在类的方法内部,你可以通过self访问类的属性和其他方法。- 构造函数的主要目的是初始化对象的状态,即设置对象的初始属性值。
搭建模型的步骤:
1.class,一个类,然后初始化,然后准备材料,如:网络层,激活函数,然后在搭建前向传播,
先卷积后池化
super(LeNet,self).__init__()
super()函数是一个内置函数,用于调用父类(超类)的一个方法。
从Python 3开始,super()的使用方式有所简化,可以直接写成super().__init__(),而不需要显式指定类和self参数。
self.flatten = nn.Flatten()
nn.Flatten是PyTorch中torch.nn模块提供的一个层,用于将输入数据的多维张量(tensor)展平成一维张量,通常用于卷积神经网络(CNN)的末尾,以便将多维的特征图(feature maps)转换为一维的特征向量,进而可以输入到全连接层(fully connected layers)中进行分类或其他任务。
self.f5 = nn.linear(in_features:400,out_features:120)
self.f6 = nn.linear(in_features:120,out_features:84)
self.f7 = nn.linear(in_features:84,out_features:10)
-
self.flatten = nn.Flatten():这定义了一个展平层,它用于将多维输入(如卷积层输出的特征图)展平成一维张量,以便可以输入到全连接层中。 -
self.f5 = nn.Linear(in_features=400, out_features=120):这定义了一个全连接层(也称为线性层或密集层),它接受400个输入特征并输出120个特征。这个层通常用于从前面的层(如self.flatten)接收展平后的数据,并学习它们之间的线性关系。 -
self.f6 = nn.Linear(in_features=120, out_features=84)和self.f7 = nn.Linear(in_features=84, out_features=10):这两个也是全连接层,它们分别接受前一个全连接层的输出作为输入,并继续学习线性关系。self.f6将120个输入特征转换为84个输出特征,而self.f7将84个输入特征转换为10个输出特征(这通常用于分类任务中的类别数)。
import torch
from torch import nn
from torchsummary import summary
class LeNet(nn.Module):
def __init__(self):
super().__init__()
self.c1 = nn.Conv2d(in_channels=1,out_channels=6,kernel_size=5,padding=2)
self.sig = nn.Sigmoid()
self.s2 = nn.AvgPool2d(kernel_size=2,stride=2)
self.c3 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5)
self.s4 = nn.AvgPool2d(kernel_size=2, stride=2)
self.flatten = nn.Flatten()
self.f5 = nn.Linear(in_features=400,out_features=120)
self.f6 = nn.Linear(in_features=120,out_features=84)
self.f7 = nn.Linear(in_features=84,out_features=10)
def forward(self,x):
x = self.sig(self.c1(x))
x = self.s2(x)
x = self.sig(self.c3(x))
x = self.s4(x)
x = self.flatten(x)
x = self.f5(x)
x = self.f6(x)
x = self.f7(x)
return x
if __name__=="__main__":
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = LeNet().to(device)
print(summary(model,(1,28,28)))
训练模型的代码?
怎么划分实验数据和验证数据?
train_data,val_data = Data.random_split(train_data,lengths=[round(0.8*len(train_data)), round(0.2*len(train_data))])
这行代码的意图是将train_data(一个假定的数据集)随机分割成两部分:
- 第一部分包含原始数据集大约80%的数据,用作训练集。
- 第二部分包含剩余的大约20%的数据,通常用作验证集或测试集,具体取决于后续的使用目的。
这段代码创建了一个 DataLoader 对象,它负责从 train_data 数据集中批量、随机地加载数据,以供模型训练时使用。
from torch.utils.data import DataLoader
# 假设 train_data 是一个 PyTorch Dataset 对象
train_dataloader = DataLoader(dataset=train_data,
batch_size=128,
shuffle=True,
num_workers=8)
-
atch_size=128指定了每个批次(batch)中加载的样本数。在这个例子中,每次迭代将加载128个样本。 -
shuffle=True表示在每个 epoch 开始时,数据将被随机打乱。这有助于模型在训练过程中看到数据的不同排列,从而提高泛化能力。
搭建练习数据的过程?
def train_model_process(model,train_dataloader,val_dataloader, num_epochs):
# 确定使用CPU还是GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 初始化优化器,这里使用Adam优化器,并传入模型的所有可训练参数和学习率
optimizer = torch.optim.Adam(model.paramters(),lr=0.001)
# 初始化损失函数,这里使用交叉熵损失函数,常用于多分类问题
criterion = nn.CrossEntropyLoss()
# 将模型移至指定的设备(CPU或GPU)
model = model.to(device)
# 使用深拷贝来保存模型的最佳权重(初始时,可以假设当前权重就是最佳权重)
best_model_wts = copy,deepcopy(model.state_dict())
best_acc = 0.0
train_loss_all = []
val_loss_all = []
train_acc_all = []
val_acc_all = []
since = time.time()
1.best_acc = 0.0:用于存储到目前为止在验证集上达到的最高准确率。
2.train_loss_all = []、val_loss_all = []:这两个列表分别用于存储每个epoch在训练集和验证集上的损失值(loss)。
3.train_acc_all = []、val_acc_all = []:这两个列表分别用于存储每个epoch在训练集和验证集上的准确率。
4.since = time.time():函数获取当前时间(以秒为单位)。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)