Pytorch 使用CNN图像分类的实现

yizhihongxing

当涉及到图像分类时,卷积神经网络(CNN)是最常用的深度学习模型之一。在本攻略中,我们将介绍如何使用PyTorch实现CNN图像分类。我们将使用CIFAR-10数据集作为示例数据集。

步骤1:加载数据集

首先,我们需要加载CIFAR-10数据集。CIFAR-10数据集包含10个类别的60000个32x32彩色图像。我们将使用torchvision库中的CIFAR-10数据集来加载数据集。以下是一个示例代码,演示了如何加载CIFAR-10数据集:

import torch
import torchvision
import torchvision.transforms as transforms

# 定义数据转换
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

# 加载训练集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

# 加载测试集
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

# 定义类别标签
classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

在上面的代码中,我们首先定义了一个数据转换,该转换将图像转换为张量,并对图像进行归一化。我们使用torchvision.datasets.CIFAR10()函数加载训练集和测试集,并使用torch.utils.data.DataLoader()函数创建数据加载器。我们还定义了类别标签,该标签对应于CIFAR-10数据集中的10个类别。

步骤2:定义CNN模型

接下来,我们需要定义CNN模型。我们将使用PyTorch中的nn.Module类来定义CNN模型。以下是一个示例代码,演示了如何定义CNN模型:

import torch.nn as nn
import torch.nn.functional as F

# 定义CNN模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 实例化CNN模型
net = Net()

在上面的代码中,我们首先定义了一个Net类,该类继承自nn.Module类。我们在Net类的构造函数中定义了CNN模型的各个层。我们使用nn.Conv2d()函数定义卷积层,使用nn.MaxPool2d()函数定义池化层,使用nn.Linear()函数定义全连接层。在Net类的forward()函数中,我们定义了CNN模型的前向传播过程。我们首先将输入x传递给第一个卷积层,然后使用ReLU激活函数和池化层。接下来,我们将输出传递给第二个卷积层,并再次使用ReLU激活函数和池化层。然后,我们将输出展平,并传递给三个全连接层。最后,我们返回输出。

步骤3:定义损失函数和优化器

接下来,我们需要定义损失函数和优化器。我们将使用交叉熵损失函数和随机梯度下降(SGD)优化器。以下是一个示例代码,演示了如何定义损失函数和优化器:

import torch.optim as optim

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

在上面的代码中,我们使用nn.CrossEntropyLoss()函数定义交叉熵损失函数。我们使用optim.SGD()函数定义SGD优化器,并将CNN模型的参数和学习率作为参数传递给该函数。

步骤4:训练CNN模型

现在,我们已经准备好训练CNN模型了。我们将使用训练集来训练CNN模型,并使用测试集来评估CNN模型的性能。以下是一个示例代码,演示了如何训练CNN模型:

# 训练CNN模型
for epoch in range(2):  # 多次循环遍历数据集
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # 获取输入
        inputs, labels = data

        # 梯度清零
        optimizer.zero_grad()

        # 前向传播、反向传播、优化
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # 打印统计信息
        running_loss += loss.item()
        if i % 2000 == 1999:    # 每2000个小批量数据打印一次统计信息
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

在上面的代码中,我们使用两个for循环来遍历训练集。在内部循环中,我们首先获取输入和标签。然后,我们使用optimizer.zero_grad()函数清除梯度。接下来,我们将输入传递给CNN模型,并计算输出和损失。然后,我们使用loss.backward()函数计算梯度,并使用optimizer.step()函数更新CNN模型的参数。最后,我们打印统计信息,包括损失和当前的迭代次数。

步骤5:测试CNN模型

最后,我们需要使用测试集来测试CNN模型的性能。以下是一个示例代码,演示了如何测试CNN模型:

# 测试CNN模型
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        # 获取输入和标签
        images, labels = data

        # 计算输出
        outputs = net(images)

        # 获取预测结果
        _, predicted = torch.max(outputs.data, 1)

        # 统计正确预测的数量和总数量
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

# 打印测试结果
print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

在上面的代码中,我们使用torch.no_grad()上下文管理器来禁用梯度计算。在循环中,我们首先获取输入和标签。然后,我们将输入传递给CNN模型,并计算输出。接下来,我们使用torch.max()函数获取预测结果,并使用(predicted == labels).sum().item()函数统计正确预测的数量和总数量。最后,我们打印测试结果,包括CNN模型的准确率。

示例1:使用GPU训练CNN模型

如果您的计算机具有GPU,您可以使用GPU来加速CNN模型的训练。以下是一个示例代码,演示了如何使用GPU训练CNN模型:

# 将CNN模型移动到GPU上
net.cuda()

# 将输入和标签移动到GPU上
inputs, labels = inputs.cuda(), labels.cuda()

# 计算输出和损失
outputs = net(inputs)
loss = criterion(outputs, labels)

# 计算梯度并更新参数
loss.backward()
optimizer.step()

在上面的代码中,我们首先使用net.cuda()函数将CNN模型移动到GPU上。然后,我们使用inputs.cuda()和labels.cuda()函数将输入和标签移动到GPU上。接下来,我们将输入传递给CNN模型,并计算输出和损失。然后,我们使用loss.backward()函数计算梯度,并使用optimizer.step()函数更新CNN模型的参数。

示例2:使用预训练模型进行迁移学习

如果您的数据集与CIFAR-10数据集不同,您可以使用预训练模型进行迁移学习。以下是一个示例代码,演示了如何使用预训练模型进行迁移学习:

import torchvision.models as models

# 加载预训练模型
resnet18 = models.resnet18(pretrained=True)

# 将预训练模型的最后一层替换为新的全连接层
num_ftrs = resnet18.fc.in_features
resnet18.fc = nn.Linear(num_ftrs, 10)

# 实例化CNN模型
net = resnet18

在上面的代码中,我们首先使用models.resnet18()函数加载预训练模型。然后,我们使用nn.Linear()函数将预训练模型的最后一层替换为新的全连接层。最后,我们实例化CNN模型,并将预训练模型作为其基础。这样,我们就可以使用预训练模型的特征提取能力来训练新的CNN模型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytorch 使用CNN图像分类的实现 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Pytorch 扩展Tensor维度、压缩Tensor维度

        相信刚接触Pytorch的宝宝们,会遇到这样一个问题,输入的数据维度和实验需要维度不一致,输入的可能是2维数据或3维数据,实验需要用到3维或4维数据,那么我们需要扩展这个维度。其实特别简单,只要对数据加一个扩展维度方法就可以了。 1.1 torch.unsqueeze(self: Tensor, dim: _int)   torch.unsqueez…

    2023年4月8日
    00
  • pytorch实现LeNet5代码小结

    目录 代码一 代码二 代码三 代码一 训练代码: import torch import torch.optim as optim import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transfor…

    PyTorch 2023年4月8日
    00
  • pytorch中如何在lstm中输入可变长的序列

    PyTorch 训练 RNN 时,序列长度不固定怎么办? pytorch中如何在lstm中输入可变长的序列 上面两篇文章写得很好,把LSTM中训练变长序列所需的三个函数讲解的很清晰,但是这两篇文章没有给出完整的训练代码,并且没有写关于带label的情况,为此,本文给出一个完整的带label的训练代码: import torch from torch impo…

    2023年4月7日
    00
  • Pytorch官方教程:用RNN实现字符级的生成任务

    数据处理 传送门:官方教程 数据从上面下载。本次的任务用到的数据和第一次一样,还是18个不同国家的不同名字。 但这次需要根据这些数据训练一个模型,给定国家和名字的首字母时,模型可以自动生成名字。   首先还是对数据进行预处理,和第一个任务一样,利用Unicode将不同国家的名字采用相同的编码方式,因为要生成名字,所以需要加上一个终止符,具体作用后面会提到。 …

    2023年4月8日
    00
  • PyTorch实现简单的变分自动编码器VAE

          在上一篇博客中我们介绍并实现了自动编码器,本文将用PyTorch实现变分自动编码器(Variational AutoEncoder, VAE)。自动变分编码器原理与一般的自动编码器的区别在于需要在编码过程增加一点限制,迫使它生成的隐含向量能够粗略的遵循标准正态分布。这样一来,当需要生成一张新图片时,只需要给解码器一个标准正态分布的隐含随机向量就可…

    PyTorch 2023年4月8日
    00
  • Pytorch mask_select 函数的用法详解

    PyTorch mask_select 函数的用法详解 在 PyTorch 中,mask_select 函数是一种常见的选择操作,它可以根据给定的掩码(mask)从输入张量中选择元素。本文将详细讲解 PyTorch 中 mask_select 函数的用法,并提供两个示例说明。 1. mask_select 函数的基本用法 在 PyTorch 中,我们可以使用…

    PyTorch 2023年5月16日
    00
  • PyTorch基础之torch.nn.Conv2d中自定义权重问题

    PyTorch基础之torch.nn.Conv2d中自定义权重问题 在PyTorch中,torch.nn.Conv2d是一个常用的卷积层。在使用torch.nn.Conv2d时,有时需要自定义权重。本文将介绍如何在torch.nn.Conv2d中自定义权重,并演示两个示例。 示例一:自定义权重 import torch import torch.nn as …

    PyTorch 2023年5月15日
    00
  • Pytorch关于Dataset 的数据处理

    PyTorch关于Dataset的数据处理 在PyTorch中,Dataset是一个抽象类,用于表示数据集。它提供了一种统一的方式来处理数据,使得我们可以轻松地加载和处理数据。在本文中,我们将详细介绍如何使用PyTorch中的Dataset类来处理数据,并提供两个示例来说明其用法。 1. 创建自定义Dataset 要创建自定义Dataset,需要继承PyTo…

    PyTorch 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部