PyTorch构建线性模型

1 步骤

  1. 准备数据集
  2. 设计模型 构造计算图 继承自nn.Module
  3. 构造损失函数和训练器 使用pytorch接口
  4. 训练循环 前馈算损失,反馈算梯度,更新权值

2 代码

import torch
import matplotlib.pyplot as plt

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): #继承自nn.Module
    #__init__,forward这两个函数必须实现
    def __init__(self):
        super(LinearModel,self).__init__()
        #nn.Linear类包含两个成员张量weight和bias
        self.linear=torch.nn.Linear(1,1)    #构造对象(也继承自nn.Module)
        #输入特征数为1,输出特征数为1

    def forward(self,x):
        #nn.Linear类实现了__call__(),使得该类实例可以像函数一样调用
        #通常情况下forward()将被调用
        y_pred=self.linear(x)   #这是一个可调用对象callable
        return y_pred

#创建一个LinearModel类实例
model=LinearModel()

#size_average=False表示不求均值,求不求均值对结果无影响
criterion=torch.nn.MSELoss(size_average=False)  #构造对象,也继承自nn.Module
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
#第一个参数是取得模型中的全部参数(可以嵌套调用),lr表示学习率

epoch_list=[]
loss_list=[]

for epoch in range(1000):
    y_pred=model(x_data)    #前馈预测
    loss=criterion(y_pred,y_data)   #前馈损失
    #loss是一个对象,自动调用__str__函数
    print(epoch,'loss=',loss.item())

    epoch_list.append(epoch)
    loss_list.append(loss.item())

    optimizer.zero_grad()   #求导前需要将所有权重设置为0
    loss.backward() #自动求导,loss必须是标量,不然不能backward
    optimizer.step()    #更新

#输出weight和bias,如果不加item(),那么它是一个矩阵
print('w=',model.linear.weight.item())
print('b=',model.linear.bias.item())

#测试模型
x_test=torch.Tensor([[4.0]])
y_test=model(x_test)
print('y_pred=',y_test.data)

plt.plot(epoch_list,loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

3 比较不同优化器的结果

3.1 SGD

 

3.2 Adam

3.3 Adagrad

3.4 RMSprop

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值