拟合线性平面
不仅刚开始学习TensorFlow,就连Python也是刚上手。对于代码中的某些函数不很明白,所以打算边运行边调试,看看这些语句会产生什么东西。下面先放出代码和运行结果,然后逐句剖析代码。
代码:
<pre>
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))
</pre>
结果:
<pre>
0 [[-0.62681621 0.8956036 ]] [ 0.55624533]
20 [[-0.07822994 0.29091078]] [ 0.33930907]
40 [[ 0.05776684 0.21007288]] [ 0.31511602]
60 [[ 0.08916989 0.19971299]] [ 0.30532804]
80 [[ 0.09701692 0.19925731]] [ 0.30180326]
100 [[ 0.09913072 0.19964069]] [ 0.30059773]
120 [[ 0.09973642 0.19986197]] [ 0.30019596]
140 [[ 0.099918 0.19995138]] [ 0.30006385]
160 [[ 0.09997409 0.19998357]] [ 0.30002069]
180 [[ 0.09999172 0.19999455]] [ 0.30000672]
200 [[ 0.09999731 0.19999819]] [ 0.30000219]
</pre>
逐句剖析:
1)x_data到底是什么?
<pre>
x_data = np.float32(np.random.rand(2, 5))
print(x_data)
[[ 0.84190673 0.23715617 0.10634095 0.03980473 0.5689218 ]
[ 0.39800221 0.54160982 0.50710446 0.44064671 0.69939655]]
</pre>
np.random.rand(2,5)随机生成一个两行五列的列表,np.float32()保证其每个元素的类型为np.float32类型。(原代码为(2,100),此处为了方便查看显示了(2,5)的。)
2)y_data是什么?
<pre>
y_data = np.dot([0.100, 0.200], x_data) + 0.300
</pre>
[0.100, 0.200](1×2矩阵)与x_data(2×100矩阵)的矩阵乘积(1×100),再给其中每一个元素加上0.3,即相当于100个下面的式子:
<pre>y_data = W1x1+W2x2+b</pre>
Tips:平面方程的一般式为
<pre>Ax+By+Cz+D=0,其中A,B,C,D为已知常数,并且A,B,C不同时为零。</pre>
3)看看b = tf.Variable(tf.zeros([1]))
<pre>
print(tf.Variable(tf.zeros([1])))
Tensor("zeros:0", shape=(1,), dtype=float32)
</pre>
b是一个张量,具体看看TensorFlow对张量的定义:
TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个 静态 类型和 动态 类型的维数.
来源(http://www.tensorfly.cn/tfdoc/resources/dims_types.html)
看到这里还是有点迷啊!先放过他,往后面去看看,说不定有什么启发。
4)看看W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
<pre>
tf.random_uniform(shape,minval=0,maxval=None,dtype=tf.float32,seed=None,name=None)
</pre>
用于生成均匀分布随机数Tensor,尺寸是shape,范围为[minval,maxval]。
5)看看y = tf.matmul(W, x_data) + b
其中W的shape是(1,2),x_data的shape是(2,100),做矩阵相乘,得到shape为(1,100),b的shape是(1,),对应相加。
<pre>
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
</pre>
上面三句构成一个线性模型。
6)代价函数与优化目标
<pre>
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
</pre>
loss表示代价函数,取y和y_data差值平方的均值。
optimizer表示使用梯度下降算法,学习速率为0.5。
train表示优化目标,即最小化loss。
7)启动会话,开始训练,即拟合平面。
<pre>
初始化变量
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))</pre>
训练201次,每隔20次输出一次目前的W和b。注意要输出W和b(Tensor)的方式。
总结:
在例程中首先使用 NumPy 生成假数据(phony data),即需要被拟合的平面;然后构建假设模型;确定了代价函数、优化方法和优化目标;最后开启会话,在会话中进行训练,输出需要确定的W和b。