尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【刘二老师】PyTorch深度学习代码详细分析【05用pythorch实现线性回归】篇

【刘二老师】PyTorch深度学习代码详细分析【05用pythorch实现线性回归】篇 【刘二老师】PyTorch深度学习代码详细分析【用pythorch实现线性回归】篇一、全部代码展示importtorch x_datatorch.Tensor([[1.0],[2.0],[3.0]])y_datatorch.Tensor([[2.0],[4.0],[6.0]])classLinearModel(torch.nn.Module):def__init__(self):super(LinearModel,self).__init__()self.lineartorch.nn.Linear(1,1)defforward(self,x):y_predself.linear(x)returny_pred modelLinearModel()criteriontorch.nn.MSELoss(size_averageFalse)optimizertorch.optim.SGD(model.parameters(),lr0.01)forepochinrange(1000):y_predmodel(x_data)losscriterion(y_pred,y_data)print(epoch,loss.item())optimizer.zero_grad()loss.backward()optimizer.step()print(w ,model.linear.weight.item())print(b ,model.linear.bias.item())x_testtorch.Tensor([[4.0]])y_testmodel(x_test)print(y_pred ,y_test.data)二、每行代码逐句解析一importtorch导入PyTorch深度学习框架该框架有张量、神经网络、自动求导、优化器全套功能。二x_datatorch.Tensor([[1.0],[2.0],[3.0]])y_datatorch.Tensor([[2.0],[4.0],[6.0]])torch.Tensor()创建pytorch浮点张量也是一个可参与求导的数组要不然无法运行。[ [1.0], [2.0], [3.0] ]外层括号就是外面的大括号内层括号就是里面的一个一个小括号。外层括号体现batch批次维度也就是样本数。显然外层括号中包括三个元素所以样本数为3。内层括号体现每一个样本的特征维度小括号中只有一个数字所以特征维度是1。由于我们要的是ywxb这里只写了一个x而不是x1x2x3…因此特征维度必须为1。总体来说这两行代码表示创建了一个[batch1]的二维张量。这里面的二维第一维是batch_size批次大小第二维是特征维度总之两行数据中也可以看出是y2x一个过原点的直线。三classLinearModel(torch.nn.Module):def__init__(self):super(LinearModel,self).__init__()self.lineartorch.nn.Linear(1,1)class LinearModel (torch.nn.Module) :类LinearModel继承自父类 torch.nn.Module。所有 PyTorch 自定义网络必须继承nn.Module父类父类内置参数管理、自动注册、设备迁移、保存加载等功能。def _init_(self):经典初始化函数魔法方法initsuper(LinearModel, self)._init_()比较老旧的写法现在一般写为super()._init_()该代码表示调用父类的构造函数继承父类属性初始化模块否则网络无法追踪参数无法优化。self.linear torch.nn.Linear(1, 1)该行代码整体来看就是一个类内设置属性属性名是linear属性值是torch.nn.Linear(1,1)。nn.Linear(in_features1, out_features1)这里的in_features是输入维度1out_features是输出维度1代表输入一个数值输出一个数值就是ywxb。这个层内部自带两个可训练参数权重w、偏置b会被父类 Module 自动追踪优化器才能更新它们。四defforward(self,x):y_predself.linear(x)returny_preddef forward(self, x):forward是固定函数名不能改名调用model(x)时底层自动执行forward(x)x是一个形参代表输入数据张量。训练时传入x_data推理时传入测试x_test。y_pred self.linear(x)self.linear(x)就是调用之前那个保存好的self.linear torch.nn.Linear(1, 1)层做计算也就是把输入x扔进线性层计算得到预测值y_pred w*x b。return y_pred把计算出的预测结果返回出去。五modelLinearModel()就是一个类的实例化创建了一个对象变量model。六criteriontorch.nn.MSELoss(size_averageFalse)#现在一般写为criterion torch.nn.MSELoss(reductionsum)optimizertorch.optim.SGD(model.parameters(),lr0.01)两行赋值代码torch.nn.MSELoss(size_averageFalse)求的是MSE及均方误差。size_averageFalse旧版写法代表不除以样本数量只求和但现在新版本推荐用reduction‘sum’。作用衡量预测值和真实标签差距差距越大 loss 越大optimizer torch.optim.SGD(model.parameters(), lr0.01)SGD随机梯度下降最基础梯度下降优化算法model.parameters()拿到模型里所有需要更新的参数也就是w和blr0.01learning rate 学习率控制每次参数更新步长。太大震荡不收敛太小训练极慢。七forepochinrange(1000):#1000次迭代# 1. 前向传播计算预测值y_predmodel(x_data)#model函数就是向前传播的作用这里输入的是x_data得出模型的预测值# 2. 计算损失losscriterion(y_pred,y_data)#用上面得出的预测值与我们给出的y_data计算损失值。print(epoch,loss.item())#打印出次数和loss方便我们观察。# 3. 反向传播参数更新 固定三步optimizer.zero_grad()# 梯度清零loss.backward()# 自动反向求导计算w、b梯度optimizer.step()# 优化器根据梯度更新w、bloss.item()把张量格式的 loss 转成普通浮点数打印loss criterion(预测, 真实标签)optimizer.zero_grad() # 梯度清零PyTorch 梯度会累加每一轮必须先清空上一轮梯度否则梯度叠加出错loss.backward()反向求导函数自动微分引擎自动链式求导算出∂loss/∂w、∂loss/∂b存在参数的.grad属性里optimizer.step()优化器根据梯度更新w、bSGD 按照 w w - lr * grad、b b - lr * grad 更新权重。八print(w ,model.linear.weight.item())print(b ,model.linear.bias.item())model.linear.weight线性层权重 w。model.linear.bias偏置项 bwb是一维张量.item()取出里面单个数值。九x_testtorch.Tensor([[4.0]])y_testmodel(x_test)print(y_pred ,y_test.data)输入测试点x4按照拟合直线y2x理论输出应该是 8。model(x_test)推理阶段前向传播不计算梯度、不更新参数。y_test.data取出预测张量数值最终输出近似tensor([[8.]])。三、整体逻辑导入库→构造训练数据集→定义线性回归模型类→定义损失函数 优化器→1000 轮训练主循环→打印训练完成后的拟合参数→测试新数据
返回列表