PyTorch 教程-CIFAR-10数据集上LeNet模型的测试
在前一个主题中,我们发现我们的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图像,将得到以下输出:
步骤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()
它似乎能够准确预测大多数图像。总体而言,很好,我们的模型能够根据其训练参数对新数据进行泛化。