传送门: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的基本知识:
会SVM或者KNN等分类器的使用
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+TNTP+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)=max(0,x)要慢得多(饱和指梯度接近于0,当处于函数饱和区时,梯度下降算法运行的很慢)。跟随Nair和Hinton的步伐,我们提出携带了这种非线性单元如线性整流单元的神经元(ReLUs)。携带ReLU深度卷积神经网络比携带tanh函数的同结构网络训练的更快。这在图1中得到了论证,这张图展示了对于一个特定的四层卷积网络,使用这两种激活函数在CIFAR-10数据集上想要达到25%的训练错误情况需要的迭代次数。这张图展示了如果我们使用传统的饱和神经元模型,我们或许不能用如此大的神经网络做实验。
我们不是第一个=批考虑传统CNNs中神经元模型替代物的那群人。例如,Jarrett宣称在Caltech-101数据集上,非线性单元后接上平均池化与对比度归一化一起运行地非常好。但是,在这个数据集上,最重要的关注点还是预防过拟合,因此他们所关注的影响并不同于我们所指出的当使用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的输入是正数,那么这个神经元就会得到学习。但是,我们仍然发现下面的局部归一化能够帮助归纳。用表示运用卷积核i在(x,y)位置上得到的神经元的响应值,然后运用ReLU非线性单元,响应归一化值可由如下公式计算得到:
这个和的计算是依靠n个"相邻的"核图在图像上相同而空间位置计算得到的,N是这一层的总的核个数。在训练开始之前,核图的排列理所当然是任意的且固定的。这种响应归一化实现了一种真正的神经元能实现的横向抑制激活,创造了使用不同核计算得出的神经元高响应输出之间的竞争。常量都是超参数,它们的值使用验证集来决定;我们使用;我们在某些特定的层的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图像的像素向量,我们使用了如下的量:
在这个公式中,和是RGB像素值的协方差矩阵的第i个特征向量与特征值,且是上述的随机值。对于一张特定的训练图像而言,直到这幅图像再次用于训练之前,每一个只产生一次,再次训练时会重新生成。这个方案大概捕捉了自然图像的一个重要属性,也就是说,目标的识别对于密度或者颜色的亮度是恒定的(也就是说不受影响)。这个方案将top-1错误率将降低了1%。
4.2 丢弃
结合预测的许多不同的模型的预测是一个减少错误率的十分成功的方法[1,3],但它似乎对于大型的神经网络来说是代价高昂的,特别是那种已经花费了好几天训练的大型网络。但是,这有一个很高效的模型结合版本,这使得训练时间只需要1/2。这个最近被发明的技术,叫做"drouput"[10],它的实现是对于每个隐层的输出都有0.5的概率置为0。用这种方式"丢弃"的神经元不会影响前向传播,也不会参与反向传播。所以每一次输出被展现的时候,神经网络都好像是不同的结构,然而这些不同的结构是共享权重的。由于一个神经元不能依靠特定的其他神经元的存在,因此这项技术减少了神经元复杂的相互适应。因此,它强制学习更多健壮的特征,这对于每个神经元与许多不通的随机子集的连接来说是有用的。在测试阶段,我们使用所有的神经元,但是将他们的输出*0.5,这对于采用由数量指数级多的drouput网络预测分布的几何平均是一种合理的近似。
5 训练的细节
我们使用一个批次大小为128个样本的随机梯度下降算法训练了我们的模型,动量为0.9,权重衰减为0.0005。我们发现这个值很小的权重衰减对于模型的训练来说很重要,这里的权重衰减不仅仅是一个正则项:他减少了模型的训练误差。权重的更新规则为:
图3:尺寸为11*11*3的96个卷积核(一个卷积核对应一组滤波器)由第一层卷积层在224*224*3的输入图像上进行学习。前48个在GPU1上训练,后48个在GPU2上训练。节6.1有更多细节。
是迭代次数,是动量变量,是学习率,是第i个批次的梯度平均值,是由估计的目标的衍生值。
我们从一个均值为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%的正确率。所以为了获得我们实验得到的结果,深度是非常重要的。
为了简化我们的实验,我们步使用任何的无监督预训练方案,即使我们预期这个方案是有帮助的,特别是当我们获得足够的计算能力能够极大地增大我们的网络尺度,而不需要获得相应的标签数据量的增加。说到这儿,随着我们使得我们的网络更大并且训练它更久,我们的结果提高了,但是我们仍然有许多数量级的神经元,这是为了与人类视觉系统的下颞叶路径相匹配。最终我们将要在视频序列上使用非常大得到深度卷积网络,在视频序列上,实时的结构会提供非常有用的信息,而这些信息在静态图片上会少得多甚至是完全没有。