tensorflow⼊门详解
1.介绍
TensorFlow™ 是⼀个采⽤数据流图(data flow graphs),⽤于数值计算的开源软件库。TensorFlow 最初由Google⼤脑⼩组(⾪属于Google机器智能研究机构)的研究员和⼯程师们开发出来,⽤于机器学习和深度神经⽹络⽅⾯的研究,但这个系统的通⽤性使其也可⼴泛⽤于其他计算领域。它是⾕歌基于DistBelief进⾏研发的第⼆代⼈⼯智能学习系统。2015年11⽉9⽇,Google发布⼈⼯智能系统TensorFlow并宣布开源。
其命名来源于本⾝的原理,Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算。Tensorflow运⾏过程就是张量从图的⼀端流动到另⼀端的计算过程。张量从图中流过的直观图像是这个⼯具取名为“TensorFlow”的原因。
3.什么是数据流图
数据流图⽤“节点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点”⼀般⽤来表⽰施加的数学操作,但也可以表⽰数据输⼊(feed in)的起点/输出(push out)的终点,或者是读取/写⼊持久变量(pe
rsistent variable)的终点。“线”表⽰“节点”之间的输⼊/输出关系。这些数据“线”可以运输“size可动态调整”的多维数组,即“张量”(tensor)。⼀旦输⼊端所有张量准备好,节点将被分配到各种计算设备完成异步并⾏地执⾏计算。
⾼度的灵活性: TensorFlow不是⼀个严格的“神经⽹络”库。只要你可以将你的计算表⽰为⼀个数据流图,你就可以使⽤TensorFlow。
可移植性(Portability):Tensorflow可以运⾏在台式机、服务器、⼿机移动等等设备上。⽽且它可以充分使⽤计算资源,在多CPU和多GPU上运⾏。
多语⾔⽀持:Tensorflow提供了⼀套易⽤的Python使⽤接⼝来构建和执⾏graphs,也同样提供了⼀套易于C++使⽤的接⼝(⽬前训练神经⽹络只⽀持python,C++接⼝只能使⽤已经训练好的模型)。未来还会⽀持Go、Java、Lua、Javascript、R等等。
性能最优化:TensorFlow给予了线程、队列、异步操作等最佳的⽀持,TensorFlow可以把你⼿边硬件的计算潜能全部发挥出来,它可以充分利⽤多CPU和多GPU。
5.下载及安装
既可以直接使⽤⼆进制程序包也可以从github源码库克隆源码编译安装。
要求
TensorFlow 提供的Python API⽀持Python2.7和Python3.3+
GPU版本的⼆进制程序包只能使⽤Cuda Toolkit8.0 和 cuDNN v5。如果你使⽤的是其他版本(Cuda toolkit >= 7.0 and cuDNN >= v3),那你就必须使⽤源码重新编译安装。
推荐⼏种Linux平台的安装⽅式:
Pip install:可能会升级你之前安装过的Python包,对你机器上的Python程序造成影响。
Anaconda install:把TensorFlow安装在Anaconda提供的环境中,不会影响其他Python程序。
Installing from sources:把TensorFlow源码构建成⼀个pip wheel ⽂件,使⽤pip⼯具安装它。
Pip installation
Pip是⼀个⽤来安装和管理Python软件包的包管理系统。
安装pip(如果已经安装,可以跳过)
# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev
直接使⽤pip安装TensorFlowubuntu使用入门教程
$ pip install tensorflow
如果提⽰不到对应的包,使⽤
$ pip install tensorflow-gpu
如果提⽰不到对应的包,使⽤
Anaconda installation
Anaconda是⼀个Python发⾏版,包括⼤量的数字和科学计算包。使⽤“conda”来管理软件包,并且拥有⾃⼰的环境系统。安装步骤
安装Anaconda
创建conda环境
激活conda环境,在其中安装TensorFlow
每次使⽤TensorFlow时,激活conda环境
Installing from sources
6.基本使⽤
基本概念
使⽤TensorFlow前必须明⽩的基本概念:
图(Graph):图描述了计算的过程,TensorFlow使⽤图来表⽰计算任务。
张量(Tensor):TensorFlow使⽤tensor表⽰数据。每个Tensor是⼀个类型化的多维数组。
操作(op):图中的节点被称为op(operation的缩写),⼀个op获得0个或多个Tensor,执⾏计算,产⽣0个或多个Tensor。
会话(Session):图必须在称之为“会话”的上下⽂中执⾏。会话将图的op分发到诸如CPU或GPU之类的设备上执⾏。
变量(Variable):运⾏过程中可以被改变,⽤于维护状态。
计算图
Tensorflow程序通常被组织成⼀个构建阶段和⼀个执⾏阶段。在构建阶段,op的执⾏步骤被描述成⼀个图。在执⾏阶段,使⽤会话执⾏图中的op。
构建图
构建图的第⼀步是创建源op(sources op)。源op不需要任何输⼊,例如常量(Constant)。源op的输出被传递给其他op做运算。
在TensorFlow的Python库中,op构造器的返回值代表这个op的输出。这些返回值可以作为输⼊传递给其他op构造器。
TensorFlow的Python库中包含了⼀个默认的graph,可以在上⾯使⽤添加节点。如果你的程序需要多个graph那就需要使⽤Graph类管理多个graph。
import tensorflow as tf
# 创建⼀个常量 op, 产⽣⼀个 1x2 矩阵. 这个 op 被作为⼀个节点
# 加到默认图中.
#
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])
# 创建另外⼀个常量 op, 产⽣⼀个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])
# 创建⼀个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输⼊.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)
默认图中包含了3个节点:两个constant() op和⼀个matmul() op。为了真正的执⾏矩阵相乘运算,并得到矩阵乘法的结果,你必须在会话中启动这个图。
启动图
构造阶段完成后,才能在会话中启动图。启动图的第⼀步是创建⼀个Session对象。如果没有任何参数,会话构造器将启动默认图。
# 启动默认图.
sess = tf.Session()
# 调⽤ sess 的 'run()' ⽅法来执⾏矩阵乘法 op, 传⼊ 'product' 作为该⽅法的参数.
# 上⾯提到, 'product' 代表了矩阵乘法 op 的输出, 传⼊它是向⽅法表明, 我们希望取回
# 矩阵乘法 op 的输出.
#
# 整个执⾏过程是⾃动化的, 会话负责传递 op 所需的全部输⼊. op 通常是并发执⾏的.
#
# 函数调⽤ 'run(product)' 触发了图中三个 op (两个常量 op 和⼀个矩阵乘法 op) 的执⾏.
#
# 返回值 'result' 是⼀个 numpy `ndarray` 对象.
result = sess.run(product)
print result
# ==> [[ 12.]]
# 任务完成, 关闭会话.
sess.close()
Tensorflow的实现上,会把图转换成可分布式执⾏的操作,以充分利⽤计算资源(例如CPU或GPU)。通常情况下,你不需要显⽰指使⽤CPU或者GPU。TensorFlow能⾃动检测,如果检测到GPU,TensorFlow会使⽤第⼀个GPU来执⾏操作。
如果机器上有多个GPU,除第⼀个GPU外的其他GPU是不参与计算的,为了使⽤这些GPU,你必须将op明确指派给他们执⾏。with…Device语句⽤来指派特定的CPU或GPU执⾏操作:
with tf.Session() as sess:
with tf.device("/gpu:1"):
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
设备⽤字符串进⾏标识. ⽬前⽀持的设备包括:
“/cpu:0”: 机器的 CPU.
“/gpu:0”: 机器的第⼀个 GPU, 如果有的话.
“/gpu:1”: 机器的第⼆个 GPU, 以此类推.
tensor
Tensorflow使⽤tensor数据结构来代表所有的数据。计算图的操作之间仅能传递tensor。你可以把tensor当作多维数组或列表。每⼀个tensor 包含有⼀个静态类型,⼀个rank和⼀个shape。想了解更多TensorFlow是如何操作这些概念的,参考Rank, Shape, and Type
变量
变量维持图计算过程中的状态信息。下⾯的例⼦演⽰了如何使⽤变量作为⼀个简单的计数器。
# Create a Variable, that will be initialized to the scalar value 0.
state = tf.Variable(0, name="counter")
# Create an Op to add one to `state`.
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# Variables must be initialized by running an `init` Op after having
# launched the graph. We first have to add the `init` Op to the graph.
init_op = tf.global_variables_initializer()
# Launch the graph and run the ops.
with tf.Session() as sess:
# Run the 'init' op
sess.run(init_op)
# Print the initial value of 'state'
print(sess.run(state))
# Run the op that updates 'state' and print 'state'.
for _ in range(3):
sess.run(update)
print(sess.run(state))
通常可以将⼀个统计模型中的参数表⽰为⼀组变量。例如,你可以将⼀个神经⽹络的权重当作⼀个tensor存储在变量中。在训练图的重复运⾏过程中去更新这个tensor。
Fetch
为了取回操作的输出内容,在使⽤Session对象的run()⽅法执⾏图时,传⼊⼀些tensor,这些tensor会帮你取回结果。之前的例⼦中,我们只取回了state节点,但是你也可以取回多个tensor:
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)
with tf.Session() as sess:
result = sess.run([mul, intermed])
print result
# 输出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
需要获取的多个 tensor 值,在 op 的⼀次运⾏中⼀起获得(⽽不是逐个去获取 tensor)。
Feed
上⾯的例⼦中展⽰了在计算图中引⼊tensor,以常量和变量的形式存储。TensorFlow还提供了feed机制,该机制可以临时替换图中的tensor。
feed使⽤⼀个tensor值临时替换⼀个操作的输出。可以把feed数据作为参数提供给run()⽅法。标记的⽅法是使⽤tf.placeholder()为这些操作创建占位符。
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
print sess.run([output], feed_dict={input1:[7.], input2:[2.]})
# 输出:
# [array([ 14.], dtype=float32)]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论