当前位置: 首页 > 科技观察

基于nn.Module类实现线性回归模型

时间:2023-03-14 20:57:48 科技观察

上次介绍了顺序模型,但是大多数情况下,我们基本上都是以类的形式来实现神经网络。大多数情况下,在Pytorch中创建一个继承自nn.Module的类,这样就可以使用Pytorch提供的许多高级API而无需自己实现。下面显示了可以从nn.Module创建的最简单神经网络类的示例。基于nn.Module的类的最低要求是覆盖__init__()方法和forward()方法。在这个类中,定义了一个具有两个输入和一个输出的简单线性网络,并使用Sigmoid()函数作为网络的激活函数。importtorchfromtorchimportnnclassLinearRegression(nn.Module):def__init__(self):#继承父类构造函数super(LinearRegression,self).__init__()#输入输出维度均为1self.linear=nn.Linear(1,1)defforward(self,x):out=self.linear(x)returnout现在让我们测试模型。#创建一个LinearRegression()实例model=LinearRegression()print(model)#输出如下LinearRegression((linear):Linear(in_features=1,out_features=1,bias=True))现在我们定义一个损失函数和优化功能。model=LinearRegression()#实例化对象num_epochs=1000#迭代次数learning_rate=1e-2#学习率0.01Loss=torch.nn.MSELoss()#损失函数optimizer=torch.optim.SGD(model.parameters(),lr=learning_rate)#优化函数我们创建一个方程生成的数据集,通过函数importtorchfrommatplotlibimportpyplotaspltfromtorch.autogradimportVariablefromtorchiimportnn#创建数据集unsqueeze相当于x=Variable(torch.unsqueeze(torch.linspace(-1),1,100),dim=1))y=Variable(x*2+0.2+torch.rand(x.size()))plt.scatter(x.data.numpy(),y.data.numpy())plt.show()解释torch.unsqueeze函数。>>>x=torch.tensor([1,2,3,4])>>>torch.unsqueeze(x,0)tensor([[1,2,3,4]])>>>torch.unsqueeze(x,1)tensor([[1],[2],[3],[4]])遍历每个epoch,计算loss,反向传播计算梯度,不断更新梯度,利用梯度下降进行优化.forepochinrange(num_epochs):#预测y_pred=model(x)#计算lossloss=Loss(y_pred,y)#清空上一步参数值optimizer.zero_grad()#反向传播loss.backward()#更新参数optimizer.step()ifepoch%200==0:print("[{}/{}]loss:{:.4f}".format(epoch+1,num_epochs,loss))plt.scatter(x.data.numpy(),y.data.numpy())plt.plot(x.data.numpy(),y_pred.data.numpy(),'r-',lw=5)plt.text(0.5,0,'Loss=%.4f'%loss.data.item(),fontdict={'size':20,'color':'red'})plt.show()####结果如下####[1/1000]loss:4.2052[201/1000]loss:0.2690[401/1000]loss:0.0925[601/1000]loss:0.0810[801/1000]loss:0.0802[w,b]=model.parameters()print(w,b)#Parametercontaining:tensor([[2.0036]],requires_grad=True)Parametercontaining:tensor([0.7006],requires_grad=True)其中b=0.7等于0.2+torch.rand(x.size()),经过大量训练torch.rand()一般约等于0.5。