首页人工智能Pytorch【深度学习(PyTorch...

【深度学习(PyTorch篇)】31.使用全连接网络完成图像分类任务(CIFAR-10数据集)

本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/PyTorch





01

CIFAR-10数据集


CIFAR-10数据集是一个广泛使用的计算机视觉数据集,用于图像分类任务。该数据集包含了60000张32×32大小的彩色图像,这些图像被均匀地分为10个类别(‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’)。其中50000张图片被划分为训练集,剩下的10000张图片被用作测试集。
总的来说,CIFAR-10数据集是一个用于图像分类任务的经典数据集,经常被用作机器学习和计算机视觉领域的基准测试集,以评估各种图像分类算法的性能。

我们可以使用torchvision.datasets模块中的CIFAR10类来下载并加载CIFAR-10数据集,然后使用matplotlib进行可视化。

第一次运行程序时,会自动下载数据集,大小约为100MB,需要花费一些时间。

cifar10 = datasets.CIFAR10('./data/' , train=True , download=True)
cifar10_val = datasets.CIFAR10('./data/' , train=False , download=True)

class_names = ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']

fig = plt.figure(figsize=(8,4))
for i in range(10):
    ax = fig.add_subplot(2 , 5 , i+1 , xticks=[] , yticks=[])
    ax.set_title(class_names[i])
    img = next(img for img,label in cifar10 if label==i)
    plt.imshow(img)
可视化结果如下图所示:


02

CIFAR-10分类


接下来使用PyTorch构建一个全连接网络来完成基于CIFAR-10数据集的图像分类任务。通过以下步骤,可以完成基于CIFAR-10数据集的图像分类任务,并得到一个性能良好的图像分类模型。

  • 加载CIFAR-10数据集并进行预处理:

分别下载训练集和测试集,并进行图像预处理操作,以提升模型的训练效果。
# 数据预处理  
transform=transforms.Compose([transforms.ToTensor(), # 变换为Tensor
                              transforms.Normalize((0.4915,0.4823,0.4468),(0.2470,0.2435,0.2616)) # 数据归一化
                             ])

# 下载并加载CIFAR10训练集和测试集
trainset = datasets.CIFAR10('./data/' , train=True , download=True,transform=transform)
train_loader = DataLoader(trainset , batch_size=64 , shuffle=True)

testset = datasets.CIFAR10('./data/' , train=False , download=True,transform=transform)
test_loader = DataLoader(testset , batch_size=64 , shuffle=True)

  • 构建网络:

PyTorch框架中,搭建神经网络的方式多种多样,nn提供了一种通过nn.Sequential容器来连接模型的方式。该操作可以将各个层封装到Sequential构建的容器当中,是一种简单且直观的方法,适用于那些具有简单线性层叠结构的网络。

Sequential类允许我们将多个网络层按照顺序堆叠起来。每个添加到Sequential对象中的模块都将按照它们在构造函数中被传入的顺序被添加到计算图中执行顺序的顶部。

本次构建的神经网络模型结构为线性模块nn.Linear+激活函数nn.Tanh的组合。选择交叉熵损失函数作为损失函数,选择SGD随机梯度下降优化器。

# 定义全连接神经网络
model = nn.Sequential(
            nn.Linear(3072, 1024),
            nn.Tanh(),
            nn.Linear(1024, 512),
            nn.Tanh(),
            nn.Linear(512, 128),
            nn.Tanh(),
            nn.Linear(128, 10))

# 检查是否有可用的GPU,如果有,将网络和数据移动到GPU上
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")  
model.to(device)  # 将网络移到GPU上

# 定义损失函数
criterion  = nn.CrossEntropyLoss()

# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=1e-2, momentum=0.9)

  • 训练网络:

使用训练集对模型进行训练,通过前向传播计算预测值,然后计算损失并进行反向传播来更新模型参数。
# 训练网络  
for epoch in range(10):  # 多次遍历整个数据集  
    running_loss = 0.0  
    for i, data in enumerate(train_loader, 0):  
        # 获取输入数据  
        inputs, labels = data[0].to(device), data[1].to(device)  

        # 清零梯度缓存  
        optimizer.zero_grad()  

        # 前向传播,后向传播,优化  
        outputs = model(inputs.view(inputs.shape[0], -1))  
        loss = criterion(outputs, labels)  
        loss.backward()  
        optimizer.step()  

        # 输出统计信息  
        running_loss += loss.item()  
        if i % 200 == 199:  # 每200个mini-batches输出一次  
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 200))  
            running_loss = 0.0  

print('Finished Training')  
训练过程中,记录损失来监控模型的训练效果。
[1,   200] loss: 1.895
[1,   400] loss: 1.751
[1,   600] loss: 1.719
[2,   200] loss: 1.621
......
[9,   600] loss: 1.003
[10,   200] loss: 0.846
[10,   400] loss: 0.884
[10,   600] loss: 0.914
Finished Training

  • 测试网络:

使用测试集对训练好的模型进行评估,计算模型在未知数据(测试集)上的性能表现,本次选择准确率指标。

# 测试网络  
correct = 0  
total = 0  
with torch.no_grad():  
    for data in test_loader:  
        images, labels = data[0].to(device), data[1].to(device)  
        outputs = model(images.view(images.shape[0], -1))  
        _, predicted = torch.max(outputs.data, 1)  
        total += labels.size(0)  
        correct += (predicted == labels).sum().item()  

print(f'Accuracy of the network on the 10000 test images: {(100 * correct / total)}%' )

输出结果为:

Accuracy of the network on the 10000 test images: 49.46%

可以看到模型在测试集上的预测准确率接近50%,证明模型确实学到了东西。



更多内容可以前往官网查看

https://pytorch.org/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments