
目录1.深度神经网络简析2.深度神经网络的应用方式3.如何快速地近似任何函数4.性能表现评估深度学习技术的实际应用取得了显著的成绩。经过几十年的研究经历的众多的失败和一次次的迭代现在深度学习技术最终变得可行。它们已经在对象识别、场景感知和遮挡测试中表现得比其他神经网络更加出色我们将讨论深度神经网络DNN的几个方面如雾天可视性增强、恶意软件检测和图像压缩然后用Python构建一个简单的深度神经网络来演示通用逼近定理。1.深度神经网络简析由于其模型的优秀的预测性能在自然语言处理、文档识别中DNN已经得到了广泛的应用它由一个输入层、一个输出层和许多夹在中间的隐藏层组成。它类似于多层感知器但是有许多的隐藏层在每一层有多个链接的神经元而极其复杂的决策功能就是靠它的多个隐藏层达成的。隐藏层与输入层相连它们对输入值进行组合和加权产生新的实际值然后将其传递到输出层。输出层使用在隐藏层中计算的抽象特征进行分类或决策。DNN通过更新不同层之间的连接权重来进行学习目的是让输出值尽可能接近目标输出。神经元是DNN的核心。DNN可以视为多个回归模型的组合这些模型神经元被链接在一起给定它们一组输入它们可以提供比单一模型更灵活的输出组合这使得DNN可以拟合各种功能。对于分类问题它们输出的是可能和不可能两种可能性。每一个隐藏层可以看作是一堆对数线性模型。2.深度神经网络的应用方式DNN的3个实际用途1.增强雾天的可视性由于雾天下大气颗粒对光的吸收或散射雾天情况下的能见度会大大降低从而会给视觉导航带来巨大的问题。因此雾天情况下的视觉增强具有重大的实用价值。通常的除雾算法需要一张没有雾的相同场景的图像或者在有雾图像中有像车道标识和交通标志这样提供距离信息的显著物体。DNN突破性进展汉阳大学Jechang Jeong教授和计算机工程学生Farhan Hussain开发了一种深度神经网络方法来实时去除图像中的雾气他们认为:图像中的雾可以通过未知的复杂函数进行数学模拟我们利用深度神经网络来近似相应的雾的数学模型。事实证明这两位开发的DNN可以很好地消除图像中的雾如图所示顶部图像显示了没有雾的原始场景底部图像使用DNN去雾的图像。Hussain和Jeong总结到对各种合成图像进行的实验表明DNN可以很好地拟合雾函数对大量的看不见的模糊图像生成了很好的结果。2.打击黑客犯罪恶意软件是指木马、蠕虫病毒、间谍软件、僵尸网络等可以破坏计算机系统的软件。恶意软件的攻击不仅影响个人开展合法的业务还影响到企业和政府检测出恶意软件可以保护财产安全。所以如何检测恶意软件很有使用价值。深度学习解决方案来自Invincea Labs的Joshua Saxe和Konstantin Berlin使用深度神经网络来帮助识别恶意软件。DNN体系结构由一个输入层、两个隐藏层和一个输出层组成。输入层有1024个输入特征每一个隐藏层有1024个神经元。Joshua和Konstantin使用来自客户和内部恶意软件库的超过400000个软件二进制文件测试了他们的模型。DNN检测正确率达到了95%假阳性率为0.1%这无疑是一种巨大的成功研究人员观察到神经网络有几个特性使其能很好地用于恶意软件检测。首先神经网络允许增量学习因此不但可以进行批量训练而且收集了新的训练数据后可以对它们进行再训练。其次它们允许我们通过预训练来组合标记的和没有标记的数据。最后分类器是很小巧的所以用很小的内存就能完成预测。Joshua和Konstantin总结到目前快速训练和部署一个低资源、高度准确的机器学习分类模型是可行的假阳性率接近传统的大量人工标注的方法同时也能检测到以前没见过的恶意软件。3.图像压缩Jeong和Hussain已经想出了如何使用深度神经网络来压缩图像图4.5展示了他们的DNN。模型由两部分组成——编码器和解码器。这是因为图像压缩包括两个阶段第一个阶段是压缩图像第二个阶段是解压并恢复原图像。输入层和输出层神经元的个数与待压缩的图像的大小对应。压缩是通过在最后的隐藏层指定一组比原始输入属性集合要小的神经元来实现的。在激活函数上它们使用了线性整流ReLu激活函数。线性整流函数用在隐藏层的激活函数上因为能得到更好的网络泛化并减少实际的压缩——解压时间。同时他们也用了sigmoid激活函数来运行模型。图4.6显示了3幅不同图像的结果原始图像在顶部用ReLu函数和sigmoid函数压缩和重构的图像分别显示在中部和底部他们总结到DNN能够很好的学习压缩、解压功能。3.如何快速地近似任何函数研究人员Hornilk等发现一个隐藏层足以模拟任何分段连续函数反过来对于任何连续函数F和一定的容错ε可以构建一个单隐藏层的神经网络用于计算F。这至少在理论上说明一个隐藏层对于很多问题是足够的。当然实际情况略有不同。首先现实世界的决策函数可能并不连续对于现实世界的很多问题看上去需要多个隐藏层来实现精确的分类和预测。如果决策规则可以通过负责的函数进行建模则可以使用DNN。重要的是你不需要事先知道函数的形式只需要通过学习方法来逼近目标函数。看一下Jechang Jeong教授的去雾算法它们的DNN很好地近似了雾的函数。3.1 用Python构建极简深度神经网络现在我们用Python来构建一个DNN来近似一个函数。我们将构建DNN来近似yx2。首先导入一些使用的基础包这通过使用import关键字完成import numpy as np import pandas as pd import random让我们讲解一下上面的代码。import关键字用来导入3个包numpy、pandas和random。NumPynumpy是Python科学计算中使用的核心包。在本书中我们将会经常使用它。并使用简写np来访问它的元素。我们同样对pandas包做同样的操作用简写pd来表示。pandas包为Python编程语言提供了高性能的、易用的数据结构和数据分析工具是数据科学中使用的另一个核心库。使用random模块生成随机数。3.2生成示例下面生成有50个随机值的x然后赋值yx2.random.seed2016 sample_size50 samplepd.Seriess(random.sample(range(-10000,10000),sanple_size)) xsample/10000 yx**2Python代码的一个好处就是非常容易阅读。上面的代码是一个很好的例子函数random.seed用来确保可以重新生成与本书中使用的相同随机样本通过指定种子的值来完成。函数random.sample用来生成50个观测值的随机样本并将结果存储在称为Series的数据类型中这是通过指定pd.Series的参数来实现的。注意我们使用了pandas的简写pd。Series是一个标签数组。他可以包含任何随机数据类型整数、字符串、浮点数、Python数据对象等。然后随机样本被放置在±1之间并存储在Python对象x中最后对象y用来存储x的平方根的值。3.3 检查样本不时地查看一下数据是一个好主意。让我们看一下x中的前10个观察值。print x.head(10) 0 0.4758 1 -0.1026 2 0.7847 3 0.7506 4 -0.4870 5 0.3687 6 0.8647 7 -0.8361 8 -0.4067 9 -0.8568 dtype: float64第一个观察值为0.4758第十个观察值为-0.8568。注意输出也包含了numpy的dtype这里为float64。Numpy数组包含dtype对象的元素。接着看一下y的前10个观察值第一次观察值为0.226386第十次观察值为0.734106。快速抽查表明第一个观察值0.475820.226386第十个观测值0.475820.226386所以数字和预期y值一样为x的平方。图4.7显示了模拟数据的可视化图。也可以用describe()方法快速查看数据的摘要信息。这里检查一下x的摘要.descibe()函数提供了样本的最大值、最小值、观测值数量以及四分位数等细节。正如我们所期望的x值位于±1之间最大值为0.8647最小值为-0.937。格式化数据在这个例子中我们使用的neuralpy包——这是一个专门研究神经网络的机器学习库。它的接口非常直观让你可以快速开始训练数据并测试深度学习模型。为了使用该 包我们需要把数据转换成一个合适的格式。为此我们将创建一个名为dataSet的Python对象该对象是一个观察值x和y的列表。我们可以通过一个while循环来完成格式的变换。count0 dataSet[([x.ix[count]],[y.iy[count]])] count1 while countsampli_size print working on data item:,count dataSet(dataSet[([x.ix[count,0]],[y.iy[count]])]) countcount1下面分析一下上述代码。.count对象用于循环遍历并在每一个新的xy样本添加到dataSet后递增。.ix方法用于索引让我们能遍历x和y中的每一个观察值并添加到dataSet中。模型运行时你能看到如下的输出。说明注意dataSet是一个列表对象这是neuralpy所需要的模型拟合模型我们将拟合一个有两个隐藏层的DNN第一个隐藏层包含3个神经元第二个隐藏层有7个神经元如图4.8所示。这可以通过neuralpy.Network方法指定import neuralpy fitneuralpy.Network(1,3,7,1)模型通过学习迭代算法的最大次数由epochs参数控制我们将此值设置为100。学习速率控制梯度下降算法的步长的大小设置为1。epochs100 learning_rate1现在我们可以使用fit.train来进行函数的拟合了printfitting model right now fit.train(dataSet,epochs,learning_rate)可以看到传递给fit.train的第一个参数是样本第二个是迭代的最大次数第三个是学习步长。最后经过一段时间后模型收敛得到一个解决方案。4.性能表现评估让我们看一下模型在逼近y值时的表现有多好预测值可以用fit.forward函数获得。我们使用一个简单的while循环将预测结果存储在Python对象out中并使用print函数将结果显示在屏幕上。count0 pred[] while(countsample_size) outfit.forward(x[count]) print(Obs:,count1, y,round(y[count],4), prediction,round(pd.Serise(out),4)) pred.append(out) countcount1当模型运行时会将结果打印到屏幕上。对于前5个观测值你应该能看到如下内容当然显示在屏幕上的数字与上面的不同。因为neuralpy随机设置权重和偏差每次模型运行这些值结果都是不同的。尽管如此整体结果会非常接近实际的观测值。记录的数据表明DNN可以以相当高的精度进行函数的拟合虽然不是完全精确但已经达到了一个相当高的精度了。如果是你你会用什么样的方式来提升DNN的拟合效果