PyTorch逻辑回归(分类问题)的代码模板

逻辑回归适用于对一件事情分类,比如分类新闻类型等等

具体的代码如下,注释已经写的很详细,这里的代码是对图像一个像素一个像素地判断它是一个什么类型图像,如果你不是这种类型,那么主要模型LogisticRegression 也是不变的,输入数据修改一下即可

MNIST 数据集包含手写的数字(从0到9),也就是说这里代码判断图片是0-9

import torch  # 导入 PyTorch 库,提供了多种深度学习的模块和类
import torch.nn as nn  # 导入 PyTorch 的神经网络模块
import torchvision.datasets as dsets  # 导入 torchvision 库的数据集模块
import torchvision.transforms as transforms  # 导入 torchvision 库的转换模块
from torch.autograd import Variable  # 导入 PyTorch 的自动梯度模块

input_size = 784  # 图像大小为 28x28,所以输入大小为 784
num_classes = 10  # 分类任务类别数量,因为 MNIST 是数字 0-9,所以类别数为 10
num_epochs = 10  # 训练轮数
batch_size = 50  # 批训练的数据个数
learning_rate = 0.001  # 学习率

# 加载 MNIST 数据集,root 为数据集的存储位置,transform 定义了数据预处理的方式,download 判断如果数据集不存在是否需要下载
train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)  
test_dataset = dsets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

# 使用 DataLoader 封装数据集,方便批量处理和打乱数据
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

# 定义逻辑回归模型
class LogisticRegression(nn.Module):
    def __init__(self, input_size, num_classes):
        super(LogisticRegression, self).__init__()  # 调用 nn.Module 的初始化函数
        self.linear = nn.Linear(input_size, num_classes)  # 定义线性层,即全连接层

    def forward(self, x):  # 定义前向传播函数
        out = self.linear(x)  # 通过线性层得到输出
        return out

model = LogisticRegression(input_size, num_classes)  # 实例化模型

criterion = nn.CrossEntropyLoss()  # 定义交叉熵损失函数,适合分类任务
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)  # 定义优化器,这里使用 SGD

# 训练模型
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        images = Variable(images.view(-1, 28*28))  # 调整图片的形状以匹配模型的输入形状
        labels = Variable(labels)  # 将标签转化为 Variable

        optimizer.zero_grad()  # 清除之前计算的梯度
        outputs = model(images)  # 前向传播得到输出
        loss_value = criterion(outputs, labels)  # 根据预测的输出和真实标签计算损失
        loss_value.backward()  # 反向传播,计算梯度
        optimizer.step()  # 更新模型参数

        if (i+1) % 100 == 0:  # 每训练 100 批数据打印一次训练进度
            print ('Epoch: [%d/%d], Step: [%d/%d], Loss: %.4f' % (epoch+1, num_epochs, i+1, len(train_dataset)//batch_size, loss_value.item()))

# 测试模型
correct = 0
total = 0
for images, labels in test_loader:
    images = Variable(images.view(-1, 28*28))  # 调整图片的形状以匹配模型的输入形状
    outputs = model(images)  # 通过模型得到预测输出
    _, predicted = torch.max(outputs.data, 1)  # 根据模型的输出得到预测的类别
    total += labels.size(0)  # 计算总的样本数
    correct += (predicted == labels).sum().item()  # 计算预测正确的样本数

print('Accuracy of the model on the 10000 test images: %d %%' % (100 * correct / total))  # 打印模型在测试集上的准确率

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值