查看原文
其他

PyTorch 教程-CIFAR-10数据集上LeNet模型的测试

点击关注👉 Python架构师 2024-02-11
整理:python架构师

在前一个主题中,我们发现我们的LeNet模型与卷积神经网络能够对MNIST数据集图像进行分类。MNIST数据集包含灰度图像,但在CHIFAR-10数据集中,图像是彩色的且包含不同的物体。因此,我们最大的问题是我们的LeNet模型是否能够对CIFAR-10数据集的图像进行分类。我们将复制我们先前主题的代码,即CNN测试,并在代码的图像转换、实现、训练、验证和测试部分进行以下更改:

注意:如果您是新手,请务必了解我们先前主题的知识,以更有效地理解这个主题。

图像转换部分的更改:

在图像转换部分,我们将进行以下更改:

步骤1:

在这里,我们使用CIFAR-10数据集,因此我们的第一步是加载CIFAR-10数据集而不是MNIST数据集。我们通过对训练数据集和验证数据集进行以下更改来加载CIFAR-10数据集:
training_dataset=datasets.CIFAR10(root='./data',train=True,download=True,transform=transform1) validation_dataset=datasets.CIFAR10(root='./data',train=False,download=True,transform=transform1)  

步骤2:

在下一步中,我们将更改我们的转换语句。我们知道MNIST图像的大小为28x28像素,但CIFAR10图像的大小为32x32像素。因此,我们将在transform.compose()方法的第一个参数中进行更改:
transform1=transforms.Compose([transforms.Resize((32,32)),transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,))])  

现在,如果我们绘制我们的CIFAR-10图像,将得到以下输出:

资源分享

👉点击领取:最全Python资料合集

步骤3:

在CIFAR10图像中,我们知道图像被分类到类别中。为了更好地理解和可视化,我们在im_convert()方法之后声明一个包含类别的列表,其中我们按顺序指定每个图像的类别:
classes={'plane','car','bird','cat','dear','dog'.'frog','horse','ship','truck'}

步骤4:

标签表示这些类别的有序数值表示,因此我们将使用每个相应标签来索引我们的类别列表,输出将是适当的类别。我们将set_title()方法更改为:
ax.set_title(classes[labels[idx].item()])

它将给出以下输出:

实现、训练和验证部分的更改:

我们的Lenet模型是为MNIST图像实现的。MNIST图像是灰度图像,但我们必须为包含彩色图像的CIFAR-10数据集实现我们的模型。因此,我们必须在代码中进行以下更改:

步骤1:

以前,我们使用的是一个通道的灰度图像,现在我们使用三通道的彩色图像,这些图像被传递到神经网络中。因此,在第一个卷积层中,我们将3而不是1设置为:
self.conv1=nn.Conv2d(3,20,5,1)

步骤2:

现在,我们必须训练大量的参数。经过5x5内核的卷积后,图像变为28x28,然后通过下一个池化变为14x14,执行具有相同大小内核的另一个卷积。图像再次减小为4x4,最后通过另一个最大池化,将馈送到完全连接的网络中的向量将是5x5x50。

因此,在我们的初始化器中,我们必须更改我们的第一个完全连接的层:
self.fully1=nn.Linear(5*5*50,500)

步骤3:

现在,我们还必须更改输出的形状。为此,我们必须在forward函数中更改我们的view语句:
xx=x.view(-1,5*5*50) #Reshaping the output into desired shape

现在,找到总损失和验证损失以及准确度和验证准确度并绘制,然后它将给出以下输出:

步骤4:

现在,我们将使用它来预测来自Web的图像,以简单地获取模型准确性的视觉透视。我们将使用以下图像:https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/hires/2018/2-dog.jpg

当我们绘制这个图像时,它将显示为:

步骤5:

在接下来的步骤中,我们将删除我们的反转和转换方法,因为这次我们的图像将被极端转换为生物级格式,并且我们的网络是在彩色图像上训练的。我们将转换图像并绘制图像,如下所示:
url='https://ichef.bbci.co.uk/news/912/cpsprodpb/160B4/production/_103229209_horsea.png' response=requests.get(url,stream=True) img=Image.open(response.raw) img=transform1(img) plt.imshow(im_convert(img))

在转换后,我们获得了图像的更抽象表示。它缩小为一个较小的32x32表示。

步骤6:

现在,我们对这个图像进行预测,所以我们将挤压图像并使用类进行预测,如下所示:
image1=img.to(device).unsqueeze(0) output=model(image1) _,pred=torch.max(output,1) print(classes[pred.item()])

测试部分的更改:

测试部分与以前相同。将继续进行与彩色图像相同的CNN测试过程,但在彩色图像中,我们将使用类来预测每个验证图像,如下所示:
dataiter=iter(validation_loader) images,labels=dataiter.next() imagesimages_=images.to(device) labelslabels=labels.to(device) output=model(images_) _,preds=torch.max(output,1) fig=plt.figure(figsize=(25,4)) for idx in np.arange(20): ax=fig.add_subplot(2,10,idx+1,xticks=[],yticks=[]) plt.imshow(im_convert(images[idx])) ax.set_title("{}({})".format(str(classes[preds[idx].item()]),str(classes[labels[idx].item())),color=("green" if preds[idx]==labels[idx] else "red")) plt.show()

它似乎能够准确预测大多数图像。总体而言,很好,我们的模型能够根据其训练参数对新数据进行泛化。

 
热门推荐

继续滑动看下一个

PyTorch 教程-CIFAR-10数据集上LeNet模型的测试

点击关注👉 Python架构师
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存