tensorflow分布式搭建的work怎么创建

分布式机器学习框架-TensorFlow on Spark(中)-爱编程
分布式机器学习框架-TensorFlow on Spark(中)
深度学习与 Spark 和 TensorFlow
在过去几年中,神经网络已经看到壮观进展,并且他们现在是图像识别和自动翻译领域中最强者。TensorFlow是数值计算和神经网络发布的谷歌的新框架。在这个博客中,我们将演示如何使用TensorFlow和Spark一起训练和应用深度学习模型。
你可能会困惑:在最高性能的深度学习实现是单节点的当下, Spark 的用处在哪里?为了回答这个问题,我们将会演示两个例子并解释如何使用 Spark 和机器集群搭配 TensorFlow 来提高深度学习的管道数。
超参数调整: 使用 Spark 来找到最好的神经网络训练参数集,减少十倍训练时间并减低34%的失误率。
部署模型规模: 使用 Spark 在大量数据上应用训练完毕的神经网络模型。
超参数调整
深度机器学习(ML)技术的一个例子是人工神经网络。它们采取一个复杂的输入,如图像或音频记录,然后应用复杂的数学变换这些信号。此变换的输出是更易于由其他ML算法操纵的数字向量。人工神经网络通过模仿人类大脑的视觉皮层的神经元(以相当简化的形式)执行该转换。
就像人类学会解读他们所看到的,人工神经网络需要通过训练来识别那些“有趣”的具体模式。例如,这些可以是简单的模式,例如边缘,圆形,但也可以是更复杂模式。在这里,我们将用NIST提供的经典数据集来训练神经网络识别这些数字:
TensorFlow 库自动创建的各种形状和大小的神经网络训练算法。建立一个神经网络的实际过程,比在数据集上跑一些方法要复杂得多。通常有一些非常重要的超参数(通俗地 说,参数配置)来设置,这将影响该模型是如何训练的。选择正确的参数会导致性能优越,而坏的参数将会导致长时间的训练和糟糕的表现。在实践中,机器学习从 业者会多次使用不同的超参数运行相同的模型,以期找到最佳的集合。这是一个经典的技术,称为超参数调整。
建立一个神经网络时,有许多需要精心挑选的重要超参数。 例如:
在每个层的神经元数目:太少的神经元会降低网络的表达能力,但太多会大大增加运行时间,并返回噪音估计。
学习速度:如果过高,神经网络将只专注于看到过去的几样,并不顾一切之前积累的经验。如果太低,这将需要很长时间才能达到一个很好的状态。
这里有趣的是,即使 TensorFlow 本身不予分发,超参数调整过程是“embarrassingly parallel”,并且可以使用 Spark 分配。在这种情况下,我们可以使用 Spark 广播常见的元素,例如数据和模型描述,然后以容错方式安排跨越机器集群的个体进行重复计算。
如何使用 Spark 提高精度?用默认的精 度为99.2%。我们在测试集上的最好结果是99.47%的精确度,减少34%的测试误差。分布式计算时间与添加到集群节点的数量成线性关系:使用13个 节点的集群,我们能够同时培养13个模型,相比于在一台机器一个接着一个训练速度提升了7倍。这里是相对于该集群上机器的数量的计算时间(以秒计)的曲线 图:
最重要的是,我们分析了大量训练过程中的超参数的灵敏度。例如,我们相对于不同数目的神经元所得学习率绘制了最终测试性能图:
这显示了一个典型的神经网络权衡曲线:
学习速度是非常关键的:如果它太低,神经网络没有学到任何东西(高测试误差)。如果它太高,训练过程可能发生随机振荡甚至在某些配置下出现发散。
神经元的数目对于获得良好的性能来说没有那么重要,并且有更多神经元的网络的学习率更加敏感。这是奥卡姆剃刀原则:对大多数目标来说,简单的模型 往往已经“足够好”。如果你有时间和资源来除去这缺少的1%测试误差,在训练中投入了大量的资源,并找到合适的超参数,这才会有所不同。
通过使用参数稀疏样本,我们可以在最优的参数集下取得零失误率。
我该如何使用它?
尽管 TensorFlow 可以使用每一个 worker 上的所有核心,我们只能在同一时间对每个工人运行一个任务,我们将它们打包以限制竞争。TensorFlow 库可以按照[instructions on the TensorFlow website]()上的指示安装在 Spark 集群上作为一个普通的Python库。下面的笔记展示了如何安装TensorFlow并让用户重复该文章的实验:
大规模部署
TensorFlow 模型可以直接在管道内嵌入对数据集执行复杂的识别任务。作为一个例子,我们将展示我们如何能够使用一个标注一组图片
首先使用 Spark 内置的广播机制将该模型分发到集群中的worker上:
with&gfile.FastGFile(&'classify_image_graph_def.pb',&'rb')&as&f:
model_data&=&f.read()
model_data_bc&=&sc.broadcast(model_data)
之后,这个模型被加载到每个节点上,并且应用于图片。这是每个节点运行的代码框架:
def&apply_batch(image_url):
#&Creates&a&new&TensorFlow&graph&of&computation&and&imports&the&model
with&tf.Graph().as_default()&as&g:
graph_def&=&tf.GraphDef()
graph_def.ParseFromString(model_data_bc.value)
tf.import_graph_def(graph_def,&name='')
#&Loads&the&image&data&from&the&URL:
image_data&=&urllib.request.urlopen(img_url,&timeout=1.0).read()
#&Runs&a&tensor&flow&session&that&loads&the&
with&tf.Session()&as&sess:
&&softmax_tensor&=&sess.graph.get_tensor_by_name('softmax:0')
&&predictions&=&sess.run(softmax_tensor,&{'DecodeJpeg/contents:0':&image_data})
&&return&predictions
通过将图片打包在一起,这份代码可以运行地更快。 下面是图片的一个样例:
这是神经网络对于这张图片的解释,相当精确:
&&&('coral&reef',&0.),
&&&('scuba&diver',&0.),
&&&('brain&coral',&0.),
&&&('snorkel',&0.),
&&&('promontory,&headland,&head,&foreland',&0.)])
我们已经展示了如何将 Spark 和 TensorFlow结合起来训练和部署手写数字识别和图片分类的神经网络。尽管我们使用的神经网络框架自身只能在单节点运行,但我们可以用 Spark 分发超参数调节过程和模型部署。这不仅缩短了训练时间,而且还提高了精度,使我们更好地理解各种超参数的灵敏度。
尽管这支持是只适用于Python的,我们仍期待着可以提供 TensorFlow 和 Spark其它框架之间更深度的集成。
英文链接:
英文原文:
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。作者:tobe迪豪
通过local server理解分布式TensorFlow集群的应用与实现。
TensorFlow从0.8版本开始,支持分布式集群,并且自带了local server方便测试。
Local server和分布式服务的接口一样,我们将从local server入手,详细解读分布式机器学习集群的用法。
Local server的最简单用法
TensorFlow官方文档提供了local server的最简单用法,安装TensorFlow后直接在交互式Python终端中执行即可。
注意这里server和client启动在同一个进程了,为什么这么说呢?我们都了解TensorFlow客户端可以用Python或C++编写,本质上就是构建一个可执行的Graph,而Graph需要在Session中执行,因此代码中只要包含Session()的就是客户端,这时通过server.target选择本地刚创建的server来执行op。大家可能会好奇server.target是什么,我们在终端可以输出是’grpc://localhost:3;,一个字符串表示服务端的ip和端口,同时也确认它的协议是Google开源的gRPC。
如果你愿意搭建环境测试,只要一行命令即可docker run -it tobegit3hub/ml-dev bash,其中ml-dev是我开发的机器学习镜像包含大量工具库,当然你也可以使用官方的tensorflow/tensorflow镜像。
启动local server服务
前面提到local server和client在同一个进程,输出结果后服务端和客户端都退出了,实际上服务端应该以daemon的形式提供服务,local server也可以的。
我们编写local_server.py文件,注意这里调用join()是为了避免进程退出,同样会暴露一个grpc的端口。
启动客户端服务
启动local server后,我们可以在本地起一个客户端来调用,注意这里local server的地址是
注意要启动客户端,我们需要开另一个终端进入local server的容器,例如“docker exec -it 100cd4fb5bca bash”。
我们看到constant的字符串已经正常输出,有人发现这与单机版的TensorFlow例子很像,实际上Session的参数不同,并且这个op是在local server进程中执行并返回的,如果使用错误端口就会报RPC请求连接错误。
我们总结一下,TensorFlow的local server实现了与分布式server一样的接口,通过了解local server的使用和实现我们就更容易理解分布式TensorFlow的使用了。其中server对象有比较重要的概念就是server.targe,客户端通过targe找到对应的集群,还有两个函数分别是server.start()和server.join(),就是启动服务和避免进程退出的。
转载请注明来自36大数据(): &
除非特别注明,本站所有文章均不代表本站观点。报道中出现的商标属于其合法持有人。请遵守理性,宽容,换位思考的原则。使用tensorflow构建简单卷积神经网络
CIFAR-10分类问题是机器学习领域的一个通用基准,其问题是将32X32像素的RGB图像分类成10种类别:飞机,手机,鸟,猫,鹿,狗,青蛙,马,船和卡车。
本教程的目标是建立一个相对简单的CNN卷积神经网络用以识别图像。在此过程中,本教程:
高亮网络架构,训练和验证的典型组织。 为构建更大更复杂的模型提供模板。
选择 CIFAR-10的原因是其复杂程度足以训练tensorFlow拓展成超大模型能力的大部分。同时,于训练而言,此模型也足够小,这对于想实现新想法和尝试新技术堪称完美。
三 教程的高亮部分
CIFAR-10教程演示了使用TensorFlow构建更大更复杂模型几个重要结构:
核心数学包括卷积,修正的线性激活,最大池化,LRN即局部响应一体化(AlexNet的论文3.3章) 训练期间网络活动的可视化,包括输入图像、损失函数值、激活函数值和梯度的分布。 计算学习参数的均线(moving average)的惯常做法,以及在评估期间使用这些均线来促进预测性能。 随时间递减的学习速率清单的实现
为消除从磁盘读取模型的延迟和代价极大的图像预处理的预取队列。
我们同时提供了一个的模型演示:
配置并行环境下跨多个GPU的训练的单个模型 在多GPU中共享和更新变量
我们期望此教程能为基于TensorFlow的可视化任务创建更大CNNs模型提供起点。
四 模型架构
CIFAR-10教程中的模型是一个由可选的卷积和非线性层组成的多层架构。这些网络层之后是连接到一个softmax分类器的全连接的网络层。模型遵照Alxe Krizhevsky所描述的模型架设,只是最前面的几层有细微差别。
此模型获得了一个极致的表现,在一个GPU上训练几个小时可以达到约86%的准确率。下文和代码部分有详细说明。模型由1068298个可学习的参数并且单张图片需要个加乘操作以计算推理。
五 代码组织
此教程的代码位于
cifar10_input.py
读取本地的CIFAR-10二进制文件
cifar10.py
创建CIFAR-10模型
cifar10_train.py
在CPU或者GPU上训练CIFAR-10模型
cifar10_multi_gpu_train.py
在多个GPU上训练CIFAR-10模型
cifar10_eval.py
评估CIFAR-10模型的预测性能
六 CIFAR-10 模型
CIFAR-10网络大部分代码在 cifar10.py。完整的训练图包括大概765个操作,我们发现通过使用以下模块来构建计算图,我们可以最大限度的重用代码:
模型输入: inputs() 和 distorted_inputs() 分别是评估和训练的读取并预处理CIFAR图像的加法操作 模型预测: inference()是推理加法操作,即在提供的图像中进行分类。 模型训练: loss() 和 train() 的加法操作是用来计算损失函数,梯度,变量更新和可视化摘要。
七 模型输入
模型的输入部分由从CIFAR-10的二进制文件读取函数 inputs()和distorted_inputs() 完成。这些文件包括固定字节长度的记录,因此我们使用tf.FixedLengthRecordReader 。查看读取数据来学习Reader class如何实现。
图像将按照以下步骤进行处理:
它们被裁减成24x24的像素,中央部分用来做评估或随机地用以训练。
它们是 用以使模型对动态变化不敏感。
对于训练部分,我们会额外应用一系列随机扭曲来人为增加数据集:
将图像随机的左右翻转
随机扰乱图像亮度 随机扰乱图像对比度
在可以查看可用的扭曲方法列表。为了在TensorBoard中可视化,我们也在图像中增加了一个 。这对于校验输入是否构建正确是个良好举措。
从磁盘中读取图像并扰乱,可能会消耗不确定的时间。为防止这些操作拖慢训练过程,我们使用16个独立线程不断地从一个TensZ喎"/kf/ware/vc/" target="_blank" class="keylink">vckZsb3e208HQoaM8L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L3A+DQo8aDIgaWQ9"八-模型预测">八 模型预测
模型的预测部分由inference()函数构建,该操作会添加其他操作以计算预测逻辑。模型的此部分组织如下:
网络层名称
卷积和修正线性激活层
局部响应一体化
卷积和修正线性激活层
局部响应一体化
使用修正线性激活的全连接层
使用修正线性激活的全连接层
softmax_linear
线性转换以产生logits
下图由TensorBoard生成用以描述推理操作
input()和inference() 函数提供了在模型上进行评估的全部所需组件。我们先将注意力移到训练模型。
九 模型训练
训练一个完成N类分类的网络的常用方法是多项式logstic回归,aka.softmax回归。softmax回归在网络输出上应用一个 非线性函数并计算标准预测和标签的1-hot编码的交叉熵。我们也将通常使用的权值衰减损益应用到所有学习变量上来完成正则化。 模型的目标函数是交叉熵损失之和,以及由 loss()函数返回的权值衰减项。
我们在TensorBoard使用scalar_summary对其可视化:
我们使用标准的梯度下降算法(见对其他算法的方法),其学习速率随时间指数递减。
train()函数添加必要的操作通过计算梯度和更新学习变量(详见)以最小化目标变量。
该函数返回一个执行所有的训练和更新一批图像所需的计算操作。
十 运行和训练模型
通过运行脚本cifar10_train.py训练操作
python cifar10_train.py
注意:首次运行该脚本时,CIFAR-10数据集会被自动下载。数据集大小为 160MB
如果成功,你将会看到如下输出:
Filling queue with 20000 CIFAR images before starting to train. This will take a few minutes.
11:45:45.927302: step 0, loss = 4.68 (2.0 examples/ 64.221 sec/batch)
11:45:49.133065: step 10, loss = 4.66 (533.8 examples/ 0.240 sec/batch)
11:45:51.397710: step 20, loss = 4.64 (597.4 examples/ 0.214 sec/batch)
11:45:54.446850: step 30, loss = 4.62 (391.0 examples/ 0.327 sec/batch)
11:45:57.152676: step 40, loss = 4.61 (430.2 examples/ 0.298 sec/batch)
11:46:00.437717: step 50, loss = 4.59 (406.4 examples/ 0.315 sec/batch)
脚本每运行10次输出一次总的损失函数值。注意:
第一批数据可能会相当慢(例如:几分钟),因为预处理线程会将20万张处理过的图像数据填充混洗队列。 输出的损失函数值是最近一批数据的均值,要记得损失函数值是 交叉熵和权值递减项的总和。
密切关注批处理速度,以上数据由 Tesla K40c机器上输出,如果在CPU上运行可能会输出比这个更低的速率。
cifar10_train会定期保存所有的模型参数到checkpoint files,但是它并不评估模型。checkpoint files将会被用于cifar10_eval.py来衡量预测性能。见下文的评估模型
脚本cifar10_train.py的终端输出的文本只提供了模型如何训练的最小视角。我们可能需要更多的信息:
损失函数值真的在递减吗?还是说只是噪声
模型的输入训练图像是否合适? 其梯度,激活函数,权值是否合理?
当前的学习速率?
提供了此类函数,展示了脚本cifar10_train.py通过阶段性输出的数据。
比如说,我们可以查看激活函数分布和训练过程中local3特性的稀疏度。
损失函数值会随着时间呈现,但是由于训练过程中某些批量数据量过小而出现一些噪音数据。实际情况中,我们发现可视化原生数据之外的均线(moving averages)很有用。可以通过脚本查看。
十一 评估模型
接下来,我们需要评估我们的训练模型在hold-out数据集上的性能。模型由脚本cifar10_eval.py评估。它由inference()函数构建模型,并使用cifar-10数据集中的10000张图像。它会计算图像的真实标签的最高预测匹配的频率。
为观察模型如何逐步在训练过程提高,评估脚本会阶段性地运行由cifar10_train.py脚本创建的checkpoint files。
python cifar10_eval.py
注意:不要在相同的GPU上运行训练和评估,否则会出现内存不足错误。可以考虑在分开的GPU上运行,或者在运行评估程序时挂起训练程序
你将会看到如下输出:
08:30:44.391206: precision @ 1 = 0.860
脚本极少情况下会返回精确度为precision @ 1 ,当前这个例子返回的是86%的准确率。cifar10_eval.py也会导出一些可以在TensorBoard里可视化的概要信息。
训练脚本计算所有的学习参数的变动均值(moving average version)。评估脚本则用变动均值(moving average version)替换所有的学习的模型参数,这些替换将有益于模型评估时的性能。
十二 使用多GPU训练模型
在分布式并行环境下训练模型需要一致的训练过程。接下来,我们将模型副本分配到训练数据集的每个子集上。
简单地运行异步更新模型参数将导致局部最优化,这是因为单个模型的副本可能会在过时的模型参数上进行训练了。反过来说,完全的同步更新将会使整个过程与最慢的模型副本一样慢。
工作站中的多GPU一般有相似的速度和内存。因此,我们按照如下步骤设计训练系统:
每个GPU上放一份独立的模型副本。
通过等待所有的GPU完成某一批数据的处理来同步更新模型参数。
如下是模型的数据图:
注意到,每个GPU都会计算一份独一无二的数据的inference和梯度。这样的设置将极有效地在多GPU之间划分一个大批量数据。
这样的设置需要所有的GPU共享模型参数。众所周知,从GPU传输数据或者传输数据到GPU都相当慢。因此,我们决定在CPU上存储和更新所有的模型参数(见绿色盒图)。只有当一批数据已经被所有GPU处理之后,一份新的模型参数才会被传输到GPU。
GPU在操作上是同步的,所有的来自各个GPU的梯度都会被累加和均值化。模型参数会被所有模型的梯度均值更新。
十三 在设备上放置变量和操作
在设备上放置操作和变量需要一些特殊抽象。
第一个抽象是我们需要一个函数来计算模型的单个副本的inference和梯度。在代码中,我们将这种抽象标为tower。我们必须为每个tower设置两个参数。
一个tower内所有的操作都需要一个独一无二的名字。tf.name_scope()通过前置范围的形式提供了方法。比如说,第一个tower,tower_0内的所有操作都会有一个前置 tower_0/conv1/Conv2D。
某个tower的首选硬件设备。tf.device()可以来指定。比如说,第一个tower的所有的操作使用范围 device(&/gpu:0&) 指明其应当在第一颗GPU上运行。
所有的变量都会被固定到CPU,并且可以通过tf.get_variable()在多GPU之间共享。关于如何请见下文。
十四 在多GPU上运行和训练模型
对于有多颗GPU的机器,使用cifar10_multi_gpu_train.py脚本将会更快的训练模型。次代码在多颗GPU之间并行训练模型。
python cifar10_multi_gpu_train.py --num_gpus=2
GPU数量默认为1.
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'真正从零开始,TensorFlow详细安装入门图文教程! | 雷锋网
我的图书馆
真正从零开始,TensorFlow详细安装入门图文教程! | 雷锋网
AI这个概念好像突然就火起来了,年初大比分战胜李世石的AlphaGo成功的吸引了大量的关注,但其实看看你的手机上的语音助手,相机上的,今日头条上帮你自动筛选出来的新闻,还有各大音乐软件的歌曲“每日推荐”……形形色色的AI早已进入我们生活的方方面面。深刻的影响了着我们,可以说,这是一个AI的时代。其实早在去年年底,谷歌就开源了其用来制作AlphaGo的深度学习系统Tensorflow,相信有不少同学曾经对着这款强大的机器学习系统蠢蠢欲动,但虽然有关Tensorflow的教程其实不少,甚至谷歌官方就在Tensorflow的官网给出了一份详细的教程,也有网站已经将其翻译成了(点击查看),但它仍然是有门槛的,尤其是对于对计算机及编程语言了解不深的同学,可能看着页面上凭空给出的代码陷入懵逼。而今天我要做的,就是带着所有这些几乎没有编程基础却很想学习Tensorflow的同学跨过这道坎。告诉你们大家如何准备好使用Tensorflow进行编程所需的一切,以及如何看懂教程上的那些代码所代表的含义,那么废话不多说,我们马上开始。在Linux操作系统下的安装安装环境Tensorflow的支持列表里是没有Windows的。虽然可以用Docker来实现在Windows上运行,但小问题很多,它支持的最好的还是基于unix内核的系统,如Linux,因此我们最好还是安装一个Linux的环境来运行它。Linux是一款免费的开源操作系统,应用非常广泛,如著名的Android就是基于Linux改进的一款针对手机的操作系统。而对于我们来说,最易于理解的版本就是著名的Ubuntu,点击即可去官网下载,正如前面所说,下载和使用都是免费的。如果你使用的是Mac,那就方便很多了,因为Mac os本身就是一个基于Unix的操作系统,已经搭载了全部安装Tensorflow所需要的组件。所以安装的很多步骤都可以省去,直接进行Tensorflow的安装,不过命令同Ubuntu有所不同。但你也可以看看接下来的教程,对理解那些命令也会有帮助。呃……你说你在Mac上装了Windows?下载之后,你会得到一个装着Ubuntu系统的.iso文件。有两个办法来处理它,一是直接安装,同电脑现在在用的系统组成双系统(当然你也可以换掉现在的系统,不过我想应该没有人会愿意这么做的吧哈哈)。如果你不想那么大动干戈,也可以通过虚拟机来虚拟一个系统。不过,安装虚拟机对配置有一定要求,毕竟它相当于在你的电脑上同时打开两个系统了——CPU最好不要低于4代i3(尤其是笔记本,CPU型号的i3/5/7-xxxx的四位数里第一个x就表示它的代数)。内存——注意,内存一定不能低于4g,因为你给虚拟机分配的内存在虚拟机启动之后会1:1的从你的物理内存中划走。再加上物理机系统的消耗。当然,这个配置表是只有下限没有上限的,你的电脑配置越好,体验就越好。而装双系统的话,对配置的需求就小很多了。虚拟机安装中网上相关的教程都比较多,在这里就不重复了,注意搜索安装双系统教程的时候要加上你现用的系统和你下载的Ubuntu系统的版本号。这里只讲几个需要注意的地方。因为Linux对安全性非常重视,因此不仅权限管理十分严格,在创建操作系统的时候也会要求你一定要输入一个密码,这个密码将用来登陆和获得root权限。就比如上面这个界面,如果你不把所有空格都填好是没法点下一步的。PythonUbuntu桌面的样子,(悄悄说一句笔者觉得基于Unix的系统普遍比Windows好看太多,主要是字体看着真舒服)安装好之后,我们看到了一些熟悉的软件和一些不熟悉的软件,我们先不去管它,介绍一下Python。Python是一种高级语言,它的特点是程序很简洁,但是因为简洁,所以在将其翻译成CPU可以理解的指令——也就是执行代码的时候速度会比那些低级一些的语言,比如C语言慢一些。不过在现在电脑的性能面前,这种速度的差别大多数时候根本不足挂齿。解释器很多人可能会觉得Python很抽象,因为提到Python,大家不会像C语言那样马上想起它有一个专用的编译器。Python可以执行的地方千奇百怪。甚至可以很方便的在系统的Terminal(一个类似于Windows里的命令行的工具)里直接执行。Ubuntu自带了Python,因此一般不用烦心安装事宜。Tensorflow支持多种前端语言,但对Python的支持是最好的,因此我们的教程也基于Python来进行,首先我们打开Terminal。作为Ubuntu中非常重要的一个组成部分,有很多种方法可以打开它。比如在桌面上点击右键也可以点击左上角的那个Ubuntu图标搜索。打开后可以看到Terminal窗口如下所示。标题栏里@符号前面是你的用户名。如果你在你的计算机使用史中从来没有离开过图形用户界面(就是有一个鼠标和很多图标让你点的那种)。看到这个简单得吓人的窗口不要慌,只要输入正确的命令就好了。在正式开始之前我想说:一定要注意窗口给出的提示(英文)。在实际操作中可能会碰到各种各样的问题,但常见的问题其实都可以根据它的报错信息找到原因,只要上网搜一搜相应的信息就能解决,甚至它自己就会给出解决的建议。如果你发现你的步骤一切正确,但就是无法成功,多试几次就好了,毕竟这些服务都是谷歌提供的,而谷歌……你懂的。必不可少的python-pip和python-dev在这个窗口中输入命令:$ sudo apt-get install python-pip python-dev注意,窗口中其实已经有一个$符号了,因此你在复制或者输入命令时其实不用将这个$符号也包括进去,但是网上的教程给出命令的时候一般是会把这个符号包括进去的,作为一个标志。注意一下就好。命令最开始的sudo意味着这条指令将以root权限执行,所以需要输入你最开始设置的那个密码,注意输入过程在屏幕上是不会有任何体现的。输完直接按回车就行。输入后会出现一串代码,然后问是否继续,输入y回车然后可以静待安装完成,解释一下这条命令:apt-get是从软件仓库中获取软件的一条命令,而软件仓库是Linux各大发行版的共有特征:它是一系列存放软件的服务器或网站,包含了软件包和索引文件,用户可以很轻松的使用命令自动定位并安装其中的软件,而省去了到处搜索的麻烦。install则是安装指令,而python-pip和python-dev则是两个需要安装的软件包的名字。pip可以理解成一个比较高级的软件安装器,安装Tensorflow要用到,而dev则是一个额外的类库,也是Tensorflow的安装和运行需要的。如果一切顺利,在大串英文划过后,我们会看到如下的界面:此时就可以安装Tensorflow了,指令如下:$ sudo pip install --upgrade /tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl就像前面所说的,你可能会碰到这样那样的问题,比如下图这样的在这些时刻,不要慌张,仔细阅读错误信息,越往后的通常越重要,因为结论都是在最后给出的,像这个的最后:你看,它不仅告诉了你应该试着做什么,连怎么做都告诉你了。按它说的做就好不过其实当时笔者用的并不是8.1.1版本,使用升级命令后也只是升级到了8.1.1版本,再次输入相同命令,它会告诉你你的版本已经是最新的了。但问题确实解决了,这条提示在之后没有再出现。更新程序将版本更新到了8.1.1,然后这个提示就不会再烦你了再次输入安装Tensorflow的命令,如果不行,就多试几次,仔细看这些黄字的信息,会发现Network is unreachable这样的字样,如果你有什么传说中的利器的话,现在是时候拿出来用了。但是不用也没关系,多试几次,还是可以成功的。出现上图这样的界面的时候,你就可以长舒一口气,因为安装已经完成,现在你已经可以使用Tensorflow了,让我们跟着教程向世界说声hi吧。从Terminal进入Python环境的方法也很简单,直接输入命令:Python。如果本机已经安装了Python,Terminal会显示Python的版本号等信息,同时下一个指令的前缀会由用户名等一串字符变成这样的东西:“&&&”,这说明进入完成了。按照下面的命令一行一行的敲入代码,语法我在这就不解释了~为了到达这一步,你可能付出了很多艰辛,可能中途出了很多错,但相信当你看到程序真的按照你的指令来运行了一遍,你会觉得这一切都是值得的。#彩蛋时间#1.程序员们在接触一门新语言的时候,通常做的第一件事就是编写一个Hello World程序,这一惯例源自最初一批大神们对计算机程序的希冀,希望它们就像一个新生儿一样,能友善的对这个世界宣告它的到来。2.数字42的含义非常深刻。据著名一本道科幻小说“银河系漫游指南”所说,42是一个关于“生命、宇宙以及一切”的问题的答案(哈?你问我问题是什么?)。谷歌的创始人很可能也是这本小说的狂热粉丝,因为谷歌把这个彩蛋也嵌入了它们的搜索引擎之中,而且谷歌的总部外面就有一个“42”的模型。大型程序开发必备:IDE(集成开发环境)虽然说在Terminal里就可以直接编程了,但我们总还是需要一个工具的,要不然要编一个大型程序几乎是不可能完成的事。这就是IDE出场的时候了。大家就会惊喜的发现,自己之前在C语言看过的熟悉的编程界面又回来了(当然它们很多都是收费的)。其实由于Python是开源的,理论上任何人足够厉害的人都能开发出针对它的IDE,而确实有很多人这样做了。牛人太多,他们做出的工具孰优孰劣大家并没有统一的意见,所以大家干脆就不介绍该用哪个了,这才造成了很多人对Python“抽象”的感觉。好用的IDE有很多,本文介绍的是Komodo IDE的免费版Komodo Edit。在Linux下打开它的官网(点击链接/download/edit-linux64/#),下载得到的是一个压缩文件。点击右键解压。Linux中安装有些第三方软件的方法和Windows不太一样,比如这款,在它的文件夹里有一个install.sh。这实际上就是安装文件,但直接打开它是不行的,要安装它还得在Terminal里进行。进入Terminal,确保自己在普通而不是Python环境下,然后通过输入cd+文件夹名称,逐层进入这个安装文件所在的文件夹,如进入Download文件夹,就输入:cd Download(Python对大小写敏感,因此最好养成在输入时都分清大小写的习惯。),因为在输入一个安装命令的时候,程序只会在你当前所在的那个文件夹(不包括子文件夹)里搜索安装文件的名称。习惯图形界面的人可能会有点头晕,但是只要牢记以下这点就能找到回家的路:打开Terminal时默认你所在的文件夹对应的文件管理器界面就是下图这个。在初期你可以一边开着图形界面打开文件夹,一边在Terminal里敲出对应的路径,这样就不会迷路了。当然,有些软件有更简单的安装方式,这里不讲了。到达安装文件所在的界面之后,输入./+文件名称,如本例中就是输入./install.sh,效果如下:按照信息中给出的路径就可以找到启动这个程序的文件了,本例的文件在bin里。接下来的设置就和在Windows中差不多了。打开后,我们通过它试验一下官方教程中“介绍”部分给出的一个相对简单的算法。点击New File点击右上角的语言选择,选择Python,这样就可以在输入过程中检查出一些语法错误。(如果直接复制的话,会把网页里带有的一些奇怪的代码也带过来,会导致程序运行出错,如下面示例中出现过的那样,因此需要将中文注释删掉。)将输入的代码保存为*.py,这是Python文件的后缀名。可以通过Terminal调用。按照之前的方法在Terminal中进入到存放文件的文件夹里,本文中的路径是这样的:然后输入Python+文件名,本例中是Python Text-3.py,由于这个算法很简单,很快就能得到结果。满满的成就感有没有?总结其实本教程只是开了一个很小很小的头,讲解了关于Tensorflow的一些最基础的知识,包括其他环境中的安装、GPU支持等稍微复杂一点的东西都没有讲到。但实际上这从0到1的过程却是难住很多人的最大因素。在了解到教程中的这些东西之后,相信理解Tensorflow的官方教程已经对你没有难度了,如果你跟着官方教程走下去,会发现其实这些东西并不算难,相信以各位的智慧一定能学会的。那么本次教程就到这里了,各位加油吧,说不定创造出下一个AlphaGo的就是你们呢。
发表评论:
TA的最新馆藏

我要回帖

更多关于 tensorflow分布式问题 的文章

 

随机推荐