当前位置:   article > 正文

Pytorch实战(一) FashionMNIST数据集分离类_用pytorch实现服装分割

用pytorch实现服装分割

数据集准备

FashionMNIST数据集作为一个比较入门的图像分类数据集,数量较少,个人认为是一个很好的入门数据集。其中包含了10个不同类别的服装和鞋类商品的灰度图像。每个类别包含6000张训练图像和1000张测试图像,共计70000张图像。

这些图像的分辨率是28x28像素,它们相对较小,适合用于快速原型设计和实验。FashionMNIST数据集通常用于测试深度学习模型在图像分类任务上的性能,并作为MNIST数据集的一种替代选择。

FashionMNIST数据集中的10个类别分别是:

T-shirt/top (T恤/上衣)
Trouser (裤子)
Pullover (套头衫)
Dress (裙子)
Coat (外套)
Sandal (凉鞋)
Shirt (衬衫)
Sneaker (运动鞋)
Bag (包)
Ankle boot (短靴)

数据集图像 数据集导入:

train_dataset = datasets.FashionMNIST(root="./data", train=True, transform=transform, download=True)
test_dataset = datasets.FashionMNIST(root="./data", train=False, transform=transform, download=True)
  • 1
  • 2

可以选择在线下载,网络不好的好提前离线下载好。

分类实现

首先导入工具包:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn.functional as F
from time import time
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

然后进行数据准备:

transform = transforms.ToTensor()
train_dataset = datasets.FashionMNIST(root="./data", train=True, transform=transform, download=True)
test_dataset = datasets.FashionMNIST(root="./data", train=False, transform=transform, download=True)
batch_size = 512
#train_dataset为加载的训练数据集,batch_size为批量的样本数量,shuffle=True表示打乱训练数据的顺序
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

分别加载训练数据集train_dataset和测试数据集test_dataset。batch_size为每次批量抽取的样本,可以根据电脑的性能进行选择。shuffle=True表示每个周期开始时,打乱训练的数据,确保模型不会过度依赖于数据的特定顺序。

然后构建自己的模型,这也是最为关键的部分。首先使用一个非常简单的结构:

class SimpleCNN(nn.Module):
    def __init__(self,num_classes):
    	super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(in_channels=16,out_channels=20, kernel_size=3)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(20 * 13 * 13, 128)
        self.fc2 = nn.Linear(128, num_classes)

    def forward(self, x):
        x = (torch.relu(self.conv1(x)))
        x = self.pool(torch.relu(self.conv2(x)))
        x = x.view(-1, 20 * 13 * 13)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

模型的结构非常简单,然后将模型转移到GPU上进行加速训练:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SimpleCNN(num_classes=10).to(device)

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
  • 1
  • 2
  • 3
  • 4
  • 5

第一行代码:这行代码用于选择运行模型的计算设备。如果你的计算机支持并配置了CUDA(NVIDIA的GPU计算平台),则会选择在CUDA上运行模型,否则会选择在CPU上运行模型。
第二行保证自己的代码在GPU上运行。
第三行定义损失函数,用于测量模型的预测与真实标签之间的差距。
第四行代码创建了一个Adam优化器,并将模型的参数传递给优化器。它还设置了学习率(lr)为0.001,这是一个常见的初始学习率值,可以根据需要进行调整。

然后进行训练循环:

num_epochs = 30
start=time()
for epoch in range(num_epochs):
    model.train()  # 设置模型为训练模式
    for images, labels in train_loader:
        images, labels = images.to(device), labels.to(device)  # 将数据移到GPU上
        #梯度清零
        optimizer.zero_grad()
        #前向传播
        outputs = model(images)
        #计算损失
        loss = criterion(outputs, labels)
        #反向传播,将计算的结果储存在.grad中
        loss.backward()
        #使用优化器执行梯度下降步骤,更新模型的参数
        optimizer.step()
    print(f"Epoch [{epoch+1}/{num_epochs}] Loss: {loss.item():.4f}")
end = time()
print("总花费时长:{} 秒 \n每次epoch花费时长:{} 秒".format(end-start, (end-start) / num_epochs))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

统计了训练的花费时长和每个epoch的时长:

总花费时长:151.91038393974304 秒 
每次epoch花费时长:5.063679464658102
  • 1
  • 2

这个当然和设备有很大关系。

然后进行模型评估:

model.eval()  # 设置模型为评估模式,此时进行前向传播时不会进行梯度计算
correct = 0   #正确分类的样本数量
total = 0     #总的样本数量
with torch.no_grad():
    for images, labels in test_loader:
        images, labels = images.to(device), labels.to(device)  # 将数据移到GPU上
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

accuracy = correct / total
print(f"模型准确率: {accuracy * 100:.2f}%")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

最后得出的准确率为91.59%。可见网络结构依然有提升空间。因为本次设计的网络结构较为简单,所以可以继续进行改进。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/789312
推荐阅读
相关标签
  

闽ICP备14008679号