刘二大人《PyTorch深度学习实践》p5用pytorch实现线性回归

一、零碎知识点

1.torch.nn

torch.nn 是 PyTorch 中用于构建神经网络模型的模块。它是 PyTorch 的神经网络库,提供了一系列的类和函数,用于定义、组合和训练神经网络。
我的一些拙见:pytorch作为一个深度学习框架,给我们提供了一个torch工具库,里面包含nn(神经网络)、Tensor(张量)、optim(优化器)等一些列工具包,每个包里面又有不同的工具库,比如nn里面有Module、linear、MSELoss等不同功能的类。
当我们想使用linear“这个工具”时,就可以调用torch.nn.linear()
在这里插入图片描述

我们为了方便代码的书写(偷懒),可以简化为:

import torch.nn as nn

2.nn.Module

torch.nn.Module 是 PyTorch 中用于定义神经网络模型的基类。

3.nn.linear

torch.nn.Linear 是 PyTorch 中的一个线性层类,用于定义全连接层。
基本语法是:linear = nn.Linear(in_features, out_features)
in_featuresout_features,分别表示输入特征的大小和输出特征的大小。

举个栗子:假设我们要构建一个简单的线性回归模型来预测房屋价格。
在这个例子中,输入特征房屋的面积房间数量输出特征房屋的价格
例如,如果我们有100个样本,每个样本的特征由面积和房间数量组成,其中面积的维度是1(一个特征),房间数量的维度也是1(一个特征),那么输入特征的大小(in_features)可以设置为2。
同理,如果我们想要预测房屋的价格,这个预测可以看作是一个输出特征,价格可以被视为一个特征。因此,对于这个线性回归模型中,输出特征的大小(out_features)可以设置为1。

import torch
import torch.nn as nn

# 创建一个线性层,输入特征大小为 2,输出特征大小为 1
linear = nn.Linear(2, 1)

# 随机生成输入数据
x = torch.randn(100, 2)  # 100个样本,每个样本有 2 个特征

# 使用线性层进行前向传播
output = linear(x)

print(output.shape)

4.nn.MSELoss

torch.nn.MSELoss 是 PyTorch 中用于计算均方误差损失函数的类,计算结果是一个张量tensor,而不是一个标量。

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

在刘二老师的代码里,该函数使用了 size_averagereduce 这两个参数,而它们在未来的版本中已被弃用。
UserWarning: size_average and reduce args will be deprecated, please use reduction=‘sum’ instead.
warnings.warn(warning.format(ret))
在这里插入图片描述

取而代之,应该使用 reduction 参数来指定如何计算损失值。sum表示对损失值进行求和,最小化平方损失的总和,可以使模型更好地拟合训练数据

criterion = torch.nn.MSELoss(reduction='sum')

5.torch.optim.SGD

torch.optim.SGD 是 PyTorch 中的一个优化器类,用于实现随机梯度下降(Stochastic Gradient Descent,简称 SGD)算法。

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

lr为learning rate学习率,相当于之前章节的α
在这里插入图片描述

二、课程代码

1.思路流程

  1. 准备数据
  2. 设计模型
  3. 构造损失函数和优化器
  4. 写训练循环(前馈->反馈->更新->…)

2.代码

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)

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


model = LinearModel()

criterion = torch.nn.MSELoss(reduction='sum') # 我起初敲老师的代码时报错了,年代太久了,版本更新了
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # lr为learning rate学习率

for epoch in range(100):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

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)

在这里插入图片描述

三、课后小练习

不同的优化器,会对结果产生不同的影响。
在这里插入图片描述
我选择了Adam优化器,并且迭代了500次,才和SGD优化器的效果相似,迭代100次时的预测值是2.3,误差太大了。
在这里插入图片描述
在这里插入图片描述

所以难怪说学python就是疯狂调库,我怎么感觉深度学习的尽头是英语(bushi),我最开始都不知道torch.nn的这个nn是什么,原来是neural network的简称,这水平谁能想到我已经是研究生了,宇宙的尽头是自学,宇宙的尽头是考公。
我准备把刘二老师的学完之后,去学习霹雳吧啦Wz的图像分类实训,这些都是后话了,坚持坚持!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

失舵之舟-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值