深度学习:用pytorch实现回归模型

目录

参考视频:《PyTorch深度学习实践》05.用PyTorch实现线性回归_哔哩哔哩_bilibili

用pytorch实现线性模型

步骤:

1.准备数据集

2.设计模型(构造计算图)

3.构建损失函数和优化器

4.训练周期:前馈算损失,反馈算梯度,用梯度下降算法更新权重

可调用对象

用pytorch实现

1.导入相应的库

2.准备数据集

3.设置学习模型

4.构造损失函数和优化器

5.模型训练

6.画出损失函数与训练轮次的图

课后练习


用pytorch实现线性模型

学习模型

损失函数

随机梯度下降(sgd)

步骤:

1.准备数据集

2.设计模型(构造计算图)

  • 需要根据x和z的维度,确定权重w和偏置量b的维度。loss是一个标量,如果是向量的话就不能使用backward了。

  • 行表示样本,列表示feature维度

3.构建损失函数和优化器

  • 第一个参数为求均值,第二个参数是否降维。

  • params权重,lr是学习率,一般设计一个固定的值。momentum是冲量

4.训练周期:前馈算损失,反馈算梯度,用梯度下降算法更新权重

  • 1.前馈forward:分为两步:1.求y-hat 2.求loss

  • 2.反馈backward,在反向之前首先要置0

  • 3.更新

广播机制==自动扩展矩阵维数

可调用对象

如果要使用一个可调用对象,那么在类的声明的时候要定义一个call函数。*args是可变变量

class Foobar:
    def __init__(self):
        pass
    def __call__(self,*args,**kwargs):
        pass
def func(*args,**kwargs):
    print(args)  #输出元组,然后可以取各个元素进行遍历。
    print(kwargs)  #输出词典
func(1, 2, 4, 3, x=3, y=5)
 

输出为:

(1, 2, 4, 3)
{'x': 3, 'y': 5}

调用对象实现实例化

class Foobar:
    def __init__(self):
        pass
    def __call__(self,*args,**kwargs):
        print("Hello"+str(args[0]))
foobar = Foobar()  #实例化
foobar(1,2,3) 

用pytorch实现

1.导入相应的库

import torch
import numpy as np
import matplotlib.pyplot as plt

2.准备数据集

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])

3.设置学习模型

class LinearModel(torch.nn.Module):  #nn是神经网络
    def __init__(self):
        super(LinearModel, self).__init__() #super第一个参数是类名,后面调用父类的init()
        self.linear = torch.nn.Linear(1,1)  #Linear是pytorch的一个类,构造一个对象,Linear包括权重和偏置,Linear也是继承nn.Module的,可以实现反向传播
    def forward(self, x):
        y_pred = self.linear(x)  #实现了一个可调用的对象,linear内做w*x+b
        return y_pred
model = LinearModel()   #实例化,这个model是callable的,是可以被调用,求出y-hat

4.构造损失函数和优化器

criterion = torch.nn.MSELoss(size_average=False)
#model.parameters()会扫描module中的所有成员,如果成员中有相应权重,那么都会将结果加到要训练的参数集合上
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

5.模型训练

# 定义空集合
epoch_list = []
loss_list = []
​
for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    
    # 放到循环后面给空集添加元素
    epoch_list.append(epoch)
    loss_list.append(loss.item())
    
    print(epoch, loss.item())
    
    optimizer.zero_grad()  #梯度归零
    loss.backward()  #反馈,计算梯度
    optimizer.step()  #根据梯度和预先设置的学习率进行更新w和b的值
​
print('w = ',model.linear.weight.item()) #打印数值用item
print('b = ',model.linear.bias.item())
​
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred = ',y_test.data)

6.画出损失函数与训练轮次的图

# 画图
plt.plot(epoch_list, loss_list)
​
# 设置x坐标,y坐标名称,以及这个图像的标题
plt.xlabel('times')
plt.ylabel('loss')
plt.title('SGD')
​
# 显示图像
plt.show()

结果为

课后练习

利用如下优化器来实现线性回归

注:LBFGS出错

完整代码为:

# 导入相应的库
import torch
import numpy as np
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是神经网络
    def __init__(self):
        super(LinearModel, self).__init__() #super第一个参数是类名,后面调用父类的init()
        self.linear = torch.nn.Linear(1,1)  #Linear是pytorch的一个类,构造一个对象,Linear包括权重和偏置,Linear也是继承nn.Module的,可以实现反向传播
    def forward(self, x):
        y_pred = self.linear(x)  #实现了一个可调用的对象,linear内做w*x+b
        return y_pred
model = LinearModel()   #实例化,这个model是callable的,是可以被调用,求出y-hat
# 构造损失函数和优化器
criterion = torch.nn.MSELoss(size_average=False)
#model.parameters()会扫描module中的所有成员,如果成员中有相应权重,那么都会将结果加到要训练的参数集合上
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
#optimizer = torch.optim.Adagrad(model.parameters(), lr=0.01)
#optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
#optimizer = torch.optim.Adamax(model.parameters(), lr=0.01)
#optimizer = torch.optim.ASGD(model.parameters(), lr=0.01)
#optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)
#optimizer = torch.optim.Rprop(model.parameters(), lr=0.01)
# 模型训练
# 定义空集合
epoch_list = []
loss_list = []
​
for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    
    # 放到循环后面给空集添加元素
    epoch_list.append(epoch)
    loss_list.append(loss.item())
    
    print(epoch, loss.item())
    
    optimizer.zero_grad()  #梯度归零
    loss.backward()  #反馈,计算梯度
    optimizer.step()  #根据梯度和预先设置的学习率进行更新w和b的值
​
print('w = ',model.linear.weight.item()) #打印数值用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)
​
# 设置x坐标,y坐标名称,以及这个图像的标题
plt.xlabel('times')
plt.ylabel('loss')
#plt.title('SGD')
#plt.title('Adagrad')
#plt.title('Adam')
#plt.title('Adamax')
#plt.title('ASGD')
#plt.title('RMSprop')
#plt.title('Rprop')
​
​
# 显示图像
plt.show()

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自律的光电人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值