pytorch深度学习(6)用pytorch实现线性回归

目录

一、Pytorch Fashion 

 二、Linear Regression

1.prepare dataset(准备数据集)

代码实现:

 2.Design Model(设计模型)

代码实现:

3.Construct Loss and Optimizer(构造损失函数和优化器)

损失函数:

优化器:

代码实现:

4.Training Cycle(训练周期)

 代码实现:

5.Test Model(测试模型)

代码实现:

总结

 完整的代码:

训练100次得到的结果:

 训练1000次得到的结果:


一、Pytorch Fashion 

pytorch框架下的深度学习流程主要为以下四步:

1.准备数据集

2.设计模型

3.构造函数和优化器

4.训练周期

 二、Linear Regression


1.prepare dataset(准备数据集)

   在这个数据集要使用mini-batch的风格,因为只有3个数据,所以都放进去。模型是y=w*x+b。

 与前面不同的是,我们构建数据集时,x_data与y_data采用了torch.Tensor ;

  注意:  X和Y都是矩阵

代码实现:

import torch
 

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

 2.Design Model(设计模型)

之前我们都是人工进行求导,但现在我们的重点在于利用张量之间的计算去构造计算图。

Linear unit(线性单元):把 z = w * x + b 称为线性单元·

在进行构造时,我们需要知道 x 的维度y_hat 的维度 来确定 权重 w 的数量

然后将y_hat放入我们的损失函数中 计算损失(Loss)

最后,我们就可以对 Loss 调用 backward ,对整个函数进行反向传播

注意:权重w可以是向量,但是损失loss最后必须是标量,所以我们要对所有loss进行求和。

代码实现:

( 我们的模型类继承于nn.Module )

 

 注意:(1)y_pred = self.linear(x),在对象后面加括号实现一个可调用对象

(2)在Module类的__call__()就是调用forward()

(3)python里的Functions也是一个类。

import torch.nn

# 将模型定义成一个类


class LinearModel(torch.nn.Module):    # 继承nn.Module
    def __init__(self):                # 构造函数
        super(LinearModel, self).__init__()     # 调用父类的构造
        self.linear = torch.nn.Linear(1, 1)     # 构造对象
# torch,nn是pytorch里的一个类,包含两个成员张量:weight和bias
# Linear类也是继承自Module,可以自动进行反向传播
    
    def forward(self, x):           # 前馈时的计算
        y_pred = self.linear(x)     # 对象后面加括号-实现了一个__call__(),可调用的对象
        return y_pred


# 创建一个LinearModel实例
model - LinearModel()        # 这个model是可调用的

3.Construct Loss and Optimizer(构造损失函数和优化器)

损失函数:

torch.nn.MSELoss同样继承于nn.Module类

torch.nn.MSELoss的参数有size_average(是否求均值), reduce(是否求和,降维)

优化器:

代码实现:


criterion = torch.nn.MSELoss(size_average=False)
 
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) 

4.Training Cycle(训练周期)

 

 代码实现:

for epoch in range(100):
 
    y_pred = model(x_data)        # forward:预测
 
    loss = criterion(y_pred, y_data)     # forward:loss
 
    print(epoch, loss)   # 打印loss时会自动调用__str__()函数,不会产生计算图,这是安全的
    
 
    optimizer.zero_grad()        # 注意.backward()时梯度会被累计,权重清零
 
    loss.backward()           # 反向传播:autograd
 
    optimizer.step()

训练过程完成了forward,backward和update。

5.Test Model(测试模型)

到100次迭代时,w和b没有到达最理想值,说明训练还没收敛。进行1000次迭代,效果更好。

代码实现:

#输出w和b
 
print('w = ', model.linear.weight.item())  #打印时选item,不然w是一个矩阵
 
print('b = ', model.linear.bias.item())
 
 
# 测试模型test model
x_test = torch.Tensor([[4.0]])  #输入1*1矩阵
 
y_test = model(x_test)   #输出1*1矩阵
 
print('y_pred = ', y_test.data)

总结

 完整的代码:

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):    # 继承nn.Module
    def __init__(self):                # 构造函数
        super(LinearModel, self).__init__()     # 调用父类的构造
        self.linear = torch.nn.Linear(1, 1)     # 构造对象
# torch,nn是pytorch里的一个类,包含两个成员张量:weight和bias
# Linear类也是继承自Module,可以自动进行反向传播

    def forward(self, x):           # 前馈时的计算
        y_pred = self.linear(x)     # 对象后面加括号-实现了一个__call__(),可调用的对象
        return y_pred


# 创建一个LinearModel实例
model = LinearModel()        # 这个model是可调用的

criterion = torch.nn.MSELoss(size_average=False)

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

for epoch in range(1000):
    y_pred = model(x_data)  # forward:预测

    loss = criterion(y_pred, y_data)  # forward:loss

    print(epoch, loss)  # 打印loss时会自动调用__str__()函数,不会产生计算图,这是安全的

    optimizer.zero_grad()  # 注意.backward()时梯度会被累计,权重清零

    loss.backward()  # 反向传播:autograd

    optimizer.step()

# 输出w和b

print('w = ', model.linear.weight.item())  # 打印时选item,不然w是一个矩阵

print('b = ', model.linear.bias.item())

# 测试模型test model
x_test = torch.Tensor([[4.0]])  # 输入1*1矩阵

y_test = model(x_test)  # 输出1*1矩阵

print('y_pred = ', y_test.data)

训练100次得到的结果:

 训练1000次得到的结果:

 可见,训练1000次的效果更接近于我们所要获得的数据。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyTorch是一个广泛应用于机器学习的深度学习框架,而线性回归是机器学习中的一种基本型。在线性回归中,我们使用数理统计中的回归分析来确定两种或两种以上变量之间的定量关系。具体来说,在PyTorch实现线性回归可以使用nn.Linear类,在这个类中定义了全连接层。通过传递参数到nn.Linear中,我们可以指定输入特征的形状和输出特征的形状。例如,通过使用nn.Sequential(nn.Linear(2, 1)),我们可以定义一个具有输入特征形状为2,输出特征形状为1的线性回归型。接下来,我们可以使用损失函数来衡量预测值与真实值之间的差距,常用的损失函数有均方差损失函数和平均绝对误差损失函数等。然后,我们可以使用优化算法(如梯度下降)来更新型参数,以最小化损失函数并提高型的预测性能。这样就可以完成PyTorch中的线性回归机器学习任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基础线性回归PyTorch实现 PyTorch框架入门案例](https://download.csdn.net/download/didi_ya/37378255)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Pytorch实现机器学习之线性回归](https://blog.csdn.net/rothschild666/article/details/123387737)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Pytorch 线性回归](https://blog.csdn.net/qq_39906884/article/details/124141176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rise9z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值