乐趣区

关于pytorch:pytorch进行线性回归

问题形容:首先已知两个数据集,x_data 和 y_data 须要求得两个数据集之间的线性关系。(目标是失去 w 和 b)

搞清楚整个思路,代码编写就很轻松。

1. 数据集已知。
2. 建设线性关系,首先建设线性模型。(class LinearModel 中必须包含 initforward,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)
退出移动版