CPU环境下调用tensorflow slim教程的slim包中的模型inception V3出现的问题

TensorFlow 下构建高性能神经网络模型的最佳实践 - api接口|数据_充值|回收|话费|Q币|水电煤|游戏|充值卡|点卡|手机游戏|免费接口_卡密回收|中诺数据
TensorFlow 下构建高性能神经网络模型的最佳实践
点击:84 次
随着神经网络算法在图像、语音等领域都大幅度超越传统算法,但在应用到实际项目中却面临两个问题:计算量巨大及模型体积过大,不利于移动端和嵌入式的场景;模型内存占用过大,导致功耗和电量消耗过高。因此,如何对神经网络模型进行优化,使尽可能不损失精度的情况下,能减少模型的体积,并且计算量也降低,就是我们将深度学习在更广泛地场景下应用时要解决的问题。
加速神经网络模型计算的方向
在移动端或者嵌入式设备上应用深度学习,有两种方式:一是将模型运行在云端服务器上,向服务器发送请求,接收服务器响应;二是在本地运行模型。
一般来说,采用后者的方式,也就是在PC上训练好一个模型,然后将其放在移动端上进行预测。使用本地运行模型原因在于,首先,向服务端请求数据的方式可行性差。移动端的资源(如网络、CPU、内存资源)是很稀缺的。例如,在网络连接不良或者丢失的情况下,向服务端发送连续的数据的代价就变得非常高昂。其次,运行在本地的实时性更好。但问题是,一个模型大小动辄几百兆,且不说把它安装到移动端需要多少网络资源,就是每次预测时需要的内存资源也是很多的。那么,要在性能相对较弱的移动/嵌入式设备(如没有加速器的ARM CPU)上高效运行一个CNN,应该怎么做呢?这就衍生出了很多加速计算的方向,其中重要的两个方向是对内存空间和速度的优化。采用的方式一是精简模型,既可以节省内存空间,也可以加快计算速度;二是加快框架的执行速度,影响框架执行速度主要有两方面的因素,即模型的复杂度和每一步的计算速度。
精简模型主要是使用更低的权重精度,如量化(quantization)或权重剪枝(weight pruning)。剪枝是指剪小权重的连接,把所有权值连接低于一个阈值的连接从网络里移除。而加速框架的执行速度一般不会影响模型的参数,是试图优化矩阵之间的通用乘法(GEMM)运算,因此会同时影响卷积层(卷积层的计算是先对数据进行im2col运算,再进行GEMM运算)和全连接层。
模型压缩是指在不丢失有用信息的前提下,缩减参数量以减少存储空间,提高其计算和存储效率,或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。
目前的压缩方法主要有如下4类:
设计浅层网络。通过设计一个更浅的网络结构来实现和复杂模型相当的效果。但是因为浅层网络的表达能力往往很难和深层网络匹敌,因此一般用在解决简单问题上。
压缩训练好的复杂模型。采用的主要方法有 参数稀疏化(剪枝)、 参数量化表示(量化),从而达到参数量减少、计算量减少、存储减少的目的。这是目前采用的主流方法,也是本文主要讲述的方法。
多值网络。最为典型就是二值网络、XNOR网络。其主要原理就是采用0和1两个值对网络的输入和权重进行编码,原始网络的卷积操作可以被位运算代替。在减少模型大小的同时,极大提升了模型的计算速度。但是由于二值网络会很大程度降低模型的表达能力。因此也在研究n-bit编码方式。
知识蒸馏(Knowledge Distilling)。采用迁移学习, 将复杂模型的输出做为 soft target 来训练一个简单网络。
下面我们来着重介绍目前应用较多的压缩训练好的复杂模型的方法。
剪枝(Prunes the network)
剪枝就是将网络转化为稀疏网络,即大部分权值都为0,只保留一些重要的连接。如下图所示:
图1 剪枝的过程及剪枝前后的对比:剪枝权重及剪枝下一层神经元
事实上,我们一般是逐层对神经网络进行敏感度分析(sensitive analysis),看哪一部分权重置为0后,对精度的影响较小。然后将权重排序,设置一个置零阈值,将阈值以下的权重置零,保持这些权重不变,继续训练至模型精度恢复;反复进行上述过程,通过增大置零的阈值提高模型中被置零的比例。具体过程如下图所示:
图2 交互式剪枝的过程
剪枝的特点:
通用于各种网络结构与各种任务, 且实现简单, 性能稳定;
稀疏网络具有更低的功耗,在CPU上使用特定工具时具有更快的计算速度;
剪枝后的稀疏矩阵通常采取特殊的存储方式,例如常用MKL中的CSR格式。
剪枝的结果:
通过在现有的经典神经网络上做实验,发现压缩倍数在9-12倍之间。如下图所示:
图3 经典神经网络剪枝前后的参数对比及压缩率
压缩的多是全连接层,CNN层参数少,因此能压缩的倍数也较少
根据经验,压缩到60%以上模型存储大小,模型大小才会下降比较多
量化(Quantize the weights)
量化(Quantization)又称定点,是用更少的数据位宽进行神经网络存储和计算。它的优势在于能够节省存储,并进行更快地访存和计算。
量化是一个总括术语,是用比32位浮点数更少的空间来存储和运行模型,并且TensorFlow量化的实现屏蔽了存储和运行细节。
神经网络训练时要求速度和准确率,训练通常在GPU上进行,所以使用浮点数影响不大。但是在预测阶段,使用浮点数会影响速度。量化可以在加快速度的同时,保持较高的精度。
量化网络的动机主要有两个。最初的动机是减小模型文件的大小。模型文件往往占据很大的磁盘空间,例如,上一节介绍的网络模型,很多模型都接近200 MB,模型中存储的是分布在大量层中的权值。在存储模型的时候用8位整数,模型大小可以缩小为原来32位的25%左右。在加载模型后运算时转换回32位浮点数,这样已有的浮点计算代码无需改动即可正常运行。
量化的另一个动机是降低预测过程需要的计算资源。这在嵌入式和移动端非常有意义,能够更快地运行模型,功耗更低。从体系架构的角度来说,8位的访问次数要比32位多,在读取8位整数时只需要32位浮点数的1/4的内存带宽,例如,在32位内存带宽的情况下,8位整数可以一次访问4个,32位浮点数只能1次访问1个。而且使用SIMD指令(19.2节会加速介绍该指令集),可以在一个时钟周期里实现更多的计算。另一方面,8位对嵌入式设备的利用更充分,因为很多嵌入式芯片都是8位、16位的,如单片机、数字信号处理器(DSP芯片),8位可以充分利用这些。
此外,神经网络对于噪声的健壮性很强,因为量化会带来精度损失(这种损失可以认为是一种噪声),并不会危害到整体结果的准确度。
那能否用低精度格式来直接训练呢?答案是,大多数情况下是不能的。因为在训练时,尽管前向传播能够顺利进行,但往往反向传播中需要计算梯度。例如,梯度是0.2,使用浮点数可以很好地表示,而整数就不能很好地表示,这会导致梯度消失。因此需要使用高于8位的值来计算梯度。因此,正如在本节一开始介绍的那样,在移动端训练模型的思路往往是,在PC上正常训练好浮点数模型,然后直接将模型转换成8位,移动端是使用8位的模型来执行预测的过程。
下图展示了不同精度(FP32、FP16、INT8)表示的数据范围:
图4 不同精度(FP32、FP16、INT8)表示的数据范围
量化的基本原理:
量化有2种类型,均为量化和非均匀量化。我们以将32bit浮点表示成3bit定点值为例。如下图,用INT3来近似表示浮点值,取值范围是8种离散取值(-4,-3,…,3)。如果不论权值的疏密,直接对应,我们称之为『均匀量化』;如果权值密的量化后的范围也较密,权值稀疏的量化后的范围也较稀疏,称之为『非均匀量化』。
图5 均匀量化和非均匀量化的对比图
TensorFlow下的模型压缩工具
下面我们就以TensorFlow下8位精度的存储和计算来说明。
1. 量化示例
我们举个将GoogleNet模型转换成8位模型的例子,看看模型的大小减小多少,以及用它预测的结果怎么样。从官方网站上下载训练好的GoogleNet模型,解压后,放在/tmp目录下,然后执行:
bazel build tensorflow/tools/quantization:quantize_graph
bazel-bin/tensorflow/tools/quantization/quantize_graph \
--input=/tmp/classify_image_graph_def.pb \
--output_node_names="softmax" --output=/tmp/quantized_graph.pb \
--mode=eightbit
生成量化后的模型quantized_graph.pb大小只有23 MB,是原来模型classify_image_graph_ def.pb(91 MB)的1/4。它的预测效果怎么样呢?执行:
bazel build tensorflow/examples/label_image:label_image
bazel-bin/tensorflow/examples/label_image/label_image \
--image=/tmp/cropped_panda.jpg \
--graph=/tmp/quantized_graph.pb \
--labels=/tmp/imagenet_synset_to_human_label_map.txt \
--input_width=299 \
--input_height=299 \
--input_mean=128 \
--input_std=128 \
--input_layer="Mul:0" \
--output_layer="softmax:0"
运行结果如下图所示,可以看出8位模型预测的结果也很好。
2. 量化过程的实现
TensorFlow的量化是通过将预测的操作转换成等价的8位版本的操作来实现的。量化操作过程如图19-2所示。
下图中左侧是原始的Relu操作,输入和输出均是浮点数。右侧是量化后的Relu操作,先根据输入的浮点数计算最大值和最小值,然后进入量化(Quantize)操作将输入数据转换成8位。一般来讲,在进入量化的Relu(QuantizedRelu)处理后,为了保证输出层的输入数据的准确性,还需要进行反量化(Dequantize)的操作,将权重再转回32位精度,来保证预测的准确性。也就是整个模型的前向传播采用8位段数运行,在最后一层之前加上一个反量化层,把8位转回32位作为输出层的输入。
图6 TensorFlow下模型量化的过程
实际上,我们会在每个量化操作(如QuantizedMatMul、QuantizedRelu等)的后面执行反量化操作(Dequantize),如下图左侧所示在QuantizedMatMul后执行反量化和量化操作可以相互抵消。因此,如下图右侧所示,在输出层之前做一次反量化操作就可以了。
图7 量化操作和反量化操作相互抵消
3. 量化数据的表示
将浮点数转换为8位的表示实际上是一个压缩问题。实际上,权重和经过激活函数处理过的上一层的输出(也就是下一层的输入)实际上是分布在一个范围内的值。量化的过程一般是找出最大值和最小值后,将分布在其中的浮点数认为是线性分布,做线性扩展。因此,假设最小值是-10.0f,最大值是30.0f,那量化后的结果如下图所示。
经典神经网络ResNet50上的模型压缩实验
笔者在ResNet50-v1上,采用官方GitHub上提供的模型作为Baseline,在ImageNet测试集5万张图片上进行测试。结果如下图:
图9 ResNet50网络量化前后的精度对比
在均匀量化的过程中,首先是仅仅对权重进行量化,得到精度为72.8%。随后,分别用模型对测试集的10张、1000张图片的范围进行提前计算最值(Max和Min),并进行存储,得到的精度分别为72.9%和73.1%。
从量化前后的可视化的模型对比,也可以看成量化对模型做了哪些操作。下图是未经量化的原始模型:
图10 ResNet50原始网络的节点结构
下图是仅仅对权重进行量化,没有计算输入图片的最值范围的可视化模型。可以看出原本的Conv2D等节点都转换为QuantizedConv2D的对应节点。并且在进行QuantizedConv2D操作后,得到INT32类型的记过,需要对操作的结果转换为8位(ReQuantize操作),而转换的过程需要知道INT32结果的最值范围,因此也加入了ReQuantizationRange节点。
图10 仅量化权重,在 Conv2D节点计算后,需要ReQuantizationRange来得到计算后的范围
如果已经预先使用10张或者1000张图片计算了每一个Conv2D等操作之后需要计算的范围,则ReQuantizationRange的计算过程就可以省去,直接从存储的计算好最值文件中读取。如下图所示:
图11 事先计算好1000张图片的范围,可以省去ReQuantizationRange节点
那么在性能受限环境下,对开发者还有没有技术和工程实现方面的其他建议呢?
设计小模型
可以将模型大小做为约束,在模型结构设计和选择时便加以考虑。例如,对于全连接,使用 bottleneck 是一个有效的手段。
例如,我们使用TensorFlow官方网站提供的预训练好的Inception V3模型在此花卉数据集上进行训练。在项目根目录下执行:
python tensorflow/examples/image_retraining/retrain.py \
--bottleneck_dir=/tmp/bottlenecks/ \
--how_many_training_steps 10 \
--model_dir=/tmp/inception \
--output_graph=/tmp/retrained_graph.pb \
--output_labels=/tmp/retrained_labels.txt \
--image_dir /tmp/flower_photos
训练完成后,可以在/tmp下看到生成的模型文件retrained_graph.pb(大小为83M)和标签文件retrained_labels.txt。
我们看到,上述命令行中存储和使用了“瓶颈”(bottlenecks)文件。瓶颈是用于描述实际进行分类的最终输出层之前的层(倒数第二层)的非正式术语。倒数第二层已经被训练得很好,因此瓶颈值会是一个有意义且紧凑的图像摘要,并且包含足够的信息使分类器做出选择。因此,在第一次训练的过程中,retrain.py文件的代码会先分析所有的图片,计算每张图片的瓶颈值并存储下来。因为每张图片在训练的过程中会被使用多次,因此在下一次使用的过程中,可以不必重复计算。这里用tulips/_d496c5e72c.jpg为例,生成的瓶颈文件为tulips/ _d496c5e72c.jpg.txt,内容如图所示。
图12 bottleneck文件的内容
再如,Highway,ResNet,DenseNet 这些带有 skip connection 结构的模型,也可以用来作为设计窄而深网络的参考,从而减少模型整体参数量和计算量。
还如,SqueezeNet 网络结构中通过引入1 x 1的小卷积核、减少 feature map 数量等方法,最终将模型大小压缩在 1M 以内,分类精度与 AlexNet 相当,而模型大小仅是 AlexNet的1/50。
模型小型化
一般采用知识蒸馏。在利用深度神经网络解决问题时,人们常常倾向于设计更复杂的网络,来得到更优的性能。蒸馏模型是采用是迁移学习,通过采用预先训练好的复杂模型(Teacher model)的输出作为监督信号去训练另外一个简单的网络,得到的简单的网络称之为Student model。实验表明,蒸馏模型的方法在 MNIST 及声学建模等任务上都有着很好的表现。
随着深度学习模型在嵌入式端的应用越来越丰富,例如安防、工业物联网、智能机器人等设备,需要解决图像、语音场景下深度学习的加速问题,减小模型大小及计算量,构建高性能神经网络模型。
本文重点讲解模型压缩和剪枝方法带来的模型大小和计算量的下降,并且能使精度维持在较高水平。除此之外,剪枝的敏感度分析和重新训练(Retrain)也有很多不同的手段;量化也可以在更低精度(5bit、6bit、甚至二值网络)上尝试,笔者也正在进行相关实验,期待和大家一起探讨。
本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。
新闻资讯NEWS
甘肃开元网络科技有限公司谷歌推TensorFlow Lite:在移动设备上部署人工智能-ITBEAR科技资讯
[中文IT资讯报道+媒体精选]
我们与您同在:
您的位置:>>
谷歌推TensorFlow Lite:在移动设备上部署人工智能
发布时间: 09:50:59&&来源:新浪科技&
&编辑:张宏伟&&背景:
  北京时间11月15日早间消息,谷歌今天发布了TensorFlow lite,让应用给开发者可以在移动设备上部署人工智能。这个移动版谷歌开源人工智能项目最早是在I/O开发者大会上宣布的。
  TensorFlow Lite可供Android和iOS开发者使用。
  自从TensorFlow Lite今年5月公布以来,已经出现了多个在移动设备上与之竞争的产品,包括苹果的CoreML、移动设备上的Clarifai人工智能云端训练服务,以及华为Mate 10使用的麒麟970这样的人工智能处理器。
  TensorFlow Lite发布时还提供了有限的预训练人工智能模型,包括MobileNet和Inception v3物体识别计算机模型,以及Smart Replay自然语言处理模型。开发者用自己的数据集训练的定制模型也可以部署在上面。
  TensorFlow团队在官方博客中表示,更多模型和功能也将根据用户需求逐步添加进去。
  TensorFlow Lite使用Android神经网络API,可以在没有加速硬件时直接调用CPU来处理,确保其可以兼容不同设备。(思远)
  声明:本文仅为传递更多网络信息,不代表ITBear观点和意见,仅供参考了解,更不能作为投资使用依据。
本文来源:新浪科技
11月14日,360旗下快视频APP在北京798尤伦斯艺术中心举行&超短超有料 质在一分钟&发布会,并启动百亿元打造超短视频生态,标志着360此前提出的&All in互联网内容&战略的落地。日期:11-15 北京时间11月15日早间消息,谷歌今天发布了TensorFlow lite,让应用给开发者可以在移动设备上部署人工智能。日期:11-15 网友们不禁好奇,双十一为什么不再卡了?阿里到底是用什么技术架构来保证了大促期间系统稳定,实现一串串刷新历史的天量数字的呢?日期:11-15 近日,北京电视台与紫光旗下新华三集团共同召开了北京电视台融合媒体生产云平台项目启动会,标志着北京电视台将对关键业务系统进行全面提升,正式迈进融媒云时代。日期:11-15  &随着百度AI的进化和更加高效的投放,百度成为双11最大赢家并不只是今年,还将是未来数年的常态。&马文颖表示。日期:11-15 最近不少传闻都提到,苹果正在开发一款 AR 眼镜。之前的一些消息来源称,苹果计划中的这款 AR 眼镜不需要依赖 iPhone,它集合图像显示和性能运算于一体,是独立的设备。日期:11-15 11月12日,全球领先的云管理服务提供商Bespin Global发布了旗下云管理服务平台产品Bespin Service P...日期:11-14 在网络条件完备以及内容创意爆发的大环境下,短视频无疑成为当下最火的新风口。据第一财经商业数据...日期:11-14 随着全国重要城市雾霾频发,以及全民健康意识的提升,空气净化器行业也迎来空前蓬勃发展。据不完全...日期:11-14 10月25和26日,由清科集团、投资界、新芽NEWSEED举办的&2017V武林大会&在北京召开。10...日期:11-14 今年最火爆的&双11&购物狂欢节终于结束,最终天猫全天的成交额定格在1682亿元,再度刷...日期:11-14 蓝港互动从&影漫游&到IP maker,蓝港互动集团不断拥抱变化。近日从官方悉知,蓝港互动...日期:11-14 日,为期四天的全球联合办公峰会中国站(GCUC CHINA)在上海静安区800 SHOW圆满落幕。日期:11-14 今年天猫双11最终成交1682亿元,天猫服饰美妆皆迎来高速增长。其中,服饰男女装18分钟超去年1小时,...日期:11-14 11.11剁手结束了,就算你没剁手,女朋友、媳妇们剁了没?现在,一个机会摆在你的面前,一个改变命运...日期:11-14 2017年双十一购物盛会以全网总交易额逾千亿的战绩华丽谢幕,在这个一年一度虐死单身狗的购物狂欢节里,你为GMV做了多少贡献?日期:11-14 11月14日,海信集团旗下上市公司海信电器股份有限公司与东芝株式会社在东京联合宣布:东芝映像解决...日期:11-14 近日,阿里巴巴的大事件不断,双十一实现了新纪录,市值屡创历史新高。日期:11-14 &双十一&是每年一度网络商家大促销的日子,钓鱼网站、二维码扫描、冒充店铺工作人员或熟人等诈骗方式层出不穷。日期:11-14 中新网11月7日电 近日,美国财经媒体CNBC发文称,中国可能很快就会作为全球性科技巨头,成为硅谷的...日期:11-14
微信扫一扫
下载ITBearAPP> 博客详情
本文介绍如何利用imagenet比赛上训练好的inception v3冻结的pb模型进行inference。
1.下载inception v3 pb文件。
2.导入pb到TensorFlow。
3.获取输入与预测Tensor。
4.加载图片
5.进行inference
【一】先看代码
import tensorflow as tf
import numpy as np
下载训练好的pb文件
'http://download.tensorflow.org/models/image/imagenet/inception-.tgz'
pb_path = r"D:\TensorFlow-model\inception-\classify_image_graph_def.pb"
with tf.gfile.FastGFile(pb_path,'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name='')
with tf.Session() as session:
#获取pb文件中模型的所有op,主要是为了获得input与output
print(tf.get_default_graph().get_operations())
image = "D:\TensorFlow-model\inception-\cropped_panda.jpg"
#解码图片作为inference的输入
image_data = tf.gfile.FastGFile(image, 'rb').read()
softmax_tensor = session.graph.get_tensor_by_name('softmax:0')
predictions = session.run(softmax_tensor,
{'DecodeJpeg/contents:0': image_data})
index = np.argmax(predictions,1)
print(index)
结果如下:
label为169,从文件中找到169是哪个类别
以下图片中的文件,来自于上述代码链接中下载的压缩包解压后的文件。
该文件说明了label属于哪个分类
再在如下文件中查找:
是说:该图片是一直熊猫
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥作者:才云科技Caicloud,郑泽宇,顾思宇
要将深度学习应用到实习疑问中,一个非常大的疑问在于练习深度学习模型需求的核算量太大。比方Inception-v3模型在单机上练习到78%的正确率需求快到半年的时刻 ,这么的练习速度是彻底无法应用到实习生产中的。为了加快练习进程,本章将介绍怎么经过TensorFlow运用GPU或/和分布式核算进行模型练习。这篇文章节选自<>第十章。
这篇文章将介绍怎么在TensorFlow中运用单个GPU进行核算加快,也将介绍生成TensorFlow会话(tf.Session)时的一些常用参数。经过这些参数能够使调试愈加便利而且程序的可扩展性非常好。可是,在许多情况下,单个GPU的加快功率无法满意练习大型深度学习模型的核算量需求,这时将需求运用更多的核算资本。为了一起运用多个GPU或许多台机器,10.2节中将介绍练习深度学习模型的并行方法。然后,10.3节将介绍怎么在一台机器的多个GPU上并行化地练习深度学习模型。在这一节中也将给出详细的TensorFlow样例程序来运用多GPU练习模型,并对比并行化功率进步的比率。最终在10.4节中将介绍分布式TensorFlow,以及怎么经过分布式TensorFlow练习深度学习模型。在这一节中将给出详细的TensorFlow样例程序来完结不一样的分布式深度学习练习形式。尽管TensorFlow能够支撑分布式深度学习模型练习,可是它并不供给集群创立、办理等功能。为了更便利地运用分布式TensorFlow,10.4节中将介绍才云科技依据Kubernetes容器云渠道建立的分布式TensorFlow体系。1. TensorFlow运用GPUTensorFlow程序能够经过tf.device函数来指定运转每一个操作的设备,这个设备能够是本地的CPU或许GPU,也能够是某一台长途的服务器。但在本节中只关怀本地的设备。TensorFlow会给每一个可用的设备一个称号,tf.device函数能够经过设备的称号来指定履行运算的设备。比方CPU在TensorFlow中的称号为/cpu:0。在默许情况下,即便机器有多个CPU,TensorFlow也不会差异它们,一切的CPU都运用/cpu:0作为称号。而一台机器上不一样GPU的称号是不一样的,第n个GPU在TensorFlow中的称号为/gpu:n。比方第一个GPU的称号为/gpu:0,第二个GPU称号为/gpu:1,以此类推。
TensorFlow供给了一个方便的方法来检查运转每一个运算的设备。在生成会话时,能够经过设置log_device_placement参数来打印运转每一个运算的设备。下面的程序展现了怎么运用log_device_placement这个参数。import tensorflow as tfa = tf.constant([1.0, 2.0, 3.0], shape=[3], name='a')b = tf.constant([1.0, 2.0, 3.0], shape=[3], name='b')c = a + b# 经过log_device_placement参数来输出运转每一个运算的设备。sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))print sess.run(c)'''在没有GPU的机器上运转以上代码能够得到以下输出:Device mapping: no known devices.add: /job:localhost/replica:0/task:0/cpu:0b: /job:localhost/replica:0/task:0/cpu:0a: /job:localhost/replica:0/task:0/cpu:0[ 2. &4. &6.]'''在以上代码中,TensorFlow程序生成会话时加入了参数log_device_placement=True,所以程序会将运转每一个操作的设备输出到屏幕。所以除了能够看到最终的核算成果以外,还能够看到相似“add: /job:localhost/replica:0/task:0/cpu:0”这么的输出。这些输出显现了履行每一个运算的设备。比方加法操作add是经过CPU来运转的,由于它的设备称号中包含了/cpu:0。
为协助读者了解这两种练习形式,本节首要简略回忆一下怎么练习深度学习模型。图10-1展现了深度学习模型的练习流程图。深度学习模型的练习是一个迭代的进程。在每一轮迭代中,前向传达算法会依据当时参数的取值核算出在一小有些练习数据上的猜测值,然后反向传达算法再依据丢失函数核算参数的梯度并更新参数。在并行化地练习深度学习模型时,不一样设备(GPU或CPU)能够在不一样练习数据上运转这个迭代的进程,而不一样并行形式的差异在于不一样的参数更新方法。
图10-2展现了异步形式的练习流程图。从图10-2中能够看到,在每一轮迭代时,不一样设备会读取参数最新的取值,但由于不一样设备读取参数取值的时刻不一样,所以得到的值也有也许不一样。依据当时参数的取值和随机获取的一小有些练习数据,不一样设备各自运转反向传达的进程并独登时更新参数。能够简略地以为异步形式即是单机形式仿制了多份,每一份运用不一样的练习数据进行练习。在异步形式下,不一样设备之间是彻底独立的。
(图一)图10-1 深度学习模型练习流程图(图二)图10-2 异步形式深度学习模型练习流程图可是运用异步形式练习的深度学习模型有也许无法到达较优的练习成果。图10-3中给出了一个详细的样例来阐明异步形式的疑问。其间黑色曲线展现了模型的丢失函数,黑色小球表明了在t0时刻参数所对应的丢失函数的巨细。假定两个设备d0和d1在时刻t0一起读取了参数的取值,那么设备d0和d1核算出来的梯度都会将小黑球向左移动。假定在时刻t1设备d0现已完结了反向传达的核算并更新了参数,修改后的参数处于图10-3中小灰球的方位。可是这时的设备d1并不知道参数现已被更新了,所以在时刻t2时,设备d1会持续将小球向左移动,使得小球的方位到达图10-3中小白球的当地。从图10-3中能够看到,当参数被调整到小白球的方位时,将无法到达最长处。
在装备好GPU环境的TensorFlow中 ,假如操作没有明确地指定运转设备,那么TensorFlow会优先选择GPU。比方将以上代码在亚马逊(Amazon Web Services, AWS)的 g2.8xlarge实例上运转时,会得到以下运转成果。Device mapping:/job:localhost/replica:0/task:0/gpu:0 -& device: 0, name: GRID K520, pci bus id: .0/job:localhost/replica:0/task:0/gpu:1 -& device: 1, name: GRID K520, pci bus id: .0/job:localhost/replica:0/task:0/gpu:2 -& device: 2, name: GRID K520, pci bus id: .0/job:localhost/replica:0/task:0/gpu:3 -& device: 3, name: GRID K520, pci bus id: .0add: /job:localhost/replica:0/task:0/gpu:0b: /job:localhost/replica:0/task:0/gpu:0a: /job:localhost/replica:0/task:0/gpu:0[ 2. &4. &6.]从上面的输出能够看到在装备好GPU环境的TensorFlow中,TensorFlow会主动优先将运算放置在GPU上。不过,尽管g2.8xlarge实例有4个GPU,在默许情况下,TensorFlow只会将运算优先放到/gpu:0上。所以能够看见在上面的程序中,一切的运算都被放在了/gpu:0上。假如需求将某些运算放到不一样的GPU或许CPU上,就需求经过tf.device来手艺指定。下面的程序给出了一个经过tf.device手艺指定运转设备的样例。import tensorflow as tf# 经过tf.device将运算指定到特定的设备上。with tf.device('/cpu:0'): & a = tf.constant([1.0, 2.0, 3.0], shape=[3], name='a') & b = tf.constant([1.0, 2.0, 3.0], shape=[3], name='b')with tf.device('/gpu:1'): & &c = a + bsess = tf.Session(config=tf.ConfigProto(log_device_placement=True))print sess.run(c)'''在AWS g2.8xlarge实例上运转上述代码能够得到以下成果:Device mapping:/job:localhost/replica:0/task:0/gpu:0 -& device: 0, name: GRID K520, pci bus id: .0/job:localhost/replica:0/task:0/gpu:1 -& device: 1, name: GRID K520, pci bus id: .0/job:localhost/replica:0/task:0/gpu:2 -& device: 2, name: GRID K520, pci bus id: .0/job:localhost/replica:0/task:0/gpu:3 -& device: 3, name: GRID K520, pci bus id: .0add: /job:localhost/replica:0/task:0/gpu:1b: /job:localhost/replica:0/task:0/cpu:0a: /job:localhost/replica:0/task:0/cpu:0[ 2. &4. &6.]'''在以上代码中能够看到生成常量a和b的操作被加载到了CPU上,而加法操作被放到了第二个GPU“/gpu:1”上。在TensorFlow中,不是一切的操作都能够被放在GPU上,假如强即将无法放在GPU上的操作指定到GPU上,那么程序将会报错。以下代码给出了一个报错的样例。import tensorflow as tf# 在CPU上运转tf.Variablea_cpu = tf.Variable(0, name="a_cpu")with tf.device('/gpu:0'): & &# 将tf.Variable强行放在GPU上。 & &a_gpu = tf.Variable(0, name="a_gpu")sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))sess.run(tf.initialize_all_variables())'''运转上面的程序将会报出以下过错:tensorflow.python.framework.errors.InvalidArgumentError: Cannot assign a device to node 'a_gpu': Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available.Colocation Debug Info:Colocation group had the following types and devices: Identity: CPU Assign: CPU Variable: CPU [[Node: a_gpu = Variable[container="", dtype=DT_INT32, shape=[], shared_ name="", _device="/device:GPU:0"]()]]'''不一样版别的TensorFlow对GPU的支撑不一样,假如程序中悉数运用强行指定设备的方法会下降程序的可移植性。在TensorFlow的kernel 中界说了哪些操作能够跑在GPU上。比方能够在variable_ops.cc程序中找到以下界说。# define REGISTER_GPU_KERNELS(type) & & & & & & & & & & & & & & & & & & & \ & &REGISTER_KERNEL_BUILDER( & & & & & & & & & & & & & & & & & & & & & & & & \ & & &Name("Variable").Device(DEVICE_GPU).TypeConstraint&type&("dtype"),\ & & &VariableOp); & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & \ & …TF_CALL_GPU_NUMBER_TYPES(REGISTER_GPU_KERNELS);在这段界说中能够看到GPU只在有些数据类型上支撑tf.Variable操作。假如在TensorFlow代码库中查找调用这段代码的宏TF_CALL_GPU_NUMBER_TYPES,能够发如今GPU上,tf.Variable操作只支撑实数型(float16、float32和double)的参数。而在报错的样例代码中给定的参数是整数型的,所以不支撑在GPU上运转。为防止这个疑问,TensorFlow在生成会话时能够指定allow_soft_placement参数。当allow_soft_placement参数设置为True时,假如运算无法由GPU履行,那么TensorFlow会主动将它放到CPU上履行。以下代码给出了一个运用allow_soft_placement参数的样例。import tensorflow as tfa_cpu = tf.Variable(0, name="a_cpu")with tf.device('/gpu:0'): & &a_gpu = tf.Variable(0, name="a_gpu")# 经过allow_soft_placement参数主动将无法放在GPU上的操作放回CPU上。sess = tf.Session(config=tf.ConfigProto( & &allow_soft_placement=True, log_device_ placement=True))sess.run(tf.initialize_all_variables())'''运转上面这段程序能够得到下面的成果:Device mapping:/job:localhost/replica:0/task:0/gpu:0 -& device: 0, name: GRID K520, pci bus id: .0/job:localhost/replica:0/task:0/gpu:1 -& device: 1, name: GRID K520, pci bus id: .0/job:localhost/replica:0/task:0/gpu:2 -& device: 2, name: GRID K520, pci bus id: .0/job:localhost/replica:0/task:0/gpu:3 -& device: 3, name: GRID K520, pci bus id: .0a_gpu: /job:localhost/replica:0/task:0/cpu:0a_gpu/read: /job:localhost/replica:0/task:0/cpu:0a_gpu/Assign: /job:localhost/replica:0/task:0/cpu:0init/NoOp_1: /job:localhost/replica:0/task:0/gpu:0a_cpu: /job:localhost/replica:0/task:0/cpu:0a_cpu/read: /job:localhost/replica:0/task:0/cpu:0a_cpu/Assign: /job:localhost/replica:0/task:0/cpu:0init/NoOp: /job:localhost/replica:0/task:0/gpu:0init: /job:localhost/replica:0/task:0/gpu:0a_gpu/initial_value: /job:localhost/replica:0/task:0/gpu:0a_cpu/initial_value: /job:localhost/replica:0/task:0/cpu:0从输出的日志中能够看到在生成变量a_gpu时,无法放到GPU上的运算被主动调整到了CPU上(比方a_gpu和a_gpu/read),而能够被GPU履行的指令(比方a_gpu/initial_value)照旧由GPU履行。'''尽管GPU能够加快TensorFlow的核算,但一般来说不会把一切的操作悉数放在GPU上。一个对比好的实习是将核算密集型的运算放在GPU上,而把别的操作放到CPU上。GPU是机器中相对独立的资本,将核算放入或许转出GPU都需求额定的时刻。而且GPU需求将核算时用到的数据从内存仿制到GPU设备上,这也需求额定的时刻。TensorFlow能够主动完结这些操作而不需求用户格外处理,但为了进步程序运转的速度,用户也需求尽量将有关的运算放在同一个设备上。2. 深度学习练习并行形式TensorFlow能够很简单地运用单个GPU加快深度学习模型的练习进程,但要运用更多的GPU或许机器,需求了解怎么并行化地练习深度学习模型。常用的并行化深度学习模型练习方法有两种,同步形式和异步形式。本节中将介绍这两种形式的工作方法及其好坏。
(图三)图10-3 异步形式练习深度学习模型存在的疑问示意图(图四)图10-4 同步形式深度学习模型练习流程图为了防止更新不一样步的疑问,能够运用同步形式。在同步形式下,一切的设备一起读取参数的取值,而且当反向传达算法完结以后同步更新参数的取值。单个设备不会独自对参数进行更新,而会等候一切设备都完结反向传达以后再共同更新参数 。图10-4展现了同步形式的练习进程。从图10-4中能够看到,在每一轮迭代时,不一样设备首要共同读取当时参数的取值,并随机获取一小有些数据。然后在不一样设备上运转反向传达进程得到在各自练习数据上参数的梯度。留意尽管一切设备运用的参数是共同的,可是由于练习数据不一样,所以得到参数的梯度就也许不一样。当一切设备完结反向传达的核算以后,需求核算出不一样设备上参数梯度的平均值,最终再依据平均值对参数进行更新。
更多内容请点击左下角“阅览原文”由CSDN主办的我国云核算技能大会(CCTC 2017)将于5月18-19日在北京举行,Spark、Container、区块链、大数据四大主题峰会震慑袭来,包含Mesosphere CTO Tobi Knaup,Rancher labs 创始人梁胜、Databricks 工程师 Spark commiter 范文臣等近60位技能大牛齐聚京城,为云核算、大数据以及人工智能范畴开发者带来一场技能的隆重Party。如今报名,只需399元就能够倾听近60场的尖端技能专家共享,还等啥,登陆官网(http://cctc.csdn.net/),从速报名吧!
看过本文的人还看过
人气:1334 更新:
人气:656 更新:
人气:536 更新:
人气:481 更新:
CSDN云计算的更多文章
大家在看 ^+^
推荐阅读 ^o^
『中國邊疆研究與歷史書寫』研討會日程安排
过真伤己、过直伤人
中国人走得太远太快,灵魂跟不上了(深度好文)
他说第二,有人敢说第一吗?
猜你喜欢 ^_^
24小时热门文章
微信扫一扫
分享到朋友圈}

我要回帖

更多关于 tensorflow slim 例子 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信