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基本概念
基本概念
类型
|
描述
|
用途
|
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实战Google深度学习框架》