Tensorflow的基本概念
- 使用图(graphs)来表示计算任务,即一整个计算任务流程被抽象成一个有向图
- 图的执行必须在被称之为会话(Session)的上下文中进行
- 张量tensor表示数据
- 通过变量(Variable)维护状态
- 使用feed为任意操作(op)赋值
- 使用fetch从任意操作中获取数据
注:可以将tensor看做不能被存储的数据,即经过操作op后,tensor将不存在。而variable可以看做可以被存储的数据(相当于C++中的一般性变量)
总而言之,Tensorflow是一个编程系统,使用图(graphs)来表示计算任务,图中的节点称之为op(operation),一个op获得0个或多个Tensor,执行计算,产生0个或多个Tensor。Tensor看作是一个n维数组或列表,图必须在会话(Session)里被启动。
例一:启动会话Session
import tensorflow as tf
#定义一个常量向量m1
m1=tf.constant([[3,3]])
#定义一个常量向量m2
m2=tf.constant([[2],[3]])
#定义一个对m1和m2做矩阵乘法的op
product=tf.matmul(m1,m2)
#尝试打印结果
print(product)
这里我们尝试直接对op结果进行打印,可以看到结果仅仅是一个tensor,而不是我们希望的到的答案(如下图)
这是因为,Tensorflow中的图必须在Session中运行,所以应该对代码进行如下修改:
import tensorflow as tf
#定义一个常量向量m1
m1=tf.constant([[3,3]])
#定义一个常量向量m2
m2=tf.constant([[2],[3]])
#定义一个对m1和m2做矩阵乘法的op
product=tf.matmul(m1,m2)
#定义一个会话,启动默认的图
sess=tf.Session()
#调用sess的run方法来执行矩阵乘法op
result=sess.run(product)
print(result)
#关闭会话
sess.close()
注意用这种方法,只要启动Session就必须关闭Session,因此也可以改成如下方式调用会话:
import tensorflow as tf
#定义一个常量向量m1
m1=tf.constant([[3,3]])
#定义一个常量向量m2
m2=tf.constant([[2],[3]])
#定义一个对m1和m2做矩阵乘法的op
product=tf.matmul(m1,m2)
with tf.Session() as sess:
# 调用sess的run方法来执行矩阵乘法op
result = sess.run(product)
print(result)
结果如下所示:
例二:Tensorflow中的变量定义与使用
import tensorflow as tf
x=tf.Variable([1,2])
a=tf.Variable([3,3])
#定义一个减法op
sub=tf.subtract(x,a)
#定义一个假发op
add=tf.add(x,sub)
#初始化全局变量(TensorFlow中的变量在使用前必须初始化)
init=tf.global_variables_initializer()
with tf.Session() as sess:
#run()方法,调用初始化的op
sess.run(init)
print(sess.run(sub))
print(sess.run(add))
总之,在Tensorflow中使用变量Variable必须初始化。
#定义一个变量state=0
state=tf.Variable(0)
#定义一个加1的操作op
new_value=tf.add(state,1)
#赋值op
update=tf.assign(state,new_value)
#初始化
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
#打印state初始值
print(sess.run(state))
#循环5次,每次state加1
for i in range(5):
sess.run(update)
print(sess.run(state))
结果如下:
例三:Fetch和Feed操作
fetch的目的就是在会话中同时执行多个op得到结果。
input1=tf.constant(3.0)
input2=tf.constant(2.0)
input3=tf.constant(5.0)
#定义加法op
add=tf.add(input2,input3)
#定义乘法op
mul=tf.multiply(input1,add)
with tf.Session() as sess:
result=sess.run([mul,add]) #Fetch
print(result)
结果如下:
feed主要用于为占位符placeholder赋值,占位符相当于一个没有被赋值的变量,需要在使用时赋值。
#定义一个数据类型为float32的占位符
input1=tf.placeholder(tf.float32)
input2=tf.placeholder(tf.float32)
#定义乘法op
output=tf.multiply(input1,input2)
with tf.Session() as sess:
#feed的数据必须以字典的形式传入
print(sess.run(output,feed_dict={input1:[4.0],input2:[3.0]}))
结果如下:
例四:简单的综合应用
import tensorflow as tf
import numpy as np
#随机生成100个点,作为训练集
x_data=np.random.rand(100)
#这100个点对应的100个label
#可以看到,真实的斜率为0.1,真实的偏置为0.2
y_data=x_data*0.1+0.2
#构造一个线性模型
#偏置bias,初始值为0.0
b=tf.Variable(0.0)
#斜率k,初始值为0.0
k=tf.Variable(0.0)
y=k*x_data+b
#代价函数
loss=tf.reduce_mean(tf.square(y_data-y))
#定义一个梯度下降法优化器来进行训练,下降率为0.2
optimizer=tf.train.GradientDescentOptimizer(0.2)
#最小化代价函数
train=optimizer.minimize(loss)
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
#迭代200次
for step in range(200):
sess.run(train)
#每迭代20次打印一次k,b
if step%20==0:
print(step,sess.run([k,b]))
可以看到,经过迭代后,k和b近似于真实的k和b:
总结 :
- 在tensorflow中,常量通过constant函数来定义。
- 在tensorflow中,变量通过Variable函数来定义,注意:只要用到变量,就一定要run一下initialize_all_variables()来初始化变量。
- Session在tensorflow中就像指针一样,指向需要运行的代码。
- Session运行结束后,需要关闭。
- Fetch对多个操作节点取值。
- Feed给占位符赋值。