问题形容:首先已知两个数据集,x_data和y_data须要求得两个数据集之间的线性关系。(目标是失去w和b)
搞清楚整个思路,代码编写就很轻松。
1.数据集已知。
2.建设线性关系,首先建设线性模型。(class LinearModel中必须包含init和forward,init是对模型的建设包含w和b的参数,forward就是前馈函数返回y_hat)
3.construct和optimizer(构建损失函数和优化器)
4.多个epoch循环,每次求得通过模型失去y_hat,而后和y_data一减失去loss,求导之前记得把梯度置零不然梯度会累加,而后反向流传计算失去梯度d(loss)/d(w),最初用optimizer进行更新参数即可。
以上就是整个思路流程,上面是具体代码和正文:
import torch#part one 导入数据集x_data=torch.Tensor([[1.0],[2.0],[3.0]])y_data=torch.Tensor([[2.0],[4.0],[6.0]])print(x_data)#part two 建设模型#所有的模型都要继承torch.nn.moduleclass LinearModel(torch.nn.Module):#外面必须蕴含init,forward。#backward它会主动帮咱们算 def __init__(self): super(LinearModel, self).__init__() self.linear=torch.nn.Linear(1,1)#这里是在结构对象,参数是权重和偏置 def forward(self,x): y_pred=self.linear(x)#这里是因为python中的call函数,使得对象能够实例化 #称之为callable #linear是一个激活函数,激活函数就是在神经网络每层将输出映射到输入的函数, #除了linear这个激活函数,还有sigmoid等其余激活函数 return y_predmodel=LinearModel()#part 3 construct and optimizercriterion=torch.nn.MSELoss(size_average=False)optimizer=torch.optim.SGD(model.parameters(),lr=0.01)#part fourfor epoch in range(1000): y_pred=model(x_daa) loss=criterion(y_pred,y_data) print(epoch,loss) optimizer.zero_grad()#梯度置零,把loss对于weight的导数置零,(如同还缩小内存耗费,搜一下?) loss.backward()#反向流传即计算梯度,求得x.grad=d(loss)/d(x) optimizer.step()#进行更新,x=x-lr*x.gradprint('w=',model.linear.weight.item())print('b=',model.linear.bias.item())#test modelx_test=torch.Tensor([4.0])y_test=model(x_test)print("y_pred=",y_test.data)