问题描述:首先已知两个数据集,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.module
class 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_pred
model=LinearModel()
#part 3 construct and optimizer
criterion=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
#part four
for 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.grad
print('w=',model.linear.weight.item())
print('b=',model.linear.bias.item())
#test model
x_test=torch.Tensor([4.0])
y_test=model(x_test)
print("y_pred=",y_test.data)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。