PyTorch一小时掌握之图像识别实战篇

PyTorch一小时掌握之图像识别实战篇

本文将介绍如何使用PyTorch进行图像识别任务。我们将提供两个示例,分别是手写数字识别和猫狗分类。

手写数字识别

手写数字识别是一个经典的图像识别任务。以下是一个简单的手写数字识别示例:

import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms

# 定义超参数
input_size = 784
hidden_size = 500
num_classes = 10
num_epochs = 5
batch_size = 100
learning_rate = 0.001

# 加载MNIST数据集
train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dsets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

# 加载数据集
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)

# 定义模型
model = nn.Sequential(
    nn.Linear(input_size, hidden_size),
    nn.ReLU(),
    nn.Linear(hidden_size, num_classes)
)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

# 训练模型
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        images = images.reshape(-1, 28*28)

        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# 测试模型
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.reshape(-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: {} %'.format(100 * correct / total))

在这个示例中,我们首先定义了超参数,然后加载了MNIST数据集。接下来,我们定义了一个名为model的模型,并定义了一个名为criterion的损失函数和一个名为optimizer的优化器。然后,我们使用训练数据对模型进行了训练,并在每个epoch结束时输出损失值。最后,我们使用测试数据对模型进行了测试,并输出了模型的准确率。

猫狗分类

猫狗分类是一个常见的图像识别任务。以下是一个简单的猫狗分类示例:

import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms
import torchvision.models as models

# 定义超参数
num_epochs = 5
batch_size = 100
learning_rate = 0.001

# 加载数据集
train_dataset = dsets.ImageFolder(root='./data/train', transform=transforms.Compose([
    transforms.Resize(224),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
]))
test_dataset = dsets.ImageFolder(root='./data/test', transform=transforms.Compose([
    transforms.Resize(224),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
]))
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)

# 加载预训练模型
model = models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 2)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

# 训练模型
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# 测试模型
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        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 test images: {} %'.format(100 * correct / total))

在这个示例中,我们首先定义了超参数,然后加载了猫狗分类数据集。接下来,我们加载了一个预训练的ResNet18模型,并将其输出层替换为一个名为fc的线性层。然后,我们定义了一个名为criterion的损失函数和一个名为optimizer的优化器。然后,我们使用训练数据对模型进行了训练,并在每个epoch结束时输出损失值。最后,我们使用测试数据对模型进行了测试,并输出了模型的准确率。

结论

在本文中,我们介绍了如何使用PyTorch进行图像识别任务,并提供了两个示例说明。如果您遵循这些步骤和示例,您应该能够在PyTorch中实现手写数字识别和猫狗分类任务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch一小时掌握之图像识别实战篇 - Python技术站

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

相关文章

  • 2层感知机(神经网络)实现非线性回归(非线性拟合)【pytorch】

    import torch import numpy import random from torch.autograd import Variable import torch.nn.functional as F import matplotlib.pyplot as plt x = torch.unsqueeze(torch.linspace(-1,1,…

    2023年4月8日
    00
  • pytorch 设置种子

    目的: 固定住训练的顺序等变量,使实验可复现 def setup_seed(seed): torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) np.random.seed(seed) random.seed(seed) torch.backends.cudnn.deterministic = Tr…

    PyTorch 2023年4月6日
    00
  • PyTorch: .add()和.add_(),.mul()和.mul_(),.exp()和.exp_()

    .add()和.add_() .add()和.add_()都能把两个张量加起来,但.add_是in-place操作,比如x.add_(y),x+y的结果会存储到原来的x中。Torch里面所有带”_”的操作,都是in-place的。 .mul()和.mul_() x.mul(y)或x.mul_(y)实现把x和y点对点相乘,其中x.mul_(y)是in-plac…

    2023年4月8日
    00
  • pytorch1.0 用torch script导出模型

    python的易上手和pytorch的动态图特性,使得pytorch在学术研究中越来越受欢迎,但在生产环境,碍于python的GIL等特性,可能达不到高并发、低延迟的要求,存在需要用c++接口的情况。除了将模型导出为ONNX外,pytorch1.0给出了新的解决方案:pytorch 训练模型 – 通过torch script中间脚本保存模型 — C++加载…

    PyTorch 2023年4月8日
    00
  • 贝叶斯个性化排序(BPR)pytorch实现

    一、BPR算法的原理: 1、贝叶斯个性化排序(BPR)算法小结https://www.cnblogs.com/pinard/p/9128682.html2、Bayesian Personalized Ranking 算法解析及Python实现https://www.cnblogs.com/wkang/p/10217172.html3、推荐系统中的排序学习ht…

    2023年4月8日
    00
  • AFM模型 pytorch示例代码

    1.AFM模型pytorch实现。 $hat{y}_{AFM}=w_{0} + sum_{i=1}^{n}w_{i}x_{i}+p^{T}sum_{i=1}^{n-1}sum_{j=i+1}^{n}a_{ij}(v_{i}v_{j})x_{i}x_{j}$ $a_{ij}^{‘}=h^{T}Relu(W(v_{i}v_{j})x_{i}x_{j}+b)$ $…

    2023年4月7日
    00
  • Linux下conda配置虚拟环境:python + pytorch

    Linux下conda配置虚拟环境:python + pytorch 默认已经安装好conda 创建虚拟环境 conda创建并激活虚拟环境 命令: conda create -n your_env_name python=2.7/3.6source activate your_env_name 其中,-n中n表示name,即你创建环境的名字。之后如果忘记自己…

    PyTorch 2023年4月8日
    00
  • pytorch 使用单个GPU与多个GPU进行训练与测试的方法

    在PyTorch中,我们可以使用单个GPU或多个GPU进行模型训练和测试。本文将详细讲解如何使用单个GPU和多个GPU进行训练和测试,并提供两个示例说明。 1. 使用单个GPU进行训练和测试 在PyTorch中,我们可以使用torch.cuda.device()方法将模型和数据移动到GPU上,并使用torch.nn.DataParallel()方法将模型复制…

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