1.数字图像识别

2023-10-30

传送门:https://www.lintcode.com/ai/digit-recognition/overview

题目描述

MNIST是计算机视觉领域的“hello world”数据集。 自1999年发布以来,这种手写图像的经典数据集已经成为基准分类算法的基础。 随着新的机器学习技术的出现,MNIST仍然是研究人员和学习者的可靠资源。

这个题目,您的目标是正确识别数以万计的手写图像数据集中的数字。
每一张图片,图片里面写了一个数字可能是0-9,然后需要设计算法判断出这个数字是0-9中哪一个数字。 我们鼓励您尝试不同的算法,以便第一手掌握哪些方法或者技术可行。

小提示

  • 若对神经网络比较熟悉,可以直接建立一个单层神经网络,输入是784个像素,经过一个全链接层,然后激励函数和softmax,输出为一个one-hot编码的预测结果,共10个类别,分别代表0-9,选择对应概率最大的作为预测数字。

  • 以上是没有数据预处理的方法。但如果我们对数据做一个小处理:比如提取每行像素值最大的元素和每列最大的元素,则输入数据从784维降到了28+28=56维。这个时候再经过一个单层神经网络,也可以获得一个很好的预测结果,而且由于数据降维,我们的训练时间会大大减少。

先修技能:

术语解释

  • Neural Network:在机器学习和认知科学领域,人工神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具。典型的神经网络具有以下三个部分:

    1、结构:结构指定了网络中的变量和它们的拓扑关系。例如,神经网络中的变量可以是神经元连接的权重和神经元的激励值。

    2、激励函数:大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。一般激励函数依赖于网络中的权重(即该网络的参数)。

    3、学习规则:学习规则指定了网络中的权重如何随着时间推进而调整,这一般被看做是一种长时间尺度的动力学规则。一般情况下,学习规则依赖于神经元的激励值,它也可能依赖于监督者提供的目标值和当前权重的值。例如,用于手写识别的一个神经网络,有一组输入神经元,输入神经元会被输入图像的数据所激发。在激励值被加权并通过一个函数(由网络的设计者确定)后,这些神经元的激励值被传递到其他神经元。这个过程不断重复,直到输出神经元被激发。最后,输出神经元的激励值决定了识别出来的是哪个字母。

  • SVM:在机器学习中,支持向量机(SVM)是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个。SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独类别的实例被尽可能宽的明显的间隔分开。然后,将新的实例映射到同一空间,并基于它们落在间隔的哪一侧来预测所属类别。

  • KNN:在模式识别领域中,最近邻居法(KNN算法,又译K-近邻算法)是一种用于分类和回归的非参数统计方法。在这两种情况下,输入包含特征空间中的k个最接近的训练样本。在k-NN分类中,输出是一个分类族群。一个对象的分类是由其邻居的“多数表决”确定的。k个最近邻居(k为正整数,通常较小)中最常见的分类决定了赋予该对象的类别。若k = 1,则该对象的类别直接由最近的一个节点赋予。在k-NN回归中,输出是该对象的属性值。该值是其k个最近邻居的值的平均值。

评价

目标

本次比赛的目标是拍摄一个手写的单个数字的图像,并确定这个数字是什么。
对于测试集中的每个ImageId,请预测是什么数字。

评价

你提交的submission.csv文件,将使用准确率(accuracy)作为最后评判标准。

准确率(accuracy)是用来衡量算法预测结果的准确程度,具体指测试集中算法预测正确的数量占总数的比例。

Accuracy=\frac{TP+TN}{TP+FN+FP+TN}Accuracy=​TP+FN+FP+TN​​TP+TN​​

其中

TP,True Positive,将正类预测为正类的数目

FP,False Positive,将负类预测为正类数

TN,True Negative,将负类预测为负类数

FN,False Negative,将正类预测为负类数

采用PyTorch构建三层网络做识别预测。

MNIST_Train.py

#数据读取
import numpy as np
import csv
#训练数据存放的文件路径
mnist_path="./train.csv"
#使用numpy导入CSV文件
mnist_numpy=np.loadtxt(mnist_path,dtype=np.float32,delimiter=",",skiprows=1) 
#跳过第一行 csv文件的分隔符为, 
#print(mnist_numpy.shape)

#为确保数据格式正确,reshape成 n * 785 注:图片大小28*28=784,还有一个类别占用1列
train=mnist_numpy[:,1:785]
#print(train.shape)

#取出类别一列的数据
label=mnist_numpy[:,0].tolist()

#转换成PyTorch张量、添加梯度
import torch
train_data=torch.from_numpy(train)
train_data.requires_grad=True

label_data=torch.Tensor(label)
#print(label_data.shape)
#one_hot=torch.zeros(len(label_data),10)
#one_hot.scatter_(1,label_data,1)#转变为one-hot
#print(one_hot)

#定义模型
import torch.nn as nn
class MyModel(nn.Module):

    def __init__(self):
        super(MyModel,self).__init__()
        self.hidden1 = nn.Linear(784,1024)
        self.activation1 = torch.nn.ReLU()
        self.hidden2 = nn.Linear(1024,2048)
        self.activation2 = torch.nn.ReLU()
        self.output = nn.Linear(2048, 10)
        self.activation_out = torch.nn.Softmax()

    def forward(self, x):
        x = self.activation1(self.hidden1(x))
        x = self.activation2(self.hidden2(x))
        x = self.activation_out(self.output(x))
        return x

if torch.cuda.is_available():
    print("cuda可用")
    model = MyModel().cuda()
    train_data=train_data.cuda()
    label_data=label_data.long().cuda()
    print(model)
    print(train_data)

#定义损失 分类损失使用交叉熵
loss_function=nn.CrossEntropyLoss()

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

#定义训练过程
for epoch in range(1,10000):
    out = model(train_data)
    loss = loss_function(out,label_data)#先结果 后标签
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    out_label=out.argmax(dim=1)

    Result1=out_label.cpu().numpy()
    Result2=label_data.cpu().numpy()

    print("Epoch {} , Loss is {},Accuracy is {}".format(epoch,loss,(Result1==Result2).sum()/len(Result1)))

torch.save(model,'./MNIST_LinearModel.pkl')

MNIST_Test.py

#模型定义
import torch.nn as nn
class MyModel(nn.Module):

    def __init__(self):
        super(MyModel,self).__init__()
        self.hidden1 = nn.Linear(784,1024)
        self.activation1 = torch.nn.ReLU()
        self.hidden2 = nn.Linear(1024,2048)
        self.activation2 = torch.nn.ReLU()
        self.output = nn.Linear(2048, 10)
        self.activation_out = torch.nn.Softmax()

    def forward(self, x):
        x = self.activation1(self.hidden1(x))
        x = self.activation2(self.hidden2(x))
        x = self.activation_out(self.output(x))
        return x

#导入权重文件
import torch
model=torch.load('./MNIST_LinearModel.pkl').cuda()

#读取需要做预测的CSV文件
import numpy as np
test_path="./test.csv"
test_numpy=np.loadtxt(test_path,dtype=np.float32,delimiter=",",skiprows=1) #跳过第一行 csv文件的分隔符为,

input=torch.from_numpy(test_numpy).cuda()
out=model(input)
out_label=out.argmax(dim=1)


#将结果写回CSV文件
# 导入CSV
import csv
# 1. 创建文件对象
f = open('./result.csv','w',encoding='utf-8')
# 2. 基于文件对象构建 csv写入对象
csv_writer = csv.writer(f)
# 3. 构建列表头
csv_writer.writerow(["ImageId","Label"])
# 4. 写入csv文件内容
Result=out_label.cpu().numpy()
i=1
for label in Result:
    csv_writer.writerow([i,label])
    i=i+1
# 5. 关闭文件
f.close()

为了提高效果,本文将使用AlexNet网络(附上中英文对照个人翻译版-待更新):

                                                                                                                                                 摘要

我们训练了一个大型的、深度卷积神经网络,用于对ImageNet LSVRC-2010竞赛中的包含了1000个不同类别的1.2百万张高分辨率的图片进行分类。在测试数据中,我们获得了top-1错误率为37.5%,top-5错误率为17%的成绩,这比先前的最先进的模型都要优秀很多。这个新的模型,含有6千万个参数和650000个神经元,由5层卷积层配合最大池化层,以及3个全连接层组成,最后一层有1000个输出,这些输出经由softmax函数处理得到结果。为了使得训练更快,我们使用了非饱和神经元和一个非常高效的GPU实现卷积操作的方式。为了减少全连接层的过拟合现象,我们运用了一个最近刚刚被发明的正则化方法-drouput(随机丢弃),它被证明是十分有效的。我们也将这个模型的变体用于ILSVRC-2012竞赛中,并且以top-5测试错误率15.3%的成绩斩获了第一名,这比第二名的26.2%高出很多。

[注]top-1:指输出概率中最大的那个类别正确的概率;top-5:指输出概率中最大的5个中含有那个正确类别的概率;

1 引言

当前目标识别的都是充分利用了机器学习方法。为了提高他们的性能,我们能够手机大量的数据集,下也许带更加健壮的模型,并且使用更好的技巧预防过拟合。直到最近,带标签图像的数据集相对来说比较小,只有数以万计得到图片。简单的目标任务用这种规模的数据集足以很好解决,特别是他们使用了一些保留标签的变换进行数据增强的时候。例如,当前在MNIST手写数字数据集上的最好错误率(<0.3%)已经接近了人类的水平。但是现实场景中的目标具有相当大的可变性,所以学习识别这些目标是很有必要使用更大的训练集的。并且的确,小数据集的缺陷已经被广泛意识到了,但是仅仅最近才有可能手机百万数据量的标签数据集。这个新的大数据集包含LabelME和ImageNet,LabelMe数据集包含数十万的完全分割的图像,ImageNet包含超过22000个种类的共超过15000000张带标签的高分辨率图片。

为了从百万级的图片中认出数以千计的目标,我们需要一个具有很强学习能力的模型。但是,目标识别任务的巨大复杂性意味着这个问题即使使用像ImageNet这样庞大的数据集也不能被具体阐释,所以我们的模型也应该具有一些先验知识弥补我们没有方法获得全部数据导致的缺陷。卷积神经网络(CNNs)构成了这样一种模型[16,11,13,18,15,22,26]。他们的能力可以通过改变他们的深度和尺寸来控制,并且他们也能够针对自然图像做出强健且大部分情况下都正确的假设(也就是,考虑到数据的稳定性和像素间依赖的局部性)。因此,相比于具有类似尺寸的标准的前馈神经网络,CNNs具有更少的连接和参数,也正因为如此,他们相较之下更容易训练,尽管他们的理论最好表现可能相对来说会有一点点弱。

尽管CNNs具有许多吸引人的特性,并且尽管他们的局部结构相对高效,但是大规模运用在高分辨率图像中仍然代价高昂。幸运的是,当前的GPU,配合双显卡可以充分利用性能实现2维卷积,这将拥有足够强大的性能促进大型CNN网络的训练,并且最近的数据集如ImageNet,它包含足够的标签数据,这些数据可用来训练这个模型,也不会造成过拟合的问题。

这篇论文的详细贡献如下:我们训练了一个最大的卷积神经网络,针对了ImageNet数据集中被用在ILSVRC-2010和ILSVRC-2012竞赛中的那一部分子集,并且获得了比曾经报道在这些数据集上的指标更好的效果。我们写了一个充分利用GPU实现2维卷积的实现方式,所有的其他在训练卷积神经网络的过程中是固定的,我们公开提供了这些。我们的网络包含了若干新的以及不一般的特点,这些提升了它的性能,也减少了它的训练时间,这将在小节3详细阐述。我们的网络的尺寸使得过拟合成为一个重要的问题,甚至是在有1200万个打上了标签的训练样本的情况下,因此使用一些有效的技巧来预防过拟合,这些技巧将在小节4详述。我们最终的网络包含5个卷积层和3个全连接层,并且深度(通道数)似乎很重要:我们发现移除一些卷积层(每一个卷积层的参数量都没有超过模型的1%)会导致表现变差。

最后,网络大小的受限主要是受到了当前GPU的显存数量以及我们愿意等待的训练时间影响。我们的网络花费了5到6天在两张GTX 580 3GB的显卡上训练。我们所有的实验表明我们的结果,仅仅在等待更快的GPU并且更大的数据集的情况下,就能够被改进。

2 数据集

ImageNet是一个拥有超过22000个类共计1500万打上标签的高分辨率图像的数据集。这些图像是从网络上收集并由人工标注者使用亚马逊的 Mechanical Turk 众包工具打上标签。始于2010年,作为Pascal 视觉目标挑战赛的一部分,一年一度的被叫做ImageNet大规模视觉识别挑战赛举行。ILSVRC使用了ImageNet的一个子集,大约每个类别有1千张图片。总之,大约有1200张训练图片,50000张验证图片,以及150000张测试图片。

ILSVRC-2010是ILSVRC中的唯一一个拥有测试集标签的版本,所以它是我们用来测试实验结果性能时使用最多的版本。由于我们也在ILSVRC-2012竞赛中提交了模型,在第6节我们也说明了我们的模型在这个版本的数据集上的结果,这个数据集的测试集标签并不是可获得的(防作弊)。在ImageNet上,人们习惯于说明两个错误率:top-1和top-5,top-5错误率就是由模型推理出的具有最大可能性的5个类别标签中并不含有正确的类别标签的概率。

ImageNet由多种分辨率的图像组成,然而我们的系统需要一个恒定的输入维度。因此,我们将图像降采样到一个固定的分辨率 256 * 256。考虑一个矩形的图像,我们首先调整图像的大小,使得短边的长度变为256,然后从调整后的图像中裁剪出中心区域的 256*256大小的部分。我们不采用其他方式预处理图片,除非是为了减去训练集上的像素均值。因此我们在(中间部分的)未经处理的RGB通道的像素值。

3 网络结构

我们网络的结构在图2中概述。它包含了8个可学习的层,5个卷积层和3个全连接层。下面,我们描述一些我们网络结构的创新颖的或者说不平常的特点。节3.1-3.4的顺序安排是根据我们对他们带来的提升评估安排的,最重要的放在第一个。

3.1 ReLU 非线性单元

标准的模仿神经元输出f的方式就是用一个关于输入x的函数,像f(x) = tanh(x)或者f(x)=(1+e^{-x})^{-1}。从梯度下降的训练时间来说,这些饱和非线性单元比非饱和非线性单元f(x)=max(0,x)要慢得多(饱和指梯度接近于0,当处于函数饱和区时,梯度下降算法运行的很慢)。跟随Nair和Hinton的步伐,我们提出携带了这种非线性单元如线性整流单元的神经元(ReLUs)。携带ReLU深度卷积神经网络比携带tanh函数的同结构网络训练的更快。这在图1中得到了论证,这张图展示了对于一个特定的四层卷积网络,使用这两种激活函数在CIFAR-10数据集上想要达到25%的训练错误情况需要的迭代次数。这张图展示了如果我们使用传统的饱和神经元模型,我们或许不能用如此大的神经网络做实验。

我们不是第一个=批考虑传统CNNs中神经元模型替代物的那群人。例如,Jarrett宣称在Caltech-101数据集上,非线性单元f(x)=|tanh(x)|后接上平均池化与对比度归一化一起运行地非常好。但是,在这个数据集上,最重要的关注点还是预防过拟合,因此他们所关注的影响并不同于我们所指出的当使用ReLU时加速网络拟合训练数据的能力。更快的学习对于训练在大型数据集上的大型网络模型具有很重大的影响。

图1:一个4层的携带ReLU(实线)卷积神经网络在CIFAR-10数据集上得到25%的错误率只需要6个周期,比同样结构下使用tanh神经元(虚线)的网络要快得多。他们各自的学习率都是选择了使得训练速度最快的。没有运用正则化方法。这个效果的重要性有力地论证了网络结构的修改,携带了ReLU的网络始终比使用了饱和神经元的网络学习的时间要短。

3.2 多显卡训练

一张GTX 580 显卡只有3GB的显存,这限制了能够在它上面训练的最大网络的规模。结果120万的训练样本足够训练这个网络,但是网络因为太大而不能在一张显卡上进行拟合。因此我们将网络分割在两张显卡上。目前的GPU能够很好地做到GPU并行交火,因为他们能够直接读写另一方的显存,而不需要经过机器的内存。我们实施的并行化处理方式本质上是将一般的核(或者说神经元)放置在各自的显存中,还有一个小技巧:GPU的数据交互旨在一些特定的层。这意味着,例如,第三层的核将第二层的映射结果当作输入。但是,第四层的核只会从的第三层的映射输出中拿到输入,这都是在同一张显卡上的。选择连接方式是交叉验证的一个问题,但是这将允许我们精确地调整交流的数量直到它是一个可接受的运算中的很小一部分。

因此而产生的结构与Cirespan提出的“columnar”CNN有些类似,除了我们的列并不是的独立的。这个方式与只在一张显卡上训练一般的的卷积层核的网络相比,降低了1.7%的top-1错误率和1.2%的top-5错误率。训练双GPU网络比单GPU网络略微节省了点时间。

3.3 局部响应标准化

ReLUs有可取的属性,他们不要求输入的标准化来防止他们陷入过饱和。如果至少一些训练样本造成了ReLU的输入是正数,那么这个神经元就会得到学习。但是,我们仍然发现下面的局部归一化能够帮助归纳。用a_{x,y}^i表示运用卷积核i在(x,y)位置上得到的神经元的响应值,然后运用ReLU非线性单元,响应归一化值b_{x,y}^i可由如下公式计算得到:

                                                                                                                                                                                                    b_{x,y}^{i}=a_{x,y}^{i}/(k+\alpha \sum_{j=max(0,i-n/2)}^{max(N-1,i+n/2)}(a_{x,y}^{j})^2)^\beta

这个和的计算是依靠n个"相邻的"核图在图像上相同而空间位置计算得到的,N是这一层的总的核个数。在训练开始之前,核图的排列理所当然是任意的且固定的。这种响应归一化实现了一种真正的神经元能实现的横向抑制激活,创造了使用不同核计算得出的神经元高响应输出之间的竞争。常量k,n,\alpha , \beta都是超参数,它们的值使用验证集来决定;我们使用k=2,n=5,\alpha =10^{-4}, \beta=0.75;我们在某些特定的层的ReLU非线性单元输出后运用了标准化(详见节3.5)。

这个操作与Jarrett提出额局部响应标准化存在一定的相似性,但是我们的网络能被更准确地称之为"白度标准化(白化)",因为我们并没有减去平均值。响应标准化各自将我们的top-1错误率降低了1.4%,将我们的top-5错误率降低了1.2%。我们也在CIFAR-10数据集上验证了这个操作带来的效果:一个四层的CNN在不带有百花操作时获得13%的测试错误率,在带有白化操作时获得11%错误率。

3.4 重叠池化

CNNs(卷积神经网络)中的池化层对处于同一个核内的相邻输出单元做了一个整合。传统上,相邻单元的整合是通过没有重叠的相邻池化单元完成的(例如核大小为17*17,11*11,4*4)。为了更加精确,一个池化层可以被认为是由一个网格上间隔一个像素的池化单元组成,每一个单元整合了以这个池化单元所在中心周围的z*z个相邻输入单元。如果我们设 s = z,我们获得传统上普遍应用于CNNs的局部池化。如果我们设 s < z,我们就获得了带像素重叠的池化(z为池化核大小,s为池化步长)。在我们的网络中,我们设定s=2且z=3。这个方案与使用s=2且z=2的非重叠池化方案相比,在同样的输出维度下,将我们的top-1错误率降低了0.4%,top-5错误率降低了0.3。我们在训练带有重叠池化的模型时发现它有些许不容易过拟合(重叠池化有一些放止过拟合的效果)。

3.4 总体结构

现在我们准备描述我们的CNNs的大体结构。正如图2描绘的那样,这个网络包含八层带权重的层,首先是5层卷积层,然后是3层全连接层。最后一层全连接层的输出的1000个值被用来做softmax,这将产生一个高达1000个类别标签的概率分布。我们的网络最大化了多项逻辑回归目标,这等价于最大化了在预测分布条件下的正确标签的概率的训练样本的均值。

第二、四、五层的卷积层仅仅被连接到这些在前层的核图(卷积后输出的特征图),这些前层分布在同样的GPU上(见图2)。第三层的卷积核被连接到第二层的所有核图。全连接层的神经元被连接到前层的所有神经元。响应标准化层跟在第一、第二层的卷积层后面。我们在节3.4锁描述的这种最大池化层,分布在响应归一化层核第五层卷积层的后面。ReLU这个非线性单元被应用在每一层卷积层和全连接层。

图2:这是我们CNNs结构的图,清晰地展示了在两个GPU之间的任务轮廓。一个GPU运行包含图像的顶层部分,另一个运行底层部分。GPU仅仅在特定的层进行数据交互。网络的输入是150,528维,并且网络中剩余的层的神经元数量为253,440-186,624-64,896-64,896-43,264-4096-4096-1000。

第一个卷积层使用96个核对输入的224*224*3的图形进行卷积,每个核的尺寸为11*11*3,步长为4个像素,(这个就是在一个核图上相邻单元的感受野的中心距离)。第二层卷积层采用的输入是第一层卷积层的输出,并且携带了256个过滤器,每个过滤器的尺寸为5*5*48。第三、第四、第五层被连接,之间没有池化层和标准化层。第三层有384个核(384组过滤器),每个核的尺寸为3*3*256,他们被连接到第二层卷积层的输出。第四个卷积层有384个核,每个核的尺寸为3*3*192,并且第五个卷积层有256个核,每个核的尺寸为3*3*192。每个全连接层有4096个神经元。

4 减少过拟合

我们的神经网络结构有6亿个参数。尽管ILSVRC的1000个类别使得每个训练样本采用映射上的有限的10位将图像转换为标签,但是这被证明是很容易在学习这些参数的过程中造成过拟合。下面,我们将叙述我们用于防止过拟合的两个初级方法。

4.1 数据增强

最简单且普遍的防止对图像数据产生过拟合的方法是使用保存标签的变化对数据集进行人工增强(标签的变换与图像的变换相对应,如图像旋转,bounding box也跟着旋转)。我们采用了两种清晰的数据增强形式,这两个都允许从原始图像进行少许的计算就可以生成变化后的数据,所以甚至没有必要特地在硬盘存储下这些变换后的数据。在我们的实现中,转换图像的工作由Python代码在进行以前批次的图像训练的同时在GPU上完成。实际上,这些数据增强的方法是不太消耗计算资源的。

第一种形式的数据增强包括生成图像映射和水平镜像。我们完成这种操作通过在256*256的图像上随机提取224*224个块(以及他们的水平镜像),并且使用这些提取出来的块训练我们的网络。这通过2048的一个因子增加了我们的训练集。当然,尽管这个结果的训练样本是高度依赖的。没有这个方案,我们的网络就很容易过拟合,这回强制我们使用小得多的网络。在测试阶段,网络通过对输入提取5块224*224的区域(5块区域为四个顶角和中心区域)以及他们的水平镜像(总共10块区域)进行预测,并且对应用在10块的上的网络的softmax层的输出进行了值的平均。

第二种数据增强的方式包括修改训练图像上的RGB通道的数据密度。特别地,我们对ImageNet训练集图像的RGB像素值采用了PCA(主成分分析)。对于每一个训练图像,我们增加了多种已建立的主成分,伴随着振幅比例相应的特征值乘上从均值为0标准差为0.1的高斯分布中获取的随机值。因此对于每一个RGB图像的像素向量I_{xy}=[I_{xy}^{R},I_{xy}^{G},I_{xy}^{B}],我们使用了如下的量:

                                                                                                         [p_1,p_2,p_3][\alpha_1\lambda_1,\alpha_2\lambda_2,\alpha_3\lambda_3]^T

在这个公式中,p_i\lambda_i是RGB像素值的协方差矩阵的第i个特征向量与特征值,且\alpha_i是上述的随机值。对于一张特定的训练图像而言,直到这幅图像再次用于训练之前,每一个\alpha_i只产生一次,再次训练时会重新生成\alpha_i。这个方案大概捕捉了自然图像的一个重要属性,也就是说,目标的识别对于密度或者颜色的亮度是恒定的(也就是说不受影响)。这个方案将top-1错误率将降低了1%。

4.2 丢弃

结合预测的许多不同的模型的预测是一个减少错误率的十分成功的方法[1,3],但它似乎对于大型的神经网络来说是代价高昂的,特别是那种已经花费了好几天训练的大型网络。但是,这有一个很高效的模型结合版本,这使得训练时间只需要1/2。这个最近被发明的技术,叫做"drouput"[10],它的实现是对于每个隐层的输出都有0.5的概率置为0。用这种方式"丢弃"的神经元不会影响前向传播,也不会参与反向传播。所以每一次输出被展现的时候,神经网络都好像是不同的结构,然而这些不同的结构是共享权重的。由于一个神经元不能依靠特定的其他神经元的存在,因此这项技术减少了神经元复杂的相互适应。因此,它强制学习更多健壮的特征,这对于每个神经元与许多不通的随机子集的连接来说是有用的。在测试阶段,我们使用所有的神经元,但是将他们的输出*0.5,这对于采用由数量指数级多的drouput网络预测分布的几何平均是一种合理的近似。

5 训练的细节

我们使用一个批次大小为128个样本的随机梯度下降算法训练了我们的模型,动量为0.9,权重衰减为0.0005。我们发现这个值很小的权重衰减对于模型的训练来说很重要,这里的权重衰减不仅仅是一个正则项:他减少了模型的训练误差。权重w的更新规则为:

                                                                                    w_{i+1}\ :=\ 0.9*w_i-0.0005*\epsilon *w_i-\varepsilon <\frac{\partial L}{\partial w}|w_{i}>_D_{i}

                                                                                                               w_{i+1}\ :=\ w_i + w_{i + 1}

图3:尺寸为11*11*3的96个卷积核(一个卷积核对应一组滤波器)由第一层卷积层在224*224*3的输入图像上进行学习。前48个在GPU1上训练,后48个在GPU2上训练。节6.1有更多细节。

i是迭代次数,v是动量变量,\epsilon是学习率,<\frac{\partial L}{\partial w}|w_{i}>_D_{i}是第i个批次的梯度平均值,D_i是由W_i估计的目标W的衍生值。

我们从一个均值为0、标准差为0.01的高斯分布中取值用于初始化每一层的权重。我们也对第二、第四、第五层卷积层的偏置值进行了初始化,同时还有隐藏层中的全连接层,将他们设置为1。这种初始化方案通过提供正值给ReLU函数们,加速了早期的学习。我们初始化剩下的层的神经元的偏置值为0。

我们对所有的层都是用相同的学习率,在训练过程中我们会手动调整学习率。我们遵从了这项启发,当使用当前的学习率使得验证集错误率停止上升,我们就将学习率除10。学习率被初始化为0.01并且直到结束前会衰减3次。我们使用一个包含1200万张的图像的训练集在两张NVIDIA GTX 580 3GB的显卡上训练了网络大概90个周期,这总共花费了5-6天。

6 结果

我们在ILSVRC-2010的结果被总结在表1中。我们的网络在测试集上的top-1错误率为37.5%,top-5错误率为17.0%。在ILSVRC-2010竞赛中的最好成绩为top-1错误率47.1%,top-5错误率为28.2%,它使用的方法为平均6个针对不同特征的稀疏编码模型的预测结果。之后最好的发表结果为45.7%和25.7%,采用的方法为平均化两个训练在Fisher Vectors上的分类器的预测结果,他们从两种浓密采样的特征中得出。

表1:与ILSVRC-2019测试集的表现结果相比。斜体字表示的结果为最优的。

我们也开始着手准本我们的模型,用于ILSVRC-2012竞赛,并且在表2报告我们的成果。由于ILSVRC-2012的测试集标签并不是公开的,我们无法报告我们训练的所有模型的测试错误率结果。在这幅图的剩余部分,我们交替地使用验证和测试误差率,因为根据我们的经验他们的误差不会超过0.1%(见表2)。这部所述的CNN结构得到的top-5错误率只有18.2%。平均化5个相似的CNN网络的预测结果后,top-5错误率为16.4%。训练一个CNN,在最后一层池化层前面有6层卷积层,这是为了对发布的整个ImageNet Fall 2011进行分类的训练(这个数据集有1.5亿张图片,2200个类别),再使用ILSVRC-2012进行微调,获得了16.6%的错误率。平均化我们在整个已经发布的的Fall 2012数据集上预训练的两个CNN,与上述的5个CNN一同,我们得到的错误率只有15.3%。竞赛的第二名错误率为26.2%,使用的方法为对一些分类器取平均,这些分类器是使用不同种类的密集特征计算得到的FVs进行训练的。

6 质量评估

图3展示了学习到的网络的数据连接的卷积层。这个网络学习到了许多带有频率和方向选择性的核,还有许多有颜色的斑点。注意这种使用两张GPU的特别的展现方式,这是节3.5所描述的有限连接的结果。在GPU1上的核大部分都没有感知到颜色的存在,而GPU2上的核大都特别注意了颜色信息。这种专一性每次运行都会发生,并且与任何特定的随机权重初始化无关(对GPU群的编号取模)。

图4:(左边)有8张来自于ILSVRC-2010测试集中的图片以及由我们的模型推理出来的他们的5个概率大的标签。图片下面直接写的是正确的标签,正确的标签对应的概率由红色进度条展示(如果正确的标签出现在这5个类别中)。(右边)5张ILSVRC-2010的测试集图片在第一列。剩下的列显示了6张训练中的图,这些图来自于最后一层隐藏层的特征向量,从测试图片得到的特征向量的欧氏距离最小。

在图4的左半边图像块中,我们通过计算模型在这8张测试图片上的top-5预测,从质量上评估了网络学习到的东西。注意到这些图片甚至由不处在图片中心位置的目标,例如左上角那幅图像中的螨,是能够被网络识别的。大部分的top-5标签输出都是合理的(含有正确标签且其概率值较高)。例如,仅仅另一些类别的猫会被认为是相似的豹。在一些例子中(铁栅栏,樱花),关于图像本身到底应该关注哪一个是存在歧义的。

另一种观察网络学习到的视觉方面的知识的方法是考虑一张图像在最后一层4096维度的隐藏层输出的特征激活值。如果两幅图生成的特征激活向量之间的差距很小,我们可以认为更高级的神经网络会认为他们就是相似的。图4展示了5副来自于测试集的图像以及6副来自于训练集的图像,这些图像采用上述的相似性判定方法可知他们是相似的。注意在像素级别,被检索出来的训练图像通常不会在第一列的L2范数上得到意味着很接近的结果。例如,被检索到的狗们和大象们会以各种各样的姿态出现在图片中。我们在补充材料中会对更多的测试图片呈现我们的结果。

在两个4096维度的向量间通过计算欧氏距离来判断他们的相似性,这种方式对于真值向量是很低效的,但它不能通过训练一个自动的编码器压缩这些向量去剪短2进行代码来变得高效。与对每一行的像素应用自编码器相比,这应该产生一个更好的图像检索方法,因为自编码器不能利用图像标签并且因此有一种使用相似的边缘模式的趋势,而不管他们是否是语义上相关的。

7 讨论

我们的结果展示了一个大型的深度卷积网络通过使用纯粹的有监督学习方法在一个具有高度挑战性的数据集上能够获得打破记录的结果。值得注意的是,如果移除一层,我们网络的性能会变差。例如,移除中间的任何一层后,我们的网络在top-1指标上会损失2%的正确率。所以为了获得我们实验得到的结果,深度是非常重要的。

为了简化我们的实验,我们步使用任何的无监督预训练方案,即使我们预期这个方案是有帮助的,特别是当我们获得足够的计算能力能够极大地增大我们的网络尺度,而不需要获得相应的标签数据量的增加。说到这儿,随着我们使得我们的网络更大并且训练它更久,我们的结果提高了,但是我们仍然有许多数量级的神经元,这是为了与人类视觉系统的下颞叶路径相匹配。最终我们将要在视频序列上使用非常大得到深度卷积网络,在视频序列上,实时的结构会提供非常有用的信息,而这些信息在静态图片上会少得多甚至是完全没有。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1.数字图像识别 的相关文章

  • 【Java基础】接口和多态

    文章目录 1 接口 1 1 概述 1 2 抽象方法的定义和使用 1 3 默认方法的定义和使用 1 4 静态方法的定义和使用 1 5 私有方法的定义和使用 1 6 接口的常量定义和使用 1 7 总结 1 8 注意事项 1 9 接口之间的多继承
  • LeetCode 1828. 统计一个圆中点的数目

    给你一个数组 points 其中 points i xi yi 表示第 i 个点在二维平面上的坐标 多个点可能会有 相同 的坐标 同时给你一个数组 queries 其中 queries j xj yj rj 表示一个圆心在 xj yj 且半
  • element ui transfer 穿梭框 分页实现,接口获取、更新数据

    使用穿梭框数据量大时需要分页 官方的组件并不能满足需求 数据大时不分页一次渲染页面卡 通过重新修改官方源码 封装实现分页 1 新建TransferPanel 组件 根据官方源码修改适配
  • Harmony OS 网络编程 实验指南

    netcat简介 netcat 是什么 netcat是一个非常强大的网络实用工具 可以用它来调试TCP UDP应用程序 netcat 如何安装 Linux上可以使用发行版的包管理器安装 例如Debian Ubuntu上 sudo apt g
  • 旧键盘 C语言

    题目 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及实际被输入的文字 请你列出肯定坏掉的那些键 输入格式 输入在 2 行中分别给出应该输入的文字 以及实际被输入的文字 每段文字是不超过 8
  • 用Python写了一个水果忍者小游戏,(入门必备)

    水果忍者的玩法很简单 尽可能的切开抛出的水果就行 今天就用Python简单的模拟一下这个游戏 在这个简单的项目中 我们用鼠标选择水果来切割 同时炸弹也会隐藏在水果中 如果切开了三次炸弹 玩家就会失败 一 需要导入的包 import pyga
  • 如何编辑简单打字游戏

    先来简单看一下要求 一 我们可以先编写Player类 先把属性定义好 然后进行封装 public class Player private String name 定义姓名 private int lvlNo 1 定义级别编号为1 priv
  • 华为OD机试真题- 去除多余空格【2023Q1】【JAVA、Python、C++】

    题目描述 去除文本多余空格 但不去除配对单引号之间的多余空格 给出关键词的起始和结束下标 去除多余空格后刷新关键词的起始和结束下标 条件约束 1 不考虑关键词起始和结束位置为空格的场景 2 单词的的开始和结束下标保证涵盖一个完整的单词 即一
  • priority_queue 优先队列概念以及常见用法

    目录 1 priority queue简单介绍 2 priority queue代码测试 1 priority queue简单介绍 在优先队列中 元素被赋予优先级 按约定的函数来赋予优先级 底层通过堆来实现 当访问元素时 具有最高优先级的元
  • Pandas小白入门散记(3)---Series.str--源代码定位问题

    文章目录 问题点 原因解释 碰到了 一个错误 debug才定位到问题 记录一下 本次最大收获是 pandas果然代码逻辑复杂 一个小小的异常捕捉 处处是门道 希望本次浅显的代码阅读过程 给你有小小的启发 愿您多读复杂代码 提升自我 问题点
  • Targan 算法[有向图强连通分量]

    有向图强连通分量 在有向图G中 如果两个顶点间至少存在一条路径 称两个顶点强连通 stronglyconnected 如果有向图G的每两个顶点都强连通 称G是一个强连通图 非强连通图有向图的极大强连通子图 称为强连通分量 strongly
  • 标题hadoop源码编译报错

    标题hadoop源码编译报错 最近在学习hadoop的过程中 遇到了许多问题在这里记录下 没想到在源码编译的时候就卡了好久 现在简单说下我的问题 这是我编译hadoop所安装的jar包 网上的教程一搜一大堆 我也是按照文档一步步进行的 没想
  • 机器学习之决策树(实战)

    决策树 什么是决策树 信息增益 熵 基尼指数 熵 基尼指数 CART 算法模型实战 分类树 树的可视化 回归树 总结 什么是决策树 决策树是一种树形结构 其中每个内部节点表示一个属性上的判断 每个分支代表一个判断结果的输出 最后每个叶节点代
  • jpa limit查询_spring data jpa 分页查询

    法一 本地sql查询 注意表名啥的都用数据库中的名称 适用于特定数据库的查询 public interface UserRepository extends JpaRepository Query value SELECT FROM USE
  • 带圈圈的数字1~50,求50以上,不要word的

    带圈圈的数字1 50 求50以上 不要word的 posted on 2018 04 25 16 07 jony413 阅读 评论 编辑 收藏 转载于 https www cnblogs com jony413 p 8945365 html
  • 微信小程序悬浮框实现

    最近在公司负责微信小程序 小程序相比html JavaScript更加简单 很多接口直接就给了 所以我们直接利用就好了 下面说正题 微信小程序悬浮框实现 效果图如下 做了一个随时拨打客服电话的悬浮框 1 第一种 目录结构如下 index j
  • 关于golang性能调试及pprof可视化

    golang支持使用pprof进行可视化性能检测 打开powershell 在需要性能可视化的文件夹下输入 go test bench cpuprofile cpu out 得到一个 out文件 接着输入 go tool pprof cpu
  • 计算机网络知识点汇总(考研用)——第一章:计算机网络体系结构

    计算机网络知识点汇总 考研用 第一章 计算机网络体系结构 本文参考于 2021年计算机网络考研复习指导 王道考研 计算机网络 思维导图 文章目录 计算机网络知识点汇总 考研用 第一章 计算机网络体系结构 1 计算机网络体系结构 1 1 计算
  • 145句经典诗句

    1 知我者 谓我心忧 不知我者 谓我何求 诗经 王风 黍离 释义 了解我心情的人 认为我心中惆怅 不了解我心情的 还以为我呆在这儿有什么要求呢 2 人而无仪 不死何为 诗经风相鼠 释义 人活着如果不重视礼仪 那么就如同死人 3 言者无罪 闻

随机推荐

  • 关于工牌(必须5-10个字)

    今天蹲坑 低头看了下工牌觉得挺有意思 我从啥时候起也不排斥将工牌挂在脖子上了 工牌 一个标识 不仅标识了你 也标识了你所在的群体 如果你认可这个群体 佩戴它那是一种荣誉 荣耀 如果你不认可这个群体 佩戴它就是耻辱 羞辱 尤其挂到脖子上 那不
  • 使用机器学习算法预测航班价格

    一 前言 机票价格的预测一直是航空业和旅行者关注的重要问题之一 随着航空业的快速发展和市场竞争的加剧 正确预测机票价格对于航空公司的利润最大化和旅行者的预算规划至关重要 在过去 人们通常依靠经验和市场趋势来预测机票价格 但这种方法往往存在不
  • Qt宏定义

    1 QT BEGIN NAMESPACE 在qglobal h中 我们可以看到以下两句胡宏定义 define QT BEGIN NAMESPACE namespace QT NAMESPACE define QT END NAMESPACE
  • Java中有关锁的面试题

    sychronized修饰普通方法和静态方法的区别 什么是可见性 对象锁是用于对象实例方法 或者一个对象实例上的 类锁是用于类的静态方法或者一个类的class对象上的 类的对象实例可以有很多个 但是每个类只有一个class对象 所以不同对象
  • 静态成员(static)

    今天整理了一下关于静态的一些知识点 可能有些没有整理到 或者理解有纰漏 大家不妨看看 不足之处 恳请大家斧正 在静态类中 静态类中不能调用非静态类的实例成员 静态类中不能有非静态构造函数 但是可以有静态构造函数 静态构造函数也可以存在于非静
  • D361周赛复盘:模拟分割整数⭐+变为整除的最小次数⭐

    文章目录 2843 统计对称整数的数目 模拟 分割整数为两部分 思路 1 整数换成字符串版本 2 直接用整数的版本 2844 生成特殊数字的最小操作 模拟 x能被Num整除的条件 思路 完整版 2843 统计对称整数的数目 模拟 分割整数为
  • 微信小程序超详细入门简介和使用

    微信小程序 介绍 微信小程序 简称小程序 英文名Mini Program 是一种不需要下载安装即可使用的应用 它实现了应用 触手可及的梦想 用户扫一扫或搜一下即可打开应用 微信小程序做项目的必备基础 小程序的前世今生 小程序开发者工具 小程
  • Chatgpt API调用报错:openai.error.RateLimitError

    Chatgpt API 调用报错 openai error RateLimitError You exceeded your current quota please check your plan and billing details
  • 常用图像增强方法,利用tf.keras来完成图像增强

    学习目标 知道图像增强的常用方法 能够利用tf keras来完成图像增强 大规模数据集是成功应用深度神经网络的前提 例如 我们可以对图像进行不同方式的裁剪 使感兴趣的物体出现在不同位置 从而减轻模型对物体出现位置的依赖性 我们也可以调整亮度
  • allure在python环境下的集成使用

    python环境下 集成allure 首先打开Allure官网 https docs qameta io allure 选择对应平台的安装方式 最下面有通用安装方法 1 去maven central下载一个新版本的zip 2 下载到本地后解
  • 【手写一个RPC框架】simpleRPC-02

    目录 前言 实现 项目创建 依赖配置 common service client server 文件结构 运行 本项目所有代码可见 https github com weiyu zeng SimpleRPC 前言 在simpleRPC 01
  • Flask - 应用上下文

    目录 一 应用上下文 二 current app 在任何地点 获取flask app对象 三 g 单次请求的数据存储字典
  • 关于Unity3D中的Debug类的一些函数内容

    这篇文章主要是我对Debug类中的一些个人理解以及一些Debug的方法 请大家理性阅读 有错误可以私聊本人指出 Unity3DEngine Debug 这中间可能包含了一些常用的debug方法 比如下面这个黑科技 这是我在学习debug类的
  • 实时脑波和眼动连通性分析 python-(3)

    实时提取脑波的delta theta alpha beta 对于baseline的比率差 import os import pandas as pd import numpy as np def mkdir path 3 folder os
  • 使用rke2安装高可用k8s集群

    文章目录 使用rke2安装高可用k8s集群 使用rke2安装高可用k8s集群 服务器rke集群节点角色规划 用户 主机名 内网IP SSH端口 系统 角色 root rke server 01 192 168 2 131 22 CentOS
  • MySql操作笔记(表查看、删除、行数据删除...)

    1 显示表的结构 1 desc table name 2 describe table name 3 show columns from table name 2 显示表中所有内容 select from table name 3 行数据删
  • RS232以及RS485的一些理解

    今天 在吾爱PLC网站上阅读了关于PLC通讯的相关知识 讲得十分详细 之前一直搞不懂RS232协议 RS485协议 MODBUS协议 通过前几天在十堰的实习 在口罩生产线上的对嵌入式板卡与伺服驱动器以及HMI的连接时 查阅了一些关于通讯的知
  • C++中构造函数调用其他函数

    include
  • TTMS课程设计 管理员板块 前端页面+使用技术总结

    文章目录 一 部分实现效果 二 使用技术 三 主要代码 1 jq ajax提交表单数据 2 数据分页 3 省市区三级联动 4 选择日期 5 渲染数据 6 Session Storage在页面存储数据 7 使用es6模板字符串 四 总结 1
  • 1.数字图像识别

    传送门 https www lintcode com ai digit recognition overview 题目描述 MNIST是计算机视觉领域的 hello world 数据集 自1999年发布以来 这种手写图像的经典数据集已经成为