万全t350磁盘阵列容量_8个300g的硬盘做raid5后的容量空间为「万全t350g7raid设置」

  雷锋网按:本文是先容用TensorFlow构建图像辨认体系的第三部分。在前两部分中,我们构建了一个softmax分类器来标记来自CIFAR-10数据集的图像,实现了约25-30%的精度。由于有10个差别大概性的种别,以是我们预期的随机标记图像的精度为10%。25-30%的结果已经比随机标记的结果很多多少了,但仍有很大的改进空间。在这篇文章中,作者WolfgangBeyer将先容怎样构建一个实行雷同任务的神经网络。看看可以进步猜测精度到多少!雷锋网对全文举行编译,未经答应不得转载。

  关于前两部分,可以参看《呆板学习零底子?手把手教你用TensorFlow搭建图像辨认体系》(一)和(二)。

  

  神经网络

  神经网络是基于生物大脑的工作原理计划的,由很多人工神经元构成,每个神经元处理惩罚多个输入信号并返回单个输出信号,然后输出信号可以用作其他神经元的输入信号。我们先来看看一个单独的神经元,大概长如许:

  

  一个人工神经元:其输出是其输入加权和的ReLU函数值。

  在单个神经元中发生的环境与在softmax分类器中发生的环境非常相似。一个神经元有一个输入值的向量和一个权重值的向量,权重值是神经元的内部参数。输入向量和权重值向量包罗雷同数量的值,因此可以利用它们来盘算加权和。

  WeightedSum=input1×w1+input2×w2+...

  到如今为止,我们正在做与softmax分类器完全雷同的盘算,如今开始,我们要举行一些差别的处理惩罚:只要加权和的结果是正值,神经元的输出是这个值;但是假如加权和是负值,就忽略该负值,神经元产的输出为0。此操纵称为整流线性单位(ReLU)。

  

  由f(x)=max(0,x)界说的整流线性单位

  利用ReLU的缘故起因是其具备非线性特点,因而如今神经元的输出并不是严格的输入线性组合(也就是加权和)。当我们不再从单个神经元而是从整个网络来看时,会发现非线性很有效处。

  人工神经网络中的神经元通常不是相互随机毗连的,大多数时间是分层分列的:

  

  人工神经网络具有隐蔽层和输出层2个层。

  输入并不被当作一层,由于它只是将数据(不转换它)馈送到第一个符合的层。

  wikimedia

  输入图像的像素值是第1层网络中的神经元的输入。第1层中的神经元的输出是第2层网络的神经元的输入,背面的层之间以此类推。假如没有每层的ReLU,我们只是得到一个加权和的序列;而且堆积的加权和可以被归并成单个加权和,如许一来,多个层并没有比单层网络有任何改进之处。这就是为什么要具有非线性的紧张缘故起因。ReLU非线性办理了上述题目,它使每个附加层简直给网络添加了一些改进。

  我们所关注的是图像种别的分数,它是网络的末了一层的输出。在这个网络架构中,每个神经元毗连到前一层的全部神经元,因此这种网络被称为完全毗连的网络。我们将会在本教程的第3部分中看到一些差别于此的其他环境。

  对神经网络理论的简短先容到此竣事。让我们开始创建一个真正的神经网络!

  代码实战

  此示例的完备代码在Github上提供。它必要TensorFlow和CIFAR-10数据集(雷锋网(公众号:雷锋网)的此前文章有提及)。

  假如你已经通过我从前的博客文章,你会看到神经网络分类器的代码非常雷同于softmax分类器的代码。除了切换出界说模子的代码部分之外,我还添加了一些小功能使TensorFlow可以做以下一些事变:

  正则化:这是一种非常常见的技能,用于防止模子过拟合。它的工作原理是在优化过程中施加反作用力,其目标是保持模子简单

  利用TensorBoard可视化模子:TensorBoard包罗TensorFlow,答应您根据模子和模子天生的数据天生表格和图形。这有助于分析您的模子,而且对调试特别有效。

  查抄点:此功能答应您生存模子的当前状态以供以后利用。练习一个模子大概必要相称长的时间,以是它是须要的,当您想再次利用模子时不必重新开始。

  这次代码被分成两个文件:界说模子two_layer_fc.py和运行模子run_fc_model.py(提示:'fc'代表完全毗连的意思)。

  两层全毗连的神经网络

  让我们先看看模子本身,然后举行一些运行和练习处理惩罚。two_layer_fc.py包罗以下函数:

  inference(),使我们从输入数据到类分数。

  loss(),从类分数中盘算丧失值。

  training(),实行单个练习步调。

  evaluation(),盘算网络的精度。

  天生类分数:inference()

  inference()形貌了通过网络的正向转达。那么,类分数是怎样从输入图片开始被盘算的呢?

  

  参数images是包罗实际图像数据的TensorFlow占位符。接下来的三个参数形貌网络的外形或巨细。image_Pixels是每个输入图像的像素数,classes是差别输出标签的数量,hidden_units是网络的第一个层大概隐蔽层中的神经元数量。

  每个神经元从上一层获取全部值作为输入,并天生单个输出值。因此,隐蔽层中的每个神经元都具有image_pixels输入,而且该层作为团体天生hidden_units输出。然后将这些输入到输出层的类神经元中,天生类输出值,每个类一个分数。

  reg_constant是正则化常数。TensorFlow答应我们非常轻易地通过主动处理惩罚大部分盘算来向网络添加正则化。当利用到丧失函数时,我会进一步报告细节。

  

  由于神经网络有2个相似的图层,因此将为每个层界说一个单独的范围。这答应我们在每个作用域中重复利用变量名。变量biases以我们认识的tf.Variable()方式来界说。

  此处会更多地涉及到weights变量的界说。tf.get_variable()答应我们添加正则化。weights是以hidden_units(输入向量巨细乘以输出向量巨细)为维度的image_pixels矩阵。initialier参数形貌了weights变量的初始值。如今为止我们已经将weights变量初始化为0,但此处并不会起作用。关于单层中的神经元,它们都吸取完全雷同的输入值,假如它们都具有雷同的内部参数,则它们将举行雷同的盘算而且输出雷同的值。为了克制这种环境,必要随机化它们的初始权重。我们利用了一个通常可以很好运行的初始化方案,将weights初始化为正态分布值。扬弃与均匀值相差高出2个标准毛病的值,而且将标准毛病设置为输入像素数量的平方根的倒数。荣幸的是TensorFlow为我们处理惩罚了全部这些细节,我们只必要指定调用truncated_normal_initializer便可完成上述工作。

  weights变量的终极参数是regularizer。如今要做的是告诉TensorFlow要为weights变量利用L2-正则化。我将在这里讨论正则化。

  第一层的输出便是images矩阵乘以weights矩阵,再加上bisa变量。这与上一篇博文中的softmax分类器完全雷同。然后应用tf.nn.relu(),取ReLU函数的值作为隐蔽层的输出。

  

  第2层与第1层非常相似,其输入值为hidden_units,输出值为classes,因此weights矩阵的维度是是[hidden_units,classes]。由于这是我们网络的末了一层,以是不再必要ReLU。通过将输入(hidden)互乘以weights,再加上bias就可得到类分数(logits)。

  tf.histogram_summary()答应我们记录logits变量的值,以便以后用TensorBoard举行分析。这一点稍后会先容。

  总而言之,整个inference()函数吸取输入图像并返回类分数。这是一个练习有素的分类器必要做的,但为了得到一个练习有素的分类器,起首必要丈量这些类分数表现有多好,这是丧失函数要做的工作。

万全t350磁盘阵列容量_8个300g的硬盘做raid5后的容量空间为 万全t350磁盘阵列容量_8个300g的硬盘做raid5后的容量空间为「万全t350 g7 raid设置」 行业资讯

  盘算丧失:loss()

  

  起首,我们盘算logits(模子的输出)和labels(来自练习数据集的精确标签)之间的交错熵,这已经是我们对softmax分类器的全部丧失函数,但是这次我们想要利用正则化,以是必须给丧失添加另一个项。

  让我们先放一边吧,先看看通过利用正则化能实现什么。

  太过拟合和正则化

  当捕获数据中随机噪声的统计模子是被数据练习出来的而不是真实的数据底子关系时,就被称为过拟合。

  

  赤色和蓝色圆圈表现两个差别的类。绿线代表过拟合模子,而黑线代表具有精良拟合的模子。

  wikipedia

  在上面的图像中有两个差别的类,分别由蓝色和赤色圆圈表现。绿线是太过拟合的分类器。它完全依照练习数据,同时也严峻依靠于练习数据,而且大概在处理惩罚未知数据时比代表正则化模子的黑线表现更差。因此,我们的正则化目标是得到一个简单的模子,不附带任何不须要的复杂。我们选择L2-正则化来实现这一点,L2正则化将网络中全部权重的平方和加到丧失函数。假如模子利用大权重,则对应重罚分,而且假如模子利用小权重,则小罚分。

  这就是为什么我们在界说权重时利用了regularizer参数,并为它分配了一个l2_regularizer。这告诉了TensorFlow要跟踪l2_regularizer这个变量的L2正则化项(并通过参数reg_constant对它们举行加权)。全部正则化项被添加到一个丧失函数可以访问的聚集——tf.GraphKeys.REGULARIZATION_LOSSES。将全部正则化丧失的总和与先前盘算的交错熵相加,以得到我们的模子的总丧失。

  优化变量:training()

  

  global_step是跟踪实行练习迭代次数的标量变量。当在我们的练习循环中重复运行模子时,我们已经知道这个值,它是循环的迭代变量。直接将这个值添加到TensorFlow图表的缘故起因是想要可以或许拍摄模子的快照,这些快照应包罗有关已实行了多少练习步调的信息。

  梯度降落优化器的界说很简单。我们提供学习速率并告诉优化器它应该最小化哪个变量。别的,优化程序会在每次迭代时主动递增global_step参数。

  丈量性能:evaluation()

  

  模子精度的盘算与softmax环境雷同:将模子的猜测与真实标签举行比力,并盘算精确猜测的频率。我们还对随着时间的推移精度怎样演变感爱好,因此添加了一个跟踪accuracy的汇总操纵。将在关于TensorBoard的部分中先容这一点。

万全t350磁盘阵列容量_8个300g的硬盘做raid5后的容量空间为 万全t350磁盘阵列容量_8个300g的硬盘做raid5后的容量空间为「万全t350 g7 raid设置」 行业资讯

  总结我们迄今为止做了什么,已经界说了利用4个函数的2层人工神经网络的举动:inference()构成通过网络的正向转达并返回类分数。loss()比力猜测和真实的类分数并天生丧失值。training()实行练习步调,并优化模子的内部参数。evaluation()丈量模子的性能。

  运行神经网络

  如今神经网络已经界说完毕,让我们看看run_fc_model.py是怎样运行、练习和评估模子的。

  

  在逼迫导入之后,将模子参数界说为外部标记。TensorFlow有本身的下令行参数模块,这是一个围绕Pythonargparse的小封装包。在这里利用它是为了方便,但也可以直接利用argparse。

  在代码开头两行中界说了下令行参数。每个标记的参数是标记的名称(其默认值和一个简短的形貌)。利用-h标记实行文件将表现这些形貌。第二个代码块调用实际分析下令行参数的函数,然后将全部参数的值打印到屏幕上。

  

  用常数界说每个图像的像素数(32x32x3)和差别图像种别的数量。

  

  利用一个时钟来记录运行时间。

  

  我们想记录关于练习过程的一些信息,并利用TensorBoard表现该信息。TensorBoard要求每次运行的日记都位于单独的目次中,因此我们将日期和时间信息添加到日记目次的名称地点。

  

  load_data()加载CIFAR-10数据,并返回包罗独立练习和测试数据集的字典。

  天生TensorFlow图

  

  界说TensorFlow占位符。当实行实际盘算时,这些将被添补练习和测试数据。

  images_placeholder将每张图片批处理惩罚成肯定尺寸乘以像素的巨细。批处理惩罚巨细设定为“None”答应运行图片时可随时设定巨细(用于练习网络的批处理惩罚巨细可以通过下令行参数设置,但是对于测试,我们将整个测试集作为一个批处理惩罚)。

  labels_placeholder是一个包罗每张图片的精确类标签的整数值向量。

  

  这里引用了我们之前在two_layer_fc.py中形貌的函数。

  inference()使我们从输入数据到类分数。

  loss()从类分数中盘算丧失值。

  training()实行单个练习步调。

  evaluation()盘算网络的精度。

  

  为TensorBoard界说一个summary操纵函数(更多先容可拜见前文).

  

  天生一个生存对象以生存模子在查抄点的状态(更多先容可拜见前文)。

  

  开始TensorFlow会话并立即初始化全部变量。然后我们创建一个汇总编辑器,使其定期将日记信息生存到磁盘。

  

  这些行负责天生批输入数据。让我们假设我们有100个练习图像,批次巨细为10.在softmax示例中,我们只为每次迭代选择了10个随机图像。这意味着,在10次迭代之后,每个图像将被均匀选取一次。但究竟上,一些图像将被选择多次,而一些图像不会被添加到任何一个批次。但只要重复的次数够频发,全部图片被随机分到差别批次的环境会有所改善。

  这一次我们要改进抽样过程。要做的是起首对练习数据集的100个图像随机混洗。混洗之后的数据的前10个图像作为我们的第一个批次,接下来的10个图像是我们的第二批,背面的批次以此类推。10批后,在数据集的末端,再重复混洗过程,和开始步调同等,依次取10张图像作为一批次。这包管没有任何图像比任何别的图像被更频仍地拾取,同时仍旧确保图像被返回的次序是随机的。

  为了实现这一点,data_helpers()中的gen_batch()函数返回一个Pythongenerator,它在每次评估时返回下一个批次。generator原理的细节超出了本文的范围(这里有一个很好的表明)。利用Python的内置zip()函数来天生一个来自[(image1,label1),(image2,label2),...]的元组列表,然后将其转达给天生函数。

  

  next(batch)返回下一批数据。由于它仍旧是[(imageA,labelA),(imageB,labelB),...]的情势,必要先解压它以从标签中分离图像,然后添补feed_dict,字典包罗用单批培训数据添补的TensorFlow占位符。

  

  每100次迭代之后模子的当前精度会被评估并打印到屏幕上。别的,正在运行summary操纵,其结果被添加到负责将择要写入磁盘的summary_writer(看此章节)。

  

  此行运行train_step操纵(之前界说为调用two_layer_fc.training(),它包罗用于优化变量的实际指令)。

  

  当练习模子必要较长的时间,有一个简单的方法来生存你的进度的快照。这答应您以后返来并规复模子在完全雷同的状态。全部你必要做的是创建一个tf.train.Saver对象(我们之前做的),然后每次你想拍摄快照时调用它的save()方法。规复模子也很简单,只需调用savever的restore()。代码示例请看gitHub存储库中的restore_model.py文件。

  

  在练习完成后,终极模子在测试集上举行评估(记取,测试集包罗模子到如今为止还没有看到的数据,使我们可以或许判定模子是否能推广到新的数据)。

  结果

  让我们利用默认参数通过“pythonrun_fc_model.py”运行模子。我的输出如下所示:

  

  

  可以看到练习的正确性开始于我们所盼望到随机推测程度(10级-10%的机遇选择到精确的)。在第一次约1000次迭代中,精度增长到约50%,而且在接下来的1000次迭代中围绕该值颠簸。46%的测试精度不低于练习精度。这表明我们的模子没有显着太过拟合。softmax分级器的性能约为30%,因此46%的改进约为50%。不错!

  用TensorBoard可视化

  TensorBoard答应您从差别方面可视化TensorFlow图形,而且对于调试和改进网络非常有效。让我们看看TensorBoard相干的代码。

  在two_layer_fc.py我可以看到以下代码:

  

  这三行中的每一行都创建一个汇总操纵。通过界说一个汇总操纵告诉TensorFlow网络某些张量(在本例中logits,loss和accuracy)的择要信息。汇总操纵的其他参数就只是一些想要添加到总结的标签。

  有差别种类的汇总操纵。利用scalar_summary记录有关标量(非矢量)值以及histogram_summary网络有关的多个值分布信息(有关各种汇总运算更多信息可以在TensorFlow文档中找到)。

  在run_fc_model.py是关于TensorBoard可视化的一些代码:

  

  TensorFlow中的一个操纵本身不运行,您必要直接调用它或调用依靠于它的另一个操纵。由于我们不想在每次要网络择要信息时单独调用每个择要操纵,因此利用tf.merge_all_summaries创建一个运行全部择要的单个操纵。

  在TensorFlow会话的初始化期间,创建一个择要写入器,择要编入器负责将择要数据实际写入磁盘。在择要写入器的构造函数中,logdir是日记的写入地点。可选的图形参数告诉TensorBoard渲染表现整个TensorFlow图形。每100次迭代,我们实行归并的汇总操纵,并将结果馈送到汇总写入器,将它们写入磁盘。要查察结果,我们通过“tensorboard--logdir=tf_logs”运行TensorBoard,并在Web欣赏器中打开localhost:6006。在“变乱”标签中,我们可以看到网络的丧失是怎样镌汰的,以及其精度是怎样随时间增长而增长的。

  

  tensorboard图表现模子在练习中的丧失和精度。

  “Graphs”选项卡表现一个已经界说的可视化的tensorflow图,您可以交互式地重新分列直到你满意。我以为下面的图片表现了我们的网络布局非常好。

  

  Tensorboard1以交互式可视化的方式表现Tensorboard图像

  有关在“分布”和“直方图”标签的信息可以进一步相识tf.histogram_summary操纵,这里不做进一步的细节分析,更多信息可在官方tensorflow文件相干部分。

  后续改进

  大概你正在想练习softmax分类器的盘算时间比神经网络少了很多。究竟确实云云,但纵然把练习softmax分类器的时间增长到和神经网络来练习所用的时间一样长,前者也不会到达和神经网络雷同的性能,前者练习时间再长,额外的收益和肯定程度的性能改进险些是微乎其微的。我们也已经在神经网络中也验证也这点,额外的练习时间不会明显进步正确性,但尚有别的事变我们可以做。

  已选的默认参数值表现是相称不错的,但尚有一些改进的余地。通过改变参数,如隐蔽层中的神经元的数量或学习率,应该可以或许进步模子的正确性,模子的进一步优化使测试精度很大概大于50%。假如这个模子可以调解到65%或更多,我也会相称惊喜。但尚有另一种范例的网络布局可以或许比力轻易实现这一点:卷积神经网络,这是一类不完全连通的神经网络,相反,它们实行在其输入中明白局部特性,这对于分析图像非常有效。它使得在解读图像获取空间信息的时间有非常直观的意义。在本系列的下一部分中,我们将看到卷积神经网络的工作原理,以及怎样构建一个本身的神经网络.。

  雷锋网将关注下一部分关于卷积神经网络的先容,敬请等待。

  viawolfib,雷锋网编译

  雷锋网版权文章,未经授权克制转载。详情见转载须知。

你可能想看:

客户评论

我要评论