第一章 最小二乘法

tensorflow是機器學習中一個優秀的框架,這一系列的教程是通過實例來介紹tensorflow的使用。慢慢的對tensorflow的一些重要的概念進行介紹,把tensorflow的使用方法融入到各個算法中,而不是一味的去專門學習tensorflow的使用。

張量

tensorflow 可以分成兩個詞, 一個是tensor ,另外一個是flowtensor說的是數據模型, 把它叫做 張量flow 是一種流式的計算流行以后會慢慢的明白這種方式。

幾種變量形式:

  • placeholder:占位符,通常是在訓練的時候把數據喂給 他們。

  • Variable:求變量,我們在訓練的過程中,就是為了求出這些值來。

  • constant:常變量,可以進行賦值計算等。

    >>> import tensorflow as tf
    >>> a = tf.constant([3],name="a")
    >>> b = tf.constant([4],name="b")
    >>> c = a + b
    >>> sess = tf.Session()
    >>> sess.run(c)
    array([7], dtype=int32)
    >>> print c
    Tensor("add_1:0", shape=(1,), dtype=int32)
    >>>
    

constant 的計算過程,特別注意的是要得到變量具體的值,需要創建一個上下文sess = tf.Session() 才能訪問到變量的資源。

評價函數和梯度上升下降

評價函數是我們需要求解的方程,如在最小二乘法中評價函數為方差最小, 梯度下降:是我們求解問題的方式,簡單的認為是,我們沿著坡就能達到山的波峰或者波谷,波峰或者波谷代表了評價函數的最大值或最小值。

最小二乘法評價函數用數學公式表示為:

$$\sum_{n=0}^N(y_i-a-bx_i)^2$$

tensorflow 表示為:

X = tf.placeholder("float")
Y = tf.placeholder("float")

W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")

pred = tf.add(tf.multiply(X, W), b)

cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)

使用梯度,求得最值:

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

其中 learning_rate 為學習因子,代表梯度的步長。

代碼如下所示:

import matplotlib
matplotlib.use('Agg')


import tensorflow as tf
import numpy
import matplotlib.pyplot as plt

rng = numpy.random

learning_rate = 0.01
training_epochs = 13
display_step = 1

train_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,
                         7.042,10.791,5.313,7.997,5.654,9.27,3.1])
train_Y = numpy.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,
                         2.827,3.465,1.65,2.904,2.42,2.94,1.3])
n_samples = train_X.shape[0]

X = tf.placeholder("float")
Y = tf.placeholder("float")

W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")

pred = tf.add(tf.multiply(X, W), b)

cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

init = tf.global_variables_initializer()

with tf.Session() as sess:

    sess.run(init)

    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: x, Y: y})

        if (epoch+1) % display_step == 0 or epoch == 0:
            c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
            print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "W=", sess.run(W), "b=", sess.run(b))

        plt.figure()
            plt.title('step:' + str(epoch))
        plt.plot(train_X, train_Y, 'ro', label='Original data')
        plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
        plt.legend()
        out_png = '%d.png'%(epoch)
        plt.savefig(out_png, dpi=150)

    print("Optimization Finished!")
    training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
    print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')

求解的過程如下:

轉載請標明來之:http://www.peyycv.tw/

更多教程:阿貓學編程

繼續閱讀

所有評論

如果對文章有異議,請加qq:1752338621