建设厅网站上怎么实名认证,山东住房建设部网站,建设银行联号查询网站,汉阳放心的建站企丿目录 一、基础知识点Ⅰ 参数部分Ⅱ 模型部分 二、深度神经网络模型搭建1. 准备数据集2. 划分数据集3. 搭建模型4. 训练网络5. 测试网络6. 保存与导入模型 神经网络通过学习大量样本的输入与输出特征之间的关系#xff0c;以拟合出输入与输出之间的方程#xff0c;学习完成后以拟合出输入与输出之间的方程学习完成后只给它输入特征它便会可以给出输出特征。神经网络可以分为这么几步准备数据集、划分数据集、搭建网络模型、训练网络、测试网络、使用网络。 神经网络的训练过程就是经过很多次前向传播与反向传播的轮回最终不断调整其内部参数权重 ω 与偏置 b以拟合任意复杂函数的过程。内部参数一开始是随机的如 Xavier 初始值、He 初始值最终会不断优化到最佳。 对于整个流程如下我们先准备好样本数据以及样本对应的标签一般给模型的输入都是tensor格式的如果初始数据集不是tensor格式则需要转为tensor格式将整个样本分为训练集和测试集一般为8/2或7/3训练集必须大于测试集因为我们是训练模型所以要使用更多的数据去训练优化模型具体的划分比例按实际情况分析。
训练过程先定义损失函数、学习率和优化器具体选择哪个函数和优化器根据情况而定。将训练集的样本放入网络中去获得预测标签然后将预测的标签和真实样本的标签放入损失函数中进行计算损失再将计算的损失进行反向传播并使用优化器进行优化模型参数。训练优化模型的参数。
测试过程测试过程和训练过程唯一的区别就是测试网络中不需要回传梯度即不需要进行反向传播。所以也不需要定义损失函数和优化器直接将测试集的样本放入模型进行一次前向传播得出预测标签然后将预测标签和真实标签进行比较最终得出准确率。 神经网络深度神经网络DNN、卷积神经网络CNN。 一、基础知识点
Ⅰ 参数部分 损失函数计算真实值和预测值差异的一类函数。预测值越接近真实值时损失越低。我们训练的最终目的就是使得损失函数降到最低。一般用在训练网络中将样本放入模型中得出预测标签然后将预测标签和真实标签放入损失函数中计算损失再将损失进行回传反向传播通过优化器进行优化模型的参数。损失函数有很多种可用于不同的神经网络模型。 激活函数引入非线性性使得神经网络能够学习复杂的模式和函数。激活函数通常被应用在神经网络的每一层的输出上。选择合适的激活函数通常取决于具体的任务和数据集。如果每层网络输出后不加上激活函数进行非线性调整的话那么就算搭建一百层的网络其实一层就可以搞定。所以激活函数是很必要的神经网络各层功能函数详情查看地址。 学习率训练神经网络时的一个关键超参数它控制模型参数在每次迭代中更新的幅度。一个合适的学习率可以使模型在训练过程中快速收敛到局部最优解或全局最优解而一个不合适的学习率可能会导致训练过程出现问题例如收敛速度过慢、陷入局部最优解等。
Ⅱ 模型部分
模型的输入模型的输入通常需要是张量tensor的形式。这是因为深度学习模型是基于张量运算构建的张量提供了一种有效的方式来表示和处理数据。在深度学习模型中使用输入数据你通常需要将原始数据转换为张量的形式。训练集和测试集训练集是用来训练模型的数据集它包含了模型需要学习的样本和对应的标签。在训练过程中模型通过训练集中的样本进行学习调整参数以最小化损失函数。在模型训练完成后使用测试集来评估模型在未知数据上的泛化能力。测试集的目的是检查模型是否能够正确地推广到新的、未见过的数据上以验证模型的性能和有效性。训练网络和测试网络训练网络和测试网络的区别就在于训练网络需要回传梯度即反向传播。而测试网络不需要回传梯度。前向传播在前向传播过程中输入数据通过神经网络的各个层经过权重和偏置的线性组合然后通过激活函数得到输出。前向传播的目的是计算模型的预测值或者说输出值然后将预测值与实际标签进行比较以计算损失函数。这一过程沿着网络的正向进行从输入层到输出层。反向传播 反向传播是训练神经网络的关键步骤它通过计算损失函数关于网络参数权重和偏置的梯度来调整参数使得损失函数减小。反向传播利用链式法则从输出层向输入层计算梯度将损失沿着网络反向传播。反向传播过程可以分为两个阶段首先计算损失函数对网络输出的梯度然后逐层反向传播这些梯度以计算损失函数对各层参数的梯度。计算得到的梯度可以用于更新模型参数通常使用梯度下降等优化算法进行参数更新。这个过程很复杂原理不必掌握。我们直接使用函数即可。梯度下降优化器 1optim.SGD: 随机梯度下降Stochastic Gradient Descent是最基础的优化器之一通过梯度的方向进行参数的更新。 2optim.Adam: Adam 优化器结合了动量梯度下降和 RMSProp 算法对学习率进行自适应调整适用于大多数深度学习任务。 3optim.Adagrad: 自适应梯度算法Adaptive Gradient Algorithm根据参数的历史梯度调整学习率。 4optim.RMSprop: RMSProp 优化器使用指数加权移动平均来调整学习率有效地解决了 AdaGrad 学习率下降过快的问题。 5optim.Adadelta: AdaDelta 优化器也是自适应学习率算法类似于 RMSProp但没有学习率超参数。 6optim.AdamW: 在 Adam 优化器的基础上添加了权重衰减Weight Decay的选项用于对权重进行正则化。 7optim.LBFGS: 拟牛顿法的一种适用于较小的数据集和参数较少的情况。 这些优化器类提供了不同的优化算法和超参数选项可以根据具体任务的需求选择合适的优化器来进行模型训练。batch_size: 每次训练投入模型的样本个数。epochs全部样本训练的轮次。1 个 epoch 就是指全部样本进行 1 次前向传播与反向传播。
二、深度神经网络模型搭建
以该神经网络框架为例
1. 准备数据集 无论是任何模型第一步都是先要准备好进行训练的数据集。为了演示我们这里自己通过代码生成数据集。如上述模块框架输入特征x个数为3输出特征y个数也为3。
随机生成10000行1列的输入数据。使用torch.rand生成的数据已经是tensor格式了X1 torch.rand(10000, 1) # 输入特征 1X2 torch.rand(10000, 1) # 输入特征 2X3 torch.rand(10000, 1) # 输入特征 3将输入特征的各行逐行相加并与1比较。1为1否则为0. Y1 ((X1 X2 X3) 1).float() # 输出特征1。Y2 ((1 (X1 X2 X3)) ((X1 X2 X3) 2)).float() # 输出特征2。Y3 ((X1 X2 X3) 2).float() # 输出特征3。整合数据集合并为10000行6列的数据列表
axis1,在第二个维度上合并数据也就是列的维度上。axis0则在行的维度上合并合并后为60000行1列Data torch.cat([X1, X2, X3, Y1, Y2, Y3], axis1)
2. 划分数据集
将数据集进行划分划分为训练集和测试集。下面代码中包含列表的切片操作详情查看这里。
传入参数为总数据集
def train_test_split(Data):train_size int(len(Data) * 0.7) # 训练集的样本数量test_size len(Data) - train_size # 测试集的样本数量 Data.size(0) 为数据的行数Data.size(1)的列数 Data[第一个维度第二个维度] : 表示该维度全要 Data Data[ torch.randperm(Data.size(0)), :] # 按行进行打乱样本的顺序第二个维度不变train_Data Data[: train_size, :] # 训练集样本test_Data Data[train_size: , :] # 测试集样本return train_Data,test_Datatrain_Data,test_Datatrain_test_split(Data)3. 搭建模型 搭建神经网络时以 nn.Module 作为父类我们自己的神经网络可直接继承父类的方法与属性nn.Module 中包含网络各个层的定义。每个模型都必须包含forward前向传播方法。 不同模型可以查看模型的框图进行搭建。
class DNN(nn.Module):def __init__(self): 搭建神经网络各层 super(DNN,self).__init__()self.net nn.Sequential( # 按顺序搭建各层,每一个隐藏层后都使用了 RuLU 激活函数nn.Linear(3, 5), nn.ReLU(), # 第 1 层全连接层nn.Linear(5, 5), nn.ReLU(), # 第 2 层全连接层nn.Linear(5, 5), nn.ReLU(), # 第 3 层全连接层nn.Linear(5, 3) # 第 4 层全连接层)def forward(self, x): 前向传播 y self.net(x) # x 即输入数据return y # y 即输出数据model DNN().to(cuda:0) #创建子类的实例并搬到 GPU 上
model DNN() #在cpu上
print(model) #查看该实例的各层查看模型层数情况
print(model) #查看该实例的各层4. 训练网络
def train_net():loss_fn nn.MSELoss() 选择损失函数learning_rate 0.01 设置学习率定义优化器 torch.optim.SGD 是 PyTorch 提供的 SGD 优化器类用于实现随机梯度下降算法。 model.parameters() 是一个迭代器它会返回模型中所有需要训练的参数。 lrlearning_rate 设置了学习率learning rate即 SGD 算法中用于控制参数更新步长的超参数。 optimizer torch.optim.SGD(model.parameters(), lrlearning_rate) 训练网络epochs 1000 losses [] #记录损失函数变化的列表给训练集划分输入与输出X train_Data[:, :3] #前3列为输入特征Y train_Data[:, -3:] #后3列为输出特征for epoch in range(epochs):前向传播写法一Pred model.forward(X) # 一次前向传播批量,获得预测值前向传播写法二这是因为torch中对模型输入时自动调用forward方法不需要显示调用forward方法 Pred model(X) loss loss_fn(Pred, Y) # 将预测值和真实值传入损失函数计算损失。losses.append(loss.item()) # 记录损失函数的变化optimizer.zero_grad() # 清理上一轮滞留的梯度loss.backward() # 将损失进行一次反向传播optimizer.step() # 优化内部参数print(Epoch [{}/{}], Loss: {:.4f}.format(epoch 1, epochs, loss.item()))对loss损失进行画图 Fig plt.figure()plt.plot(range(epochs), losses)plt.ylabel(loss), plt.xlabel(epoch)plt.show()查看模型内部参数 for name, param in model.named_parameters():print(f参数:{name}\n 形状:{param.shape}\n 数值:{param}\n)5. 测试网络 在测试网络时通常不需要定义损失函数和优化器。在测试阶段我们主要关注模型在新的、未见过的数据上的性能表现而不是在训练集上的表现。因此不需要对模型进行参数更新也就不需要定义优化器。
def test_net():给测试集划分输入与输出X test_Data[:, :3] #前3列为输入特征Y test_Data[:, -3:] #后3列为输出特征with torch.no_grad(): 该局部关闭梯度计算功能Pred model(X) #一次前向传播批量,获得预测值torch.argmax(Pred, axis1) 返回每行中最大值的索引然后使用这些索引来将对应位置的值设置为1其他位置的值保持不变。Pred[:, torch.argmax(Pred, axis1)] 1Pred[Pred ! 1] 0correct torch.sum((Pred Y).all(1)) # 预测正确的样本total Y.size(0) #全部的样本数量print(f测试集精准度: {100 * correct / total} %)
6. 保存与导入模型
1保存和导入整个模型 通常用于在 PyTorch 中保存训练好的模型。当你在训练神经网络模型时可能会花费很多时间和计算资源。为了避免每次使用模型时都重新训练你可以使用 torch.save() 将模型保存到磁盘上以便稍后加载和使用。比如将模型部署到生产环境或与其他人共享模型。 模型文件通常以.pth或.pt为后缀。
保存已经训练好的模型文件
old_modelDNN()
train_net() 在保存模型文件前要先训练模型
torch.save(old_model, old_model.pth)新模型加载已经训练好的模型文件,不需要进行实例化模型
new_model torch.load(old_model.pth)
test_net() #测试网络中前向传播的模型要改为new_model。2只保存模型参数文件 (推荐使用更加轻量化) 可将保存的模型数据导入新的网络中使用。
只保存模型参数
old_modelDNN()
train_net() 在保存模型文件前要先训练模型
torch.save(old_model.state_dict(), old_model_params.pth)将加载的参数状态字典加载到模型实例new_model中
new_modelDNN()
model_state_dict torch.load(old_model_params.pth)
new_model.load_state_dict(model_state_dict)
test_net() #测试网络中前向传播的模型要改为new_model。3导入模型到测试网络 模型导入后可以直接去跑测试集。因为保存的模型里面各类参数已经训练好所以不需要再训练。 new_model使用了原有模型文件我们就需要在测试网络的前向传播中的模型修改为new_model去进行测试。如下 1 导入整个模型 假设原模型已经被保存为 old_model.pth def test_net():给测试集划分输入与输出X test_Data[:, :3] #前3列为输入特征Y test_Data[:, -3:] #后3列为输出特征with torch.no_grad(): # 该局部关闭梯度计算功能Pred new_model(X) # 一次前向传播批量获得预测值使用 torch.argmax() 获取每行最大值的索引并根据索引设置对应位置的值为 1Pred_onehot torch.zeros_like(Pred)Pred_onehot.scatter_(1, torch.argmax(Pred, dim1).unsqueeze(1), 1)# 将非最大值位置的值设置为 0Pred Pred_onehot# 计算预测正确的样本数量correct torch.sum(torch.all(Pred Y, dim1))total Y.size(0) # 全部的样本数量print(f测试集精准度: {100 * correct / total} %)if __name__ __main__:new_model torch.load(old_model.pth)test_net()2 导入模型参数 假设原模型已经被保存为 old_model_params.pth def test_net():给测试集划分输入与输出X test_Data[:, :3] #前3列为输入特征Y test_Data[:, -3:] #后3列为输出特征with torch.no_grad(): # 该局部关闭梯度计算功能Pred new_model(X) # 一次前向传播批量获得预测值使用 torch.argmax() 获取每行最大值的索引并根据索引设置对应位置的值为 1Pred_onehot torch.zeros_like(Pred)Pred_onehot.scatter_(1, torch.argmax(Pred, dim1).unsqueeze(1), 1)# 将非最大值位置的值设置为 0Pred Pred_onehot# 计算预测正确的样本数量correct torch.sum(torch.all(Pred Y, dim1))total Y.size(0) # 全部的样本数量print(f测试集精准度: {100 * correct / total} %)if __name__ __main__:new_modelDNN()model_state_dict torch.load(old_model_params.pth)new_model.load_state_dict(model_state_dict) #新模型加载保存好的模型参数