Pytorch学习-3

求解线性回归示例:

下面是使用PyTorch求解线性回归问题的一个简单例子。在这个例子中,我们假设有一组数据点,目标是找到一条直线,最好地拟合这些数据点。线性回归模型的形式通常为y = wx + by=wx+b,其中ww是权重,bb是偏置项。我们将使用均方误差(Mean Squared Error, MSE)作为损失函数,通过梯度下降法优化模型参数。

步骤1: 导入必要的库

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

步骤2: 创建数据集

# 真实的参数
w_true = 2.0
b_true = 0.5

# 生成随机数据
x = torch.linspace(0, 1, 100)
y = w_true * x + b_true + torch.randn(x.size()) * 0.1

# 可视化数据
plt.scatter(x.numpy(), y.numpy())
plt.show()

步骤3: 定义模型

# 线性回归模型
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)  # 输入和输出维度都是1

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

步骤4: 实例化模型、定义损失函数和优化器

model = LinearRegressionModel()
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

步骤5: 训练模型

# 训练模型
epochs = 100
for epoch in range(epochs):
    model.train()
    optimizer.zero_grad()  # 清零梯度
    # 前向传播
    y_pred = model(x.unsqueeze(1))
    # 计算损失
    loss = criterion(y_pred, y.unsqueeze(1))
    # 反向传播
    loss.backward()
    optimizer.step()
    
    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')

# 绘制拟合结果
predicted = model(x.unsqueeze(1)).detach().numpy()
plt.plot(x.numpy(), y.numpy(), 'ro', label='Original data')
plt.plot(x.numpy(), predicted, label='Fitted line')
plt.legend()
plt.show()

通过定义一个简单的线性回归模型,使用梯度下降法优化参数,来拟合生成的随机数据点。请注意,在实际使用时,可能需要根据自己的数据集调整学习率、迭代次数等超参数。

nn.module

这一实例使用了Pytorch的NN模块,以下是关于这个模块的一些介绍:

PyTorch的nn模块是构建神经网络的核心库,提供了构建深度学习模型所需的各种工具和组件。nn模块的设计哲学是提供灵活、易于使用的抽象,以便研究人员和开发人员可以快速构建和原型化新的模型。

层(Layers)

nn模块中,最基本的构建块是层(Layer),它代表了神经网络中的一个单独的层次,例如全连接层、卷积层、池化层等。PyTorch提供了丰富的层类型供选择:

  • 全连接层nn.Linear,实现了一个全连接的线性层。
  • 卷积层nn.Conv2dnn.Conv3d,实现了二维和三维的卷积操作,适用于图像和视频等数据。
  • 池化层nn.MaxPool2dnn.AvgPool2d,实现了最大池化和平均池化,用于降低特征维度和提取重要特征。
  • 归一化层nn.BatchNorm2dnn.LayerNorm,提供了批归一化和层归一化等功能,有助于加速训练过程并提高模型性能。

激活函数(Activation Functions)

激活函数是神经网络中不可或缺的部分,它为网络引入非线性,使得网络能够学习和模拟复杂的函数。nn模块提供了多种常用的激活函数:

  • ReLUnn.ReLU,非线性激活函数,将所有负值置为0。
  • Sigmoidnn.Sigmoid,将输入值压缩到0和1之间。
  • Tanhnn.Tanh,将输入值压缩到-1和1之间。
  • Softmaxnn.Softmax,常用于多分类问题的输出层,将输入值转换为概率分布。

损失函数(Loss Functions)

损失函数衡量模型输出与目标值之间的差异,是训练过程中需要最小化的关键指标。nn模块提供了多种损失函数,以适应不同类型的问题:

  • 均方误差nn.MSELoss,用于回归问题。
  • 交叉熵nn.CrossEntropyLoss,用于多分类问题。
  • 二元交叉熵nn.BCELossnn.BCEWithLogitsLoss,用于二分类问题。

容器(Containers)

容器用于封装和组织多个层,使得模型的构建更加模块化和灵活:

  • Sequentialnn.Sequential,一个简单的顺序容器,层按照顺序执行。
  • ModuleListnn.ModuleList,可以包含多个子模块的列表,但不像Sequential那样自动处理前向传播。
  • ModuleDictnn.ModuleDict,类似于ModuleList,但以字典的形式组织子模块。

自定义层与模型

虽然PyTorch提供了大量的预定义层,但在一些情况下,可能需要自定义层或整个模型以满足特定的需求。为此,可以通过继承nn.Module类并实现forward方法来自定义模块:

class CustomModel(nn.Module):
    def __init__(self):
        super(CustomModel, self).__init__()
        # 定义模型组件
        
    def forward(self, x):
        # 定义前向传播逻辑
        return x

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值