拟合线性平面

2017-04-13  本文已影响0人  叶晚林

不仅刚开始学习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。

上一篇下一篇

猜你喜欢

热点阅读