📜  在PyTorch中使用Logistic逻辑回归识别手写数字(1)

📅  最后修改于: 2023-12-03 15:23:27.431000             🧑  作者: Mango

在PyTorch中使用Logistic逻辑回归识别手写数字

简介

本篇教程将介绍如何使用PyTorch来实现Logistic逻辑回归模型,以识别手写数字为例。本文将介绍如何准备数据、搭建模型、训练模型以及测试模型的过程。这是一个适合初学者入门的PyTorch教程。

准备工作
安装PyTorch

在开始之前,需要先安装PyTorch。可以在PyTorch官网上找到相应的安装教程。

下载数据集

我们将使用MNIST手写数字数据集进行模型的训练和测试,可以在官网下载。下载完成后,将数据集放在任意一个文件夹内,建议将其放在和Python代码的同一层目录下。

导入必要的库

在开始之前需要导入PyTorch以及相关的库。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
数据准备
数据预处理

在使用数据集之前,需要进行预处理。预处理的过程包括将数据集转换成张量、归一化操作等。

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

在这里,我们使用了transform.Compose方法,将ToTensor和Normalize操作顺序执行。To Tensor操作将图片转换成张量,Normalize操作将张量进行归一化处理。

数据集加载

在PyTorch中,数据集的加载通常使用DataLoader类完成。在这个类中,可以设置batch size、shuffle等参数。

train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST('./data', train=False, download=True, transform=transform)

train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=True)
模型搭建

我们将使用PyTorch中的神经网络模块来搭建逻辑回归模型。在这里,我们使用一个简单的线性层作为模型,其中输入是28x28张量,输出是10个数,表示0到9的十个数字的概率。

class LogisticRegression(nn.Module):
    def __init__(self):
        super(LogisticRegression, self).__init__()
        self.fc = nn.Linear(28 * 28, 10)

    def forward(self, x):
        x = x.view(-1, 28 * 28)
        x = self.fc(x)
        return x
模型训练
定义损失函数和优化器

在模型训练中,需要指定损失函数和优化器。这里默认使用交叉熵损失函数和随机梯度下降优化器。

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
定义训练函数

下面我们定义训练函数,函数接受一个epoch作为参数。在训练过程中,我们使用train_loader迭代数据集,计算损失函数并执行反向传播和权重更新。

def train(epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % 10 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                       100. * batch_idx / len(train_loader), loss.item()))
开始训练

在所有准备工作完成后,我们可以开始进行模型训练了。

model = LogisticRegression()
for epoch in range(1, 11):
    train(epoch)

在训练之后,我们将得到一个已经训练好的模型。

模型测试

为了检验模型的准确性,我们在模型训练结束后,使用test_loader迭代测试数据集,计算模型的准确性。

def test():
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            output = model(data)
            test_loss += criterion(output, target).item()
            pred = output.argmax(dim=1, keepdim=True)
            correct += pred.eq(target.view_as(pred)).sum().item()

    test_loss /= len(test_loader.dataset)
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))
总结

本篇教程介绍了如何使用PyTorch来实现Logistic逻辑回归模型,以识别手写数字为例。在实现过程中,我们介绍了数据准备、模型搭建、模型训练以及模型测试的过程。本教程旨在帮助初学者了解PyTorch的基本使用方法,并为更高级的深度学习模型打下基础。