美文网首页
拟合线性平面

拟合线性平面

作者: 叶晚林 | 来源:发表于2017-04-13 11:54 被阅读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。

    相关文章

      网友评论

          本文标题:拟合线性平面

          本文链接:https://www.haomeiwen.com/subject/elxbattx.html