原文:http://blog.csdn.net/sa14023053/article/details/51884377
背景
关于 tensorflow
TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。
什么是数据流图(Data Flow Graph)?
数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
tensorflow 特点
-
高度的灵活性
TensorFlow 不是一个严格的“神经网络”库。只要你可以将你的计算表示为一个数据流图,你就可以使用Tensorflow。你来构建图,描写驱动计算的内部循环。
-
真正的可移植性
Tensorflow 在CPU和GPU上运行,比如说可以运行在台式机、服务器、手机移动设备等等。
-
自动求微分
基于梯度的机器学习算法会受益于Tensorflow自动求微分的能力。作为Tensorflow用户,你只需要定义预测模型的结构,将这个结构和目标函数(objective function)结合在一起,并添加数据,Tensorflow将自动为你计算相关的微分导数。
-
多语言支持
Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和执行你的graphs。你可以直接写python/c++程序。Go,Java,Lua,Javascript,或者是R 的API也在不断的开发中。
-
性能最优化
比如说你又一个32个CPU内核、4个GPU显卡的工作站,想要将你工作站的计算潜能全发挥出来?由于Tensorflow 给予了线程、队列、异步操作等以最佳的支持,Tensorflow 让你可以将你手边硬件的计算潜能全部发挥出来。你可以自由地将Tensorflow图中的计算元素分配到不同设备上,Tensorflow可以帮你管理好这些不同副本。
tensorflow上手使用
使用tensorflow用平面拟合三维数据
<code class="language-python hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#coding=utf-8</span>
<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'''
生成三维数据,用平面去拟合
'''</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> tensorflow <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> tf
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> numpy <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> np
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 使用 NumPy 生成假数据(phony data), 总共 100 个点.</span>
x_data = np.float32(np.random.rand(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 随机输入</span>
y_data = np.dot([<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.100</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.200</span>], x_data) + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.300</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 构造一个线性模型</span>
b = tf.Variable(tf.zeros([<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]))
W = tf.Variable(tf.random_uniform([<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>], -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span>))
y = tf.matmul(W, x_data) + b
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 最小化方差</span>
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span>)
train = optimizer.minimize(loss)
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 初始化变量</span>
init = tf.initialize_all_variables()
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 启动图 (graph)</span>
sess = tf.Session()
sess.run(init)
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 拟合平面</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> step <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> xrange(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">201</span>):
sess.run(train)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> step % <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span> == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> step, sess.run(W), sess.run(b)
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 得到最佳拟合结果 W: [[0.100 0.200]], b: [0.300]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul>
运行结果:
<code class="hljs lua has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">[root@master tensorflow]# python demo2.py
I tensorflow/core/common_runtime/local_device.cc:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">25</span>] Local device intra op parallelism threads: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">24</span>
I tensorflow/core/common_runtime/local_session.cc:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">45</span>] Local session inter op parallelism threads: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">24</span>
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[-0.49180511 0.69824928]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.76379919</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[-0.0375709 0.23476422]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.35483342</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">40</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[ 0.0724101 0.20012772]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.31455269</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">60</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[ 0.09411168 0.1987025 ]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.30379418</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[ 0.09867454 0.19946699]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.30097923</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[ 0.09968913 0.19983345]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.30025125</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">120</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[ 0.09992492 0.1999529 ]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.30006427</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">140</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[ 0.09998151 0.19998731]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.30001637</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">160</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[ 0.09999539 0.19999665]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.30000418</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">180</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[ 0.09999884 0.19999914]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.30000106</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">200</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[ 0.09999971 0.19999979]]</span> [ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.30000025</span>]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>
tensorflow要点
使用 TensorFlow, 你必须明白 TensorFlow:
- 使用图 (graph) 来表示计算任务.
- 在被称之为 会话 (Session) 的上下文 (context) 中执行图.
- 使用 tensor 表示数据.
- 通过 变量 (Variable) 维护状态.
- 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.
tensorflow使用
-
定义tensorflow变量
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
-
定义运算
y = tf.matmul(W, x_data) + b
-
定义损失函数,优化函数,优化目标
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
-
准备初始化所有变量
init = tf.initialize_all_variables()
-
启动图会话,初始化所有变量
sess = tf.Session()
sess.run(init)
-
迭代更新参数到好最优解
<code class="hljs glsl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">step</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> xrange(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">201</span>):
sess.run(train)</code>