TensorFlow 原理:
TensorFlow 使用 Graph 来描述 计算任务 ,图中的节点被称之为 op. 一个op可以接受0或多个 tensor 作为输入,也可产生0或多个tensor作为输出.任何一个Graph要想运行,都必须借助上下文 Session .通过Session启动Graph,并将Graph中的op分发到CPU或GPU上,借助Session提供执行这些op.op被执行后,将产生的tensor返回.借助Session提供的 feed fetch 操作,我们可以为op赋值或者获取数据.计算过程中,通过变量 (Variable )来维护计算状态.
1、TensorFlow基本概念
基本概念 
<colgroup> </colgroup>
类型
描述
用途
Session
会话
图必须在称之为“会话”的上下文中执行。会话将图的op分发到诸如CPU或者GPU上计算
Graph
描述计算过程
必须在Session中启动
tensor
数据(张量)
数据类型之一,代表多维数组
op
操作
图中的节点被称之为op,一个op获得0或者多个Tensor,执行计算,产生0或者多个Tensor
Variable
变量
数据类型之一,运行过程中可以被改变,用于维护状态
feed
赋值
为op的tensor赋值
fetch
取值
从op的tensor中取值
Constant
常量
数据类型之一,不可变


2、计算图(Graph)
(1)在TensorFlow中,系统会自动维护一个默认的计算图,通过 tf.get_default_graph 函数可以获取当前默认的计算图
# 通过 a.graph 可以查看张量所属的计算图。因为没有特意指定,所以这个计算图
# 应该等于当前默认的计算图。所以下面这个操作输出值为 True
print (a.graph is tf. get_default_graph ())
(2)TensorFlow支持通过tf.Graph函数来生成新的计算图
g1=tf. Graph ()
with g1. as_default (): # 在计算图 g1 中定义变量 ’v' ,并设置初始值为 0
v=tf. get_variable ( 'v' , initializer =tf. zeros_initializer ([ 1 ]))

3、创建图和启动图
创建一个图并在Session中执行(TensorFlow实现一个简单的矩阵乘法)
import tensorflow as tf # 引入 TensorFlow
v1=tf. constant ([[ 2 , 3 ]]) # 创建一个常量 v1 ,它是一个 1 2 列的矩阵
v2=tf. constant ([[ 2 ],[ 3 ]]) # 创建一个常量 v2 ,它是一个 2 1 列的矩阵
# 创建一个矩阵乘法,创建乘法后,是不会立即执行的,要在会话中执行
product=tf. matmul (v1,v2)
sess=tf. Session () # 定义一个会话
result=sess. run (product) # 运算乘法,得到结果
print (result) # 打印结果 # 结果为 [[13]]
sess. close () # 关闭会话

4、 创建一个变量,并用for循环对变量进行赋值操作
TensorFlow使用Variables来维护图执行过程中的状态信息
import tensorflow as tf # 引入 TensorFlow
num=tf. Variable ( 0 , name = 'count' ) # 创建一个变量 num,初始化为0
new_value=tf. add (num, 10 ) # 创建一个加法操作,把当前数字加 10
op=tf. assign (num,new_value) # 创建一个赋值操作,把 new_value 赋值给 num
# 使用Python的上下文管理器机制,在运行完毕后,会话会自动关闭
with tf. Session () as sess:
sess. run (tf. global_variables_initializer ()) # 初始化变量
print (sess. run (num)) # 打印最初的 num
for i in range ( 5 ): # 创建一个 for 循环,每次给 num+10 ,并打印出来
sess. run (op)
print (sess. run (num))
# 输出结果如下
'''
0
10
20
30
40
50
'''
5、通过feed设置placeholder的值
import tensorflow as tf
input1=tf. placeholder (tf.float32) # 创建一个变量占位符 input1
input2=tf. placeholder (tf.float32) # 创建一个变量占位符 input2
# 创建一个乘法操作,把 input1 input2 相乘
new_value=tf. multiply (input1,input2)
# 创建会话,使用此方法,在运行完毕后,会话自动关闭
with tf. Session () as sess:
# 打印 new_value 的值,在运算时,用 feed 设置两个输入的值
print (sess. run (new_value, feed_dict ={input1:[ 23.0] ,input2:[ 11.0] }))
# 结果为 253.0

6、通过Fetch在会话中同时设置多个op
import tensorflow as tf
input1=tf. constant ( 3.0 ) # 设置三个常量
input2=tf. constant ( 2.0 )
input3=tf. constant ( 5.0 )
add=tf. add (input2,input3) # 加法操作
mul=tf. multiply (input1,add) # 乘法操作
with tf. Session () as sess:
result=sess. run ([mul,add]) # 在sess的运算中可以取回多个tensor
print (result)
# 结果为 [21.0, 7.0]

7、TensorFlow简单示例(实现单变量线性回归)
import tensorflow as tf
import numpy as np
#随机生成训练集
x_data=np.random. rand ( 100 ) # 使用 numpy 生成 100 随机点
y_data=x_data* 0.1 + 0.2

# 构造一个线性模型
b=tf. Variable ( 0. ) # 设置参数变量并初始化为 0
k=tf. Variable ( 0. )
y=k*x_data+b

# 二次代价函数(损失函数)
loss=tf. reduce_mean (tf. square (y_data-y))
# 定义一个梯度下降法来进行训练的优化器
optimizer=tf.train. GradientDescentOptimizer ( 0.2 ) #0.2 表示学习率
# 最小化代价函数
train=optimizer. minimize (loss)

init=tf. global_variables_initializer () # 初始化变量
with tf. Session () as sess:
sess. run (init) # 在会话里运行初始化变量
for step in range ( 201 ): # 迭代训练 200
sess. run (train)
if step% 20 == 0 : # 每迭代 20 次输出 k b 的值
print (step,sess. run ([k,b]))

结果:

8、TensorFlow实现神经网络向前传播算法
import tensorflow as tf
# 声明 w1 w2 两个变量
# 通过 seed 参数设定了随机种子,可以保证每次运行得到的结果一样
# 生成一个 2*3 的矩阵,矩阵中的元素是均值为 0 ,标准差为 1 的随机数
w1=tf. Variable (tf. random_normal ([ 2 , 3 ], stddev = 1 , seed = 1 ))
w2=tf. Variable (tf. random_normal ([ 3 , 1 ], stddev = 1 , seed = 1 ))
'''
# 将输入的特征向量定义为一个常量
x=tf.constant([[0.7,0.9]]) #x 是一个 1*2 的矩阵
'''
# 定义 placeholder 存放输入数据
x=tf. placeholder (tf.float32, shape =( 3 , 2 ), name = 'x_input' ) #3 2 列的样例数据

# 通过前向传播算法获得神经网络的输出
a=tf. matmul (x,w1)
y=tf. matmul (a,w2)

with tf. Session () as sess:
init_op=tf. global_variables_initializer () # 初始化所有的变量
sess. run (init_op)
print (sess. run (y, feed_dict ={x:[[ 0.7 , 0.9 ],[ 0.1 , 0.4 ],[ 0.5 , 0.8 ]]}))

# 结果为
'''
[[3.957578 ]
[1.1537654]
[3.1674924]]
'''

注:
(1)TensorFlow目前支持的所有随机数生成器

(2)



TensorFlow游乐场 https:// playground.tensorflow.org
参考资料:《TensorFlow实战Google深度学习框架》