投标建设用地是哪个网站,公司网站有时登不进 服务器,微信公众号内容制作流程,长沙网站制作平台我们已经集齐了训练模型所需的所有“龙珠”#xff1a;作为“原材料”的Tensor、作为“生产线”的nn.Cell、作为“质量标准”的损失函数#xff0c;以及作为“改进方向指南针”的自动微分。现在#xff0c;万事俱备#xff0c;只欠“东风”——一个强有力的执行者#xff…我们已经集齐了训练模型所需的所有“龙珠”作为“原材料”的Tensor、作为“生产线”的nn.Cell、作为“质量标准”的损失函数以及作为“改进方向指南针”的自动微分。现在万事俱备只欠“东风”——一个强有力的执行者它能根据指南针的指示去实际地调整机器的每一个旋钮。这个执行者就是优化器 (Optimizer)。1. 什么是优化器—— 参数的“首席调校师”在上一篇文章中我们通过自动微分成功获取了每个参数的梯度Gradient。梯度告诉了我们参数应该“朝哪个方向”调整。但还有两个问题没有解决“调整的幅度应该是多大” 步子迈得太大容易“扯着”导致模型在最优解附近来回震荡难以收敛步子太小训练速度又会过于缓慢。“由谁来负责执行这个调整操作”优化器 (Optimizer)就是这个问题的终极答案。它的核心职责是根据自动微分计算出的梯度采用一套特定的更新策略去修改网络中的每一个可训练参数。1.1 最经典的优化器SGD最基础、最经典的优化器是随机梯度下降 (Stochastic Gradient Descent, SGD)。它的更新策略非常直观可以用一个简单的公式来描述new_parameter old_parameter - learning_rate * gradientold_parameter: 参数当前的值。gradient: 该参数的梯度。learning_rate(学习率): 这是一个超参数需要我们手动设定它控制了每次参数更新的“步长”。这是一个非常重要的参数它的设置直接影响模型的训练效果和速度。比喻: 想象你在一个漆黑的山谷里想要走到谷底损失函数的最小值点。你的每一步都遵循这个策略用脚探查一下四周哪个方向是下山最陡峭的计算梯度。朝着这个最陡峭的方向迈出一小步更新参数。这一步的大小就是学习率。循环往复直到你感觉自己已经走到了谷底梯度接近于0。MindSpore在mindspore.nn库中内置了SGD以及许多更先进的优化器如Adam,RMSProp等。它们都遵循“梯度学习率更新参数”的基本逻辑但采用了更复杂的策略来动态地调整学习率或考虑历史梯度信息以实现更快、更稳定的收敛。2. 完整的训练流程串联所有知识点现在我们将前面几章的所有知识点串联起来形成一个完整的、可执行的单步训练流程 (Train Step)。前向传播: 将一批训练数据输入网络得到预测结果。计算损失: 将预测结果与真实标签进行比较通过损失函数计算出当前的损失值。计算梯度 (反向传播): 以损失值为起点通过自动微分计算出损失关于网络中每一个可训练参数的梯度。更新参数: 将计算出的梯度交给优化器优化器根据其内部策略如SGD的公式来更新网络的所有参数。这个流程会一遍又一遍地重复。我们将整个数据集完整地过一遍这个流程称为一个Epoch。一个完整的模型训练通常需要迭代很多个Epoch。3. 实战从零开始训练一个线性回归模型理论讲了这么多让我们来点真格的。我们将用MindSpore完整地训练一个最简单的线性回归模型来拟合函数y 2x 0.5。我们的目标是让模型通过学习自动地找出权重W趋近于2偏置b趋近于0.5。importnumpyasnpimportmindsporefrommindsporeimportnn,ops,Tensor# --- 准备工作 ---mindspore.set_context(modemindspore.PYNATIVE_MODE)# 1. 创建一个简单的数据集# 真实函数为 y 2x 0.5x_datanp.linspace(-1,1,100,dtypenp.float32).reshape(-1,1)y_data2*x_data0.5np.random.normal(0,0.05,x_data.shape).astype(np.float32)# 2. 定义我们的网络、损失函数和优化器# 我们的模型就是一个简单的线性层 y Wx b# 输入维度是1输出维度也是1netnn.Dense(in_channels1,out_channels1)loss_fnnn.MSELoss()# 均方误差损失# 使用SGD优化器传入网络中需要训练的参数并设置学习率optimizernn.SGD(net.trainable_params(),learning_rate0.01)# 3. 定义前向计算和梯度计算的逻辑defforward_fn(data,label):logitsnet(data)lossloss_fn(logits,label)returnloss,logits# 获取梯度计算函数grad_fnops.GradOperation(get_by_listTrue)(forward_fn,net.trainable_params())# --- 开始训练 ---epochs10# 训练10轮forepochinrange(epochs):# 在每个epoch开始时我们重新获取一次数据# 在实际项目中这里会使用MindSpore的Dataset库来高效加载数据dataTensor(x_data)labelTensor(y_data)# 1. 计算梯度loss,gradsgrad_fn(data,label)# 2. 使用优化器更新参数# optimizer接收梯度作为输入自动完成参数更新optimizer(grads)if(epoch1)%20:print(fEpoch{epoch1:2d}, Loss:{loss.asnumpy():.6f})# --- 验证结果 ---# 训练完成后我们打印出学习到的参数trained_paramsnet.trainable_params()weighttrained_params[0]biastrained_params[1]print(*20)print(f学习到的权重 (W):{weight.asnumpy()[0][0]:.4f})print(f学习到的偏置 (b):{bias.asnumpy()[0]:.4f})print(理论值应分别接近 2.0 和 0.5)代码与结果解读:我们首先人工创建了一个带有少许噪音的数据集。然后我们定义了网络、损失函数和优化器这是训练前的“三件套”。在训练循环中我们严格按照“计算梯度 - 优化器更新”的流程执行。训练结束后你会看到打印出的损失值Loss在不断减小这说明模型确实在“学习”。最终打印出的权重和偏置会非常接近我们设定的真实值2.0和0.5。这雄辩地证明了我们的模型通过“看”这些数据成功地“领悟”了它们背后的规律4. 更高效的方式MindSpore高阶API抢先看虽然上面的手动训练循环清晰地展示了每一步的原理但在实际项目中MindSpore提供了更简洁、更高效的高阶APIModel来封装这个过程。# 以下是伪代码展示其简洁性frommindspore.datasetimportNumpySlicesDatasetfrommindsporeimportModel# 将数据封装成MindSpore的Dataset对象datasetNumpySlicesDataset({data:x_data,label:y_data},shuffleTrue)datasetdataset.batch(32)# 使用Model API封装网络、损失函数和优化器modelModel(net,loss_fn,optimizer)# 一行代码完成训练model.train(epoch10,train_datasetdataset)我们将在后续的文章中详细介绍Dataset和Model的使用。了解这一点是为了让你知道MindSpore既提供了让你能“深入引擎舱”手动操作的底层API也提供了让你能“舒适驾驶”的高层API。5. 总结恭喜你在本文中你成功地将之前学到的所有碎片化知识组装成了一个完整的“学习引擎”并亲自见证了一个模型从“一无所知”到“习得规律”的全过程。优化器是学习过程的执行者它使用梯度和学习率来更新模型参数。一个标准的训练循环包含前向传播、计算损失、计算梯度、更新参数这四个核心步骤。至此你已经掌握了使用MindSpore进行模型训练的最小且最完整的核心理论和实践技能。从下一篇文章开始我们将走出“新手村”挑战一个更真实、更经典的任务——使用MindSpore构建一个卷积神经网络CNN来完成图像分类。