Pytorch实现线性回归

准备数据集

X,Y都是矩阵形式,计算时注意广播机制

设计模型

关键是构造计算图以此实现对参数的自动求导

将模型封装成一个类并继承自Module模块,此类必须实现两个方法__init__()和forward(),而对于反向传播方法不需要具体实现,会由Module模块自动实现,如果有更高效的反向传播方法实现可以重写Functions方法

class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1,1)

    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred

model = LinearModel()

构造损失函数和优化器

本实例采用均方损失函数:参数size_average = True 表示求各个损失的均值;设置为False则表示求各个损失的和

# 损失函数
criterion = torch.nn.MSELoss(size_average=True)

训练模型

注意:loss此时是一个Tensor,如果要打印loss值,则需要print(loss.item()),取出tensor里面的值,同理,打印此时的权重和偏置也是如此。

for epoch in range(1000):
    # 前向传播
    y_pred = model(x_data)
    # 计算损失
    loss = criterion(y_data, y_pred)
    # print("type(loss):{}".format(type(loss)))
    # print("type(loss.item()):{}".format(type(loss.item())))
    print(loss.item())

    optimizer.zero_grad() #梯度清零
    # 反向传播
    loss.backward()
    # 更新梯度
    optimizer.step()
    # 打印权重和偏置
    print(model.linear.weight.item())
    print(model.linear.bias.item())

整体代码

import torch
# 构造数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0],[6.0]])

# 构建模型
class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__() # 父类的初始化
        self.linear = torch.nn.Linear(1,1) # 创建了一个Linear对象
    
    def forward(self, x):
        y_pred = self.linear(x)  # 可调用的对象,实际上调用的linear类中的__call__() 方法 
        return y_pred

model = LinearModel()
# 损失函数
criterion = torch.nn.MSELoss(size_average=True)
# 优化器,随机梯度下降算法,学习率为0.01
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)

# 训练
for epoch in range(1000):
    # 前向传播
    y_pred = model(x_data)
    # 计算损失
    loss = criterion(y_data, y_pred)
  
    optimizer.zero_grad() #梯度清零
    # 反向传播
    loss.backward()
    # 更新梯度
    optimizer.step()
    # 打印损失、权重和偏置
    print(loss.item())
    print(model.linear.weight.item())
    print(model.linear.bias.item())

你可能感兴趣的:(pytorch,线性回归,机器学习)