Pytorch如何实现逻辑回归分类

发布时间:2022-07-30 14:25:16 作者:iii
来源:亿速云 阅读:118

本文小编为大家详细介绍“Pytorch如何实现逻辑回归分类”,内容详细,步骤清晰,细节处理妥当,希望这篇“Pytorch如何实现逻辑回归分类”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1、代码实现

步骤:

1.获得数据
2.建立逻辑回归模型
3.定义损失函数
4.计算损失函数
5.求解梯度
6.梯度更新
7.预测测试集

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from torch.autograd import Variable
import torchvision.datasets as dataset
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

input_size = 784  # 输入到逻辑回归模型中的输入大小
num_classes = 10  # 分类的类别个数
num_epochs = 10  # 迭代次数
batch_size = 50  # 批量训练个数
learning_rate = 0.01  # 学习率


# 下载训练数据和测试数据
train_dataset = dataset.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dataset.MNIST(root='./data',train=False, transform=transforms.ToTensor)

# 使用DataLoader形成批处理文件
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

# 创建逻辑回归类模型  (sigmoid(wx+b))
class LogisticRegression(nn.Module):
    def __init__(self,input_size,num_classes):
        super(LogisticRegression,self).__init__()
        self.linear = nn.Linear(input_size,num_classes)
        self.sigmoid = nn.Sigmoid()

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

# 设定模型参数
model = LogisticRegression(input_size, num_classes)
# 定义损失函数,分类任务,使用交叉熵
criterion = nn.CrossEntropyLoss()
# 优化算法,随机梯度下降,lr为学习率,获得模型需要更新的参数值
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)


# 使用训练数据训练模型
for epoch in range(num_epochs):
    # 批量数据进行模型训练
    for i, (images, labels) in enumerate(train_loader):
        # 需要将数据转换为张量Variable
        images = Variable(images.view(-1, 28*28))
        labels = Variable(labels)
        
        # 梯度更新前需要进行梯度清零
        optimizer.zero_grad()

        # 获得模型的训练数据结果
        outputs = model(images)
        
        # 计算损失函数用于计算梯度
        loss = criterion(outputs, labels)

        # 计算梯度
        loss.backward()
    
        # 进行梯度更新
        optimizer.step()

        # 每隔一段时间输出一个训练结果
        if (i+1) % 100 == 0:
            print('Epoch:[%d %d], Step:[%d/%d], Loss: %.4f' % (epoch+1,num_epochs,i+1,len(train_dataset)//batch_size,loss.item()))

# 训练好的模型预测测试数据集
correct = 0
total = 0
for images, labels in test_loader:
    images = Variable(images.view(-1, 28*28))  # 形式为(batch_size,28*28)
    outputs = model(images)
    _,predicts = torch.max(outputs.data,1)  # _输出的是最大概率的值,predicts输出的是最大概率值所在位置,max()函数中的1表示维度,意思是计算某一行的最大值
    total += labels.size(0)
    correct += (predicts==labels).sum()

print('Accuracy of the model on the 10000 test images: %d %%' % (100 * correct / total))

2、踩过的坑

1.在代码中下载训练数据和测试数据的时候,两段代码是有区别的:

train_dataset = dataset.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dataset.MNIST(root='./data',train=False, transform=transforms.ToTensor)

第一段代码中多了一个download=True,这个的作用是,如果为True,则从Internet下载数据集并将其存放在根目录中。如果数据已经下载,则不会再次下载。

在第二段代码中没有加download=True,加了的话在使用测试数据进行预测的时候会报错。

代码中transform=transforms.ToTensor()的作用是将PIL图像转换为Tensor,同时已经进行归一化处理。

2.代码中设置损失函数:

criterion = nn.CrossEntropyLoss()
loss = criterion(outputs, labels)

一开始的时候直接使用:

loss = nn.CrossEntropyLoss()
loss = loss(outputs, labels)

这样也会报错,因此需要将loss改为criterion。

读到这里,这篇“Pytorch如何实现逻辑回归分类”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. Python利用逻辑回归分类实现模板
  2. PyTorch线性回归和逻辑回归实战示例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

pytorch

上一篇:pytorch如何使用nn.Moudle实现逻辑回归

下一篇:Java lambda表达式与泛型应用实例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》