在前一个主题中,我们发现我们的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图像,将得到以下输出:

02-1.png

步骤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()])  

它将给出以下输出:

02-2.png

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

我们的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  

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

02-3.png

02-4.png

步骤4:

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

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

02-5.png

步骤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))

02-6.png

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

步骤6:

现在,我们对这个图像进行预测,所以我们将挤压图像并使用类进行预测,如下所示:

image1=img.to(device).unsqueeze(0)    
output=model(image1)  
_,pred=torch.max(output,1)  
print(classes[pred.item()])  

02-7.png

测试部分的更改:

测试部分与以前相同。将继续进行与彩色图像相同的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()    

02-8.png

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

标签: Pytorch, Pytorch教程, Pytorch安装, Pytorch入门, Pytorch下载, Pytorch指南, Pytorch编程, Pytorch入门教程, Pytorch初级教程, Pytorch进阶, Pytorch高级教程, Pytorch学习, Pytorch库