在PyTorch中使用卷积神经网络建立图像分类模型-皇家国际官网 - 皇家国际-皇家国际官网[点击进入]

当前位置:首页 > 探索 > 奇闻

在PyTorch中使用卷积神经网络建立图像分类模型-皇家国际官网

2020-10-25 03:04:02

皇家国际官网:阐述在PyTorch中建构自己的卷积神经网络(CNN)的实践中教程我们将研究一个图像分类问题——CNN的一个经典和普遍用于的应用于我们将以简单的格式讲解深度自学概念讲解我被神经网络的力量和能力所更有。在机器学习和深度自学领域,完全每一次突破都以神经网络模型为核心。

这在计算机视觉领域最为广泛。无论是非常简单的图像分类还是更加高级的东西(如对象检测),神经网络修筑了处置图像数据的可能性。

皇家国际官网

简而言之,对于像我这样的数据科学家来说,这是一座金矿!当我们用于深度自学来解决问题一个图像分类问题时,非常简单的神经网络总是一个好的起点。但是,它们显然有局限性,而且模型的性能在超过一定程度后无法获得提高。这就是卷积神经网络(CNNs)转变了竞争环境的地方。

它们在计算机视觉应用于中无处不在。老实说道,我实在每一个计算机视觉爱好者都应当可以迅速学会这个概念。

我将向你讲解用于风行的PyTorch框架展开深度自学的新概念。在本文中,我们将理解卷积神经网络是如何工作的,以及它如何协助我们改良模型的性能。我们还将研究在PyTorch中CNNs的构建。目录1.详细讲解PyTorch、张量和NumPy2.为什么自由选择卷积神经网络(CNNs)?3.辨识服装问题4.用于PyTorch构建CNNs一、详细讲解PyTorch、张量和NumPy让我们较慢总结一下第一篇文章中牵涉到的内容。

我们辩论了PyTorch和张量的基础知识,还辩论了PyTorch与NumPy的相似之处。PyTorch是一个基于python的库,获取了以下功能:用作创立可序列化和可优化模型的TorchScript以分布式训练展开分段化计算出来动态计算出来图,等等PyTorch中的张量类似于NumPy的n维数组,也可以与gpu一起用于。在这些张量上继续执行操作者完全与在NumPy数组上继续执行操作者类似于。这使得PyTorch十分更容易用于和自学。

在本系列的第1部分中,我们建构了一个非常简单的神经网络来解决问题一个案例研究。用于我们的非常简单模型,我们在测试集中于取得了约65%的基准准确度。

皇家国际官网

现在,我们将尝试用于卷积神经网络来提升这个准确度。二、为什么自由选择卷积神经网络(CNNs)?在我们转入构建部分之前,让我们较慢地想到为什么我们首先必须CNNs,以及它们是如何工作的。我们可以将卷积神经网络(CNNs)看做是协助从图像中萃取特征的特征提取器。

在一个非常简单的神经网络中,我们把一个三维图像转换成一维图像,对吧?让我们看一个例子来解读这一点:你能见到上面的图像吗?这或许说道必经。现在,让我们想到下面的图片:我们现在可以很更容易地说道,这是一只狗。如果我告诉他你这两个图像是一样的呢?坚信我,他们是一样的!唯一的区别是第一个图像是一维的,而第二个图像是完全相同图像的二维回应。

空间定位人工神经网络也不会遗失图像的空间方向。让我们再行荐个例子来解读一下:你能辨别出有这两幅图像的区别吗?最少我无法。

由于这是一个一维的回应,因此很难确认它们之间的区别。现在,让我们想到这些图像的二维回应:在这里,图像某些定位早已转变,但我们无法通过查阅一维回应来辨识它。

这就是人工神经网络的问题——它们丧失了空间定位。大量参数神经网络的另一个问题是参数过于多。假设我们的图像大小是28*28*3-所以这里的参数是2352。

如果我们有一个大小为224*224*3的图像呢?这里的参数数量为150,528。这些参数只不会随着隐蔽层的减少而减少。因此,用于人工神经网络的两个主要缺点是:1.遗失图像的空间方向2.参数的数量急遽减少那么我们如何处置这个问题呢?如何在维持空间方向的同时增加可自学参数?这就是卷积神经网络确实简单的地方。

CNNs有助从图像中萃取特征,这有可能有助对图像中的目标展开分类。它首先从图像中萃取较低维特征(如边缘),然后萃取一些高维特征(如形状)。我们用于滤波器从图像中萃取特征,并用于池技术来增加可自学参数的数量。在本文中,我们会了解辩论这些主题的细节。

如果你期望理解滤波器如何协助萃取特征和池的工作方式,我强烈建议你从头开始自学卷积神经网络的全面教程。三、解读问题陈述:辨识服装理论部分早已铺垫完了,开始写出代码吧。我们将辩论与第一篇文章完全相同的问题陈述。

皇家国际

这是因为我们可以必要将我们的CNN模型的性能与我们在那里创建的非常简单神经网络展开较为。你可以从这里iTunes“辨识”Apparels问题的数据集。https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-apparels/?utm_source=blog&utm_medium=building-image-classification-models-cnn-pytorch让我较慢总结一下问题陈述。

我们的任务是通过观察各种服装形象来辨识服装的类型。我们总共有10个类可以对服装的图像展开分类:LabelDescription0T-shirt/top1Trouser2Pullover3Dress4Coat5Sandal6Shirt7Sneaker8Bag9Ankleboot数据集共包括70,000张图像。其中60000张归属于训练集,其余10000张归属于测试集。

所有的图像都是大小(28*28)的灰度图像。数据集包括两个文件夹,—一个用作训练集,另一个用作测试集。每个文件夹中都有一个.csv文件,该文件具备图像的id和适当的标签;准备好开始了吗?我们将首先引入所需的库:#漏入库importpandasaspdimportnumpyasnp#加载与展出图片fromskimage.ioimportimreadimportmatplotlib.pyplotasplt%matplotlibinline#创立检验集fromsklearn.model_selectionimporttrain_test_split#评估模型fromsklearn.metricsimportaccuracy_scorefromtqdmimporttqdm#Pytorch的涉及库importtorchfromtorch.autogradimportVariablefromtorch.nnimportLinear,ReLU,CrossEntropyLoss,Sequential,Conv2d,MaxPool2d,Module,Softmax,BatchNorm2d,Dropoutfromtorch.optimimportAdam,SGD读取数据集现在,让我们读取数据集,还包括训练,测试样本:#读取数据集train=pd.read_csv('train_LbELtWX/train.csv')test=pd.read_csv('test_ScVgIM0/test.csv')sample_submission=pd.read_csv('sample_submission_I5njJSF.csv')train.hea皇家国际官网d()该训练文件包括每个图像的id及其对应的标签另一方面,测试文件只有id,我们必需预测它们对应的标签样例递交文件将告诉他我们预测的格式我们将一个相接一个地加载所有图像,并将它们填充成一个数组。

我们还将图像的像素值除以255,使图像的像素值在[0,1]范围内。这一步有助优化模型的性能。让我们来读取图像:#读取训练图像train_img=[]forimg_nameintqdm(train['id']):#定义图像路径image_path='train_LbELtWX/train/'+str(img_name)+'.png'#加载图片img=imread(image_path,as_gray=True)#归一化像素值img/=255.0#切换为浮点数img=img.astype('float32')#加到到列表train_img.append(img)#切换为numpy数组train_x=np.array(train_img)#定义目标train_y=train['label'].valuestrain_x.shape如你所闻,我们在训练集中于有60,000张大小(28,28)的图像。

由于图像是灰度格式的,我们只有一个单一地下通道,因此形状为(28,28)。现在让我们研究数据和可视化一些图像:#可视化图片i=0plt.figure(figsize=(10,10))plt.subplot(221),plt.imshow(train_x[i],cmap='gray')plt.subplot(222),plt.imshow(train_x[i+25],cmap='gray')plt.subplot(223),plt.imshow(train_x[i+50],cmap='gray')plt.subplot(224),plt.imshow(train_x[i+75],cmap='gray')以下是来自数据集的一些示例。

我希望你去探寻更加多,想象其他的图像。接下来,我们将把图像分为训练集和检验集。创立检验集并对图像展开预处理#创立检验集train_x,val_x,train_y,val_y=train_test_split(train_x,train_y,test_size=0.1)(train_x.shape,train_y.shape),(val_x.shape,val_y.shape)我们在检验集中于保有了10%的数据,在训练集中于保有了10%的数据。

皇家国际

接下来将图片和目标转换成torch格式:#切换为torch张量train_x=train_x.reshape(54000,1,28,28)train_x=torch.from_numpy(train_x)#切换为torch张量train_y=train_y.astype(int);train_y=torch.from_numpy(train_y)#训练集形状train_x.shape,train_y.shape某种程度,我们将切换检验图像:#切换为torch张量val_x=val_x.reshape(6000,1,28,28)val_x=torch.from_numpy(val_x)#切换为torch张量val_y=val_y.astype(int);val_y=torch.from_numpy(val_y)#检验集形状val_x.shape,val_y.shape我们的数据现在早已准备好了。最后,是时候创立我们的CNN模型了!四、用于PyTorch构建CNNs我们将用于一个非常简单的CNN架构,只有两个卷积层来萃取图像的特征。

然后,我们将用于一个几乎相连的Dense层将这些特征分类到各自的类别中。让我们定义一下架构:classNet(Module):def__init__(self):super(Net,self).__init__()self.cnn_layers=Sequential(#定义2D卷积层Conv2d(1,4,kernel_size=3,stride=1,padding=1),BatchNorm2d(4),ReLU(inplace=True),MaxPool2d(kernel_size=2,stride=2),#定义另一个2D卷积层Conv2d(4,4,kernel_size=3,stride=1,padding=1),BatchNorm2d(4),ReLU(inplace=True),MaxPool2d(kernel_size=2,stride=2),)self.linear_layers=Sequential(Linear(4*7*7,10))#前项传播defforward(self,x):x=self.cnn_layers(x)x=x.view(x.size(0),-1)x=self.linear_layers(x)returnx现在我们调用这个模型,定义优化器和模型的损失函数:#定义模型model=Net()#定义优化器optimizer=Adam(model.parameters(),lr=0.07)#定义loss函数criterion=CrossEntropyLoss()#检查GPU否能用iftorch.cuda.is_available():model=model.cuda()criterion=criterion.cuda()print(model)这是模型的架构。

我们有两个卷积层和一个线性层。接下来,我们将定义一个函数来训练模型:deftrain(epoch):model.train()tr_loss=0#提供训练集x_train,y_train=Variable(train_x),Variable(train_y)#提供检验集x_val,y_val=Variable(val_x),Variable(val_y)#切换为GPU格式iftorch.cuda.is_available():x_train=x_train.cuda()y_train=y_train.cuda()x_val=x_val.cuda()y_val=y_val.cuda()#清理梯度optimizer.zero_grad()#预测训练与检验集output_train=model(x_train)output_val=model(x_val)#计算出来训练集与检验集损失loss_train=criterion(output_train,y_train)loss_val=criterion(output_val,y_val)train_losses.append(loss_train)val_losses.append(loss_val)#改版权重loss_train.backward()optimizer.step()tr_loss=loss_train.item()ifepoch%2==0:#输入检验集lossprint('Epoch:',epoch+1,'','loss:',loss_val)最后,我们将对模型展开25个epoch的训练,并存储训练和检验损失:#定义轮数n_epochs=25#空列表存储训练集损失train_losses=[]#空列表存储检验集损失val_losses=[]#训练模型forepochinrange(n_epochs):train(epoch)可以显现出,随着epoch的减少,检验损失渐渐增大。让我们通过绘图来可视化训练和检验的损失:#所画出有loss曲线plt.plot(train_losses,label='Trainingloss')plt.plot(val_losses,label='Validationloss')plt.legend()plt.show()啊,我讨厌想象的力量。

我们可以确切地看见,训练和检验损失是实时的。这是一个好迹象,因为模型在检验集上展开了很好的一般化。让我们在训练和检验集上检查模型的准确性:#训练集预测withtorch.no_grad():output=model(train_x.cuda())softmax=torch.exp(output).cpu()prob=list(softmax.numpy())predictions=np.argmax(prob,axis=1)#训练集精度accuracy_score(train_y,predictions)训练集的准确率大约为72%,非常不俗。

让我们检查检验集的准确性:#检验集预测withtorch.no_grad():output=model(val_x.cuda())softmax=torch.exp(output).cpu()prob=list(softmax.numpy())predictions=np.argmax(prob,axis=1)#检验集精度accuracy_score(val_y,predictions)正如我们看见的损失,准确度也是实时的-我们在检验集获得了72%的准确度。为测试集分解预测最后是时候为测试集分解预测了。

我们将读取测试集中于的所有图像,继续执行与训练集完全相同的预处理步骤,最后分解预测。所以,让我们开始读取测试图像:#写入测试图test_img=[]forimg_nameintqdm(test['id']):#定义图片路径image_path='test_ScVgIM0/test/'+str(img_name)+'.png'#加载图片img=imread(image_path,as_gray=True)#归一化像素img/=255.0#切换为浮点数img=img.astype('float32')#加到到列表test_img.append(img)#切换为numpy数组test_x=np.array(test_img)test_x.shape现在,我们将对这些图像展开预处理步骤,类似于我们之前对训练图像所做到的:#切换为torch格式test_x=test_x.reshape(10000,1,28,28)test_x=torch.from_numpy(test_x)test_x.shape最后,我们将分解对测试集的预测:#分解测试集预测withtorch.no_grad():output=model(test_x.cuda())softmax=torch.exp(output).cpu()prob=list(softmax.numpy())predictions=np.argmax(prob,axis=1)用预测更换样本递交文件中的标签,最后留存文件并递交到排行榜:#用预测更换sample_submission['label']=predictionssample_submission.head()#留存文件sample_submission.to_csv('submission.csv',index=False)你将在当前目录中看见一个取名为submission.csv的文件。你只必须把它上传遍问题页面的解决方案检查器上,它就不会分解分数。

链接:https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-apparels/?utm_source=blog&utm_medium=building-image-classification-models-cnn-pytorch我们的CNN模型在测试集上得出了约71%的准确率,这与我们在上一篇文章中用于非常简单的神经网络获得的65%的准确率比起是一个相当大的变革。结尾在这篇文章中,我们研究了CNNs是如何从图像中萃取特征的。

他们协助我们将之前的神经网络模型的准确率从65%提升到71%,这是一个根本性的变革。你可以尝试用于CNN模型的超强参数,并尝试进一步提高准确性。

要调优的超强参数可以是卷积层的数量、每个卷积层的滤波器数量、epoch的数量、仅有相连层的数量、每个仅有相连层的隐蔽单元的数量等。-皇家国际官网。

本文来源:皇家国际-www.faydress.com

热门推荐