赞
踩
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)
可以选择在线下载,网络不好的好提前离线下载好。
首先导入工具包:
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
然后进行数据准备:
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)
分别加载训练数据集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
模型的结构非常简单,然后将模型转移到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)
第一行代码:这行代码用于选择运行模型的计算设备。如果你的计算机支持并配置了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))
统计了训练的花费时长和每个epoch的时长:
总花费时长:151.91038393974304 秒
每次epoch花费时长:5.063679464658102 秒
这个当然和设备有很大关系。
然后进行模型评估:
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}%")
最后得出的准确率为91.59%。可见网络结构依然有提升空间。因为本次设计的网络结构较为简单,所以可以继续进行改进。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。