【小白学习PyTorch教程】四、基于nn.Module类实现线性回归模型

「@Author:Runsen」

上次介绍了顺序模型,但是在大多数情况下,我们基本都是以类的形式实现神经网络。

大多数情况下创建一个继承自 Pytorch 中的 nn.Module 的类,这样可以使用 Pytorch 提供的许多高级 API,而无需自己实现。

下面展示了一个可以从nn.Module创建的最简单的神经网络类的示例。基于 nn.Module的类的最低要求是覆盖__init__()方法和forward()方法。

在这个类中,定义了一个简单的线性网络,具有两个输入和一个输出,并使用 Sigmoid()函数作为网络的激活函数。

import torch
from torch import nn

class LinearRegression(nn.Module):
    def __init__(self):
        #继承父类构造函数
        super(LinearRegression, self).__init__() 
        #输入和输出的维度都是1
        self.linear = nn.Linear(1, 1) 
    def forward(self, x):
        out = self.linear(x)
        return out
                    

现在让我们测试一下模型。

# 创建LinearRegression()的实例
model = LinearRegression()
print(model) 
# 输出如下
LinearRegression(
  (linear): Linear(in_features=1, out_features=1, bias=True)
)

现在让定义一个损失函数和优化函数。

model = LinearRegression()#实例化对象
num_epochs = 1000#迭代次数
learning_rate = 1e-2#学习率0.01
Loss = torch.nn.MSELoss()#损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)#优化函数

我们创建一个由方程 产生的数据集,并通过 函数制造噪音

import torch 
from matplotlib import pyplot as plt
from torch.autograd import Variable
from torch import nn
# 创建数据集  unsqueeze 相当于
x = Variable(torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1))
y = Variable(x * 2 + 0.2 + torch.rand(x.size()))
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()

关于torch.unsqueeze函数解读。

>>> x = torch.tensor([1, 2, 3, 4])
>>> torch.unsqueeze(x, 0)
tensor([[ 1,  2,  3,  4]])
>>> torch.unsqueeze(x, 1)
tensor([[ 1],
        [ 2],
        [ 3],
        [ 4]])

遍历每次epoch,计算出loss,反向传播计算梯度,不断的更新梯度,使用梯度下降进行优化。

for epoch in range(num_epochs):
    # 预测
    y_pred= model(x)
    # 计算loss
    loss = Loss(y_pred, y)
    #清空上一步参数值
    optimizer.zero_grad()
    #反向传播
    loss.backward()
    #更新参数
    optimizer.step()
    if epoch % 200 == 0:
        print("[{}/{}] loss:{:.4f}".format(epoch+1, num_epochs, loss))

plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), y_pred.data.numpy(), 'r-',lw=5)
plt.text(0.5, 0,'Loss=%.4f' % loss.data.item(), fontdict={'size': 20, 'color':  'red'})
plt.show()
####结果如下####
[1/1000] loss:4.2052
[201/1000] loss:0.2690
[401/1000] loss:0.0925
[601/1000] loss:0.0810
[801/1000] loss:0.0802
[w, b] = model.parameters()
print(w,b)
# Parameter containing:
tensor([[2.0036]], requires_grad=True) Parameter containing:
tensor([0.7006], requires_grad=True)

这里的b=0.7,等于0.2 + torch.rand(x.size()),经过大量的训练torch.rand()一般约等于0.5。


往期精彩回顾



适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑黄海广老师《机器学习课程》课件合集
本站qq群851320808,加入微信群请扫码:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您演示如何使用 PyTorch 中的 nn.Module 实现一个多元分的逻辑回归模型。与二元分不同,多元分需要使用 Softmax 函数将输出值转化为各个别的概率分布。 以下是一个简单的多元分逻辑回归模型的示例代码: ```python import torch import torch.nn as nn class MultinomialLogisticRegression(nn.Module): def __init__(self, input_size, num_classes): super(MultinomialLogisticRegression, self).__init__() self.linear = nn.Linear(input_size, num_classes) def forward(self, x): out = self.linear(x) out = nn.functional.softmax(out, dim=1) return out ``` 上述代码中,我们定义了一个继承自 nn.Module MultinomialLogisticRegression,并在其中实现了构造函数和前向传播函数。构造函数中,我们定义了一个线性层(nn.Linear)作为模型的主要计算模块,并将输出大小设置为 num_classes,表示有多少个分。在前向传播函数中,我们首先将输入数据 x 传入线性层进行计算,然后通过 softmax 函数将结果转化为各个别的概率分布,最终输出分结果。 最后,我们可以通过以下代码使用该模型对数据进行分: ```python # 定义模型 model = MultinomialLogisticRegression(input_size=2, num_classes=3) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 训练模型 for epoch in range(num_epochs): # 前向传播 outputs = model(inputs) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 打印日志 if (epoch+1) % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 测试模型 with torch.no_grad(): predicted = torch.argmax(model(inputs), dim=1) accuracy = (predicted == labels).sum().item() / len(labels) print('Accuracy: {:.2f}%'.format(accuracy * 100)) ``` 其中,我们首先定义了一个输入大小为 2,输出大小为 3 的多元分逻辑回归模型,并使用交叉熵损失函数(nn.CrossEntropyLoss)和随机梯度下降优化器(torch.optim.SGD)进行训练。训练完成后,我们使用该模型对数据进行测试,并计算分精度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值