Pytorch 使用CNN图像分类的实现

当涉及到图像分类时,卷积神经网络(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日

相关文章

  • centos 7 配置pytorch运行环境

    华为云服务器,4核心8G内存,没有显卡,性能算凑合,赶上双11才不到1000,性价比还可以,打算配置一套训练densenet的环境。 首先自带的python版本是2.7,由于明年开始就不再维护了,所以安装了个conda。 wget https://repo.continuum.io/archive/Anaconda3-5.3.0-Linux-x86_64.s…

    2023年4月6日
    00
  • Pytorch之Embedding与Linear的爱恨纠葛

    最近遇到的网络模型许多都已Embedding层作为第一层,但回想前几年的网络,多以Linear层作为第一层。两者有什么区别呢?   In [1]: import torch from torch.nn import Embedding from torch.nn import Linear import numpy as np   In [20]: torc…

    PyTorch 2023年4月6日
    00
  • python频繁写入文件时提速的方法

    在Python中频繁写入文件时,可能会遇到性能问题。本文提供一个完整的攻略,以帮助您提高Python频繁写入文件的速度,并减少性能问题。 方法1:使用缓冲区 在Python中,您可以使用缓冲区来提高写入文件的速度。缓冲区是一种内存区域,用于存储要写入文件的数据。当缓冲区被填满时,Python将数据写入文件。您可以按照以下步骤使用缓冲区: with open(…

    PyTorch 2023年5月15日
    00
  • pytorch报错:AttributeError: ‘module’ object has no attribute ‘_rebuild_tensor_v2’

    转载自: https://blog.csdn.net/qq_24305433/article/details/80844548   由于训练模型时使用的是新版本的pytorch,而加载时使用的是旧版本的pytorch 解决方法: 1、既然是pytorch版本较老,那最简单的解决方法当然是简单的升级一下pytorch就ok了。 2、国外的大神给了另一种解决方法…

    PyTorch 2023年4月8日
    00
  • pytorch之DataLoader()函数

    在训练神经网络时,最好是对一个batch的数据进行操作,同时还需要对数据进行shuffle和并行加速等。对此,PyTorch提供了DataLoader帮助我们实现这些功能。 DataLoader的函数定义如下: DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers…

    PyTorch 2023年4月6日
    00
  • pytorch中的size()、 squeeze()函数

    size() size()函数返回张量的各个维度的尺度。 squeeze() squeeze(input, dim=None),如果不给定dim,则把input的所有size为1的维度给移除;如果给定dim,则只移除给定的且size为1的维度。

    2023年4月7日
    00
  • Pytorch中Tensor与各种图像格式的相互转化详解

    在PyTorch中,可以使用各种方法将Tensor与各种图像格式相互转换。以下是两个示例说明,介绍如何在PyTorch中实现Tensor与各种图像格式的相互转化。 示例1:将Tensor转换为PIL图像 import torch import torchvision.transforms as transforms from PIL import Image…

    PyTorch 2023年5月16日
    00
  • PyTorch如何构建深度学习模型?

    简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观。Pytorch就是这样一个库。 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易。Pytorch是我迄今为止所使用的深度学习库中最灵活的,最轻松的。 在本文中,我们将以实践的方式来探索Pytorch,包括基础知识与案例研究。我们会使用numpy和Py…

    2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部