该篇博客参考TensorFlow 官方文档中文版,对其进行进一步加深理解,博主也是刚刚入手TensorFlow,如果有什么不对的地方可以评论交流。
TensorFlow 总程序
这里边介绍了一个TensorFlow基础教程,我们可以看一下这个程序
import tensorflow as tf
import numpy as np
# 使用 NumPy 生成假数据(phony data), 总共 100 个点.
x_data = np.float32(np.random.rand(2, 100)) # 随机输入
y_data = np.dot([0.100, 0.200], x_data) + 0.300
# 构造一个线性模型
#
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b
# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
# 初始化变量
init = tf.initialize_all_variables()
# 启动图 (graph)
sess = tf.Session()
sess.run(init)
# 拟合平面
for step in range(0, 201):
sess.run(train)
if step % 20 == 0:
print step, sess.run(W), sess.run(b)
# 得到最佳拟合结果 W: [[0.100 0.200]], b: [0.300]
这个是一个最基本的TensorFlow程序,基本就是求解等式
y
=
W
1
x
1
+
W
2
x
2
+
b
y = {W_1}{x_1}+{W_2}{x_2} + b
y=W1x1+W2x2+b
该程序的主要任务就是:已知
y
y
y、
x
1
x_1
x1、
x
2
x_2
x2 一些数据,求解
W
1
{W_1}
W1、
W
2
{W_2}
W2、
b
b
b数值大小。
构建 x、y 数组
# 使用 NumPy 生成假数据(phony data), 总共 100 个点.
x_data = np.float32(np.random.rand(2, 100)) # 随机输入
y_data = np.dot([0.100, 0.200], x_data) + 0.300
程序借助NumPy数据库对 x x x产生一个随机的2*100的数组,接着利用相应的乘法,使每一个 x x x数据都会产生一个 y y y数据。其中[0.100,0.200]就是我们假设的 W 1 、 W 2 W_1、W_2 W1、W2, 0.300为 b b b。
构建TensorFlow模型
# 构造一个线性模型
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b
在上边程序中会构建一个TensorFlow变量,一个为
b
b
b,另一个为
W
W
W。
b
b
b 的创建直接借助tf.zeros()
函数,创建一个
1
∗
1
1*1
1∗1 的 0 数组。
W
W
W 的创建使用tf.random_uniform()
函数,会产生一个
1
∗
2
1*2
1∗2的数组,最小值为-1.0(可以包括)、最大值为1.0(不包括)。
直接将
b
b
b、
W
W
W 打印可以看到下边的信息,其中包括变量名、大小与类型。
<tf.Variable 'Variable:0' shape=(1,) dtype=float32_ref>
<tf.Variable 'Variable_1:0' shape=(1, 2) dtype=float32_ref>
设置损失函数、操作、以及训练
# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
在上边的程序中首先设置损失函数loss
,它是借助tf.square()函数计算真实值与计算值之间的方差,接着使用tf.reduce_mean()
函数计算各个数值的平均值。
使用tf.train.GradientDescentOptimizer
接口使用GradientDescentOptimizer自适应学习率来自动调节训练过程中学习速率。
train = optimizer.minimize(loss)
然后定义训练为使用GradientDescentOptimizer方法来使得损失函数最小的操作。
初始化变量
# 初始化变量
init = tf.initialize_all_variables()
使用tf.initialize_all_variables()
函数将所有的函数进行初始化,就是将我们之前设定的
b
b
b、
W
W
W 进行初始化。
启动图
# 启动图 (graph)
sess = tf.Session()
sess.run(init)
图 (graph)是TensorFlow中一个很重要的概念,TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤 被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op。上边的程序就是将TensorFlow执行启动图的操作。
run(fetches, feed_dict=None, options=None, run_metadata=None)
run()
运行fetches中的操作节点并求其,fetches
参数可以是单个图元素(single graph element),也可以是任意嵌套的列表list,元组tuple,名称元组namedtuple,字典dict或包含图元素的OrderedDict。是将 ‘ feed_dict ’ 中的值替换为相应的输入值,通过运行必要的图形片段(necessary graph fragment)来执行每一个 ‘ Operation ’ 并评估 ‘ fetches ’ 中的每一个张量(evaluate every Tensor
in fetches
。
执行循环
# 拟合平面
for step in range(0, 201):
sess.run(train)
if step % 20 == 0:
print step, sess.run(W), sess.run(b)
在上边程序中我们开始执行循环,从for()
函数中能够看出循环执行200次,每次循环都会启动图的训练操作( sess.run(train)
),而且在每20次循环过程中输出一次优化以后的
b
b
b、
W
W
W 的数值。
0 [[0.76612234 0.3431572 ]] [0.66802967]
20 [[0.8309442 0.18778986]] [0.34280622]
40 [[0.8805279 0.1933982]] [0.313826]
60 [[0.8942932 0.19743352]] [0.30440328]
80 [[0.8982843 0.19910687]] [0.30139136]
100 [[0.8994758 0.19970436]] [0.30043778]
120 [[0.8998383 0.19990459]] [0.30013737]
140 [[0.89994985 0.19996963]] [0.30004302]
160 [[0.8999844 0.19999044]] [0.30001345]
180 [[0.89999515 0.199997 ]] [0.3000042]
从上边的运行结果中能够看出 b b b、 W W W再不断朝着我们期望的数值进行变化。