在使用 TensorFlow时要注意几点:
使用图 (graph) 来表示计算任务
在被称之为会话 (Session) 的上下文 (context) 中执行图
使用tensor表示数据
通过变量(Variable)维护状态
使用feed和fetch可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据
利用TensorFlow实现简单的线性回归估计:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
num_points = 1000
vectors_set = []
x1 = np.random.normal(0.0,0.55,num_points)
y1 = x1*0.2+0.5+np.random.normal(0.0,0.02,num_points)
plt.scatter(x1,y1,c='r')
plt.show()
- 先造一组数据:在y=0.2x+0.5上采集1000个点并加上随机偏移。显示出来如下所示:
利用TensorFlow来对上面的数据进行线性回归拟合
w = tf.Variable(tf.random_uniform([1],-1.0,1.0),name='w')
b = tf.Variable(tf.zeros([1]),name='b')
y = w*x1+b
loss = tf.reduce_mean(tf.square(y-y1),name='loss')
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss,name='train')
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
print('w=',sess.run(w),'b=',sess.run(b),'loss=',sess.run(loss))
for i in range(20):
sess.run(train)
print('w=',sess.run(w),'b=',sess.run(b),'loss=',sess.run(loss))
w初始化为一个随机变量,b初始化为0(TensorFlow的变量定义真麻烦)
定义损失函数loss,为所有样本预测值与真值差的平方的均值。
优化器采用梯度下降法,学习率为0.5
TensorFlow要用tf.global_variables_initializer()来初始化各个变量
迭代20次,loss越来越小,w与b越来越接近设定值.
总结
TensorFlow使用图来表示计算任务,图中的节点称之为op(operation)
TensorFlow程序被可分成一个构建阶段和一个执行阶段
构建阶段:是要创建图,也就是创建op,如常量这种源op(不需要输入),还有其他的运算处理op,它们的返回值是可以传递给其他op作为输入的。
执行阶段:在一个会话中启动图。创建一个Session,并调用Session.run()来执行操作。
注意:对于上例中的train,在调用run()执行表达式之前,并不会执行训练操作。
TensorFlow的这种用会话来执行图的计算方式看起来非常“别扭”。这主要是因为TensorFlow乃至Python为了实现一些高效的数值计算或复杂运算,都会用到一些其他函数库,这些库一般都是用外部语言(C++)实现的,从外部计算切换回Python开销很大,即使用GPU或者分布式计算方式,这部分开销都不可忽略。所以TensorFlow不单独运行单一复杂操作,都是先用图来描述一系列可交互的计算操作,然后全部一起在Python之外运行。