深度學習三:tensorflow,訓練一個神經元

初學tensorflow,我做了一個無聊的嘗試。構建一個只有兩個輸入,一個輸出的升經網絡,然後訓練它。這個神經網絡應該是這個樣子:
這裏寫圖片描述
我的目標是,我給他指定一個輸入,比如x1=x2=1,我期望y能輸出0,所以我不斷的輸入x1=x2=1,然後不斷的訓練它,等訓練一萬次以後,y的輸出應該非常接近0。然後我可以調整期望,比如期望y能輸出0.3,然後再訓練一萬次,y的輸入應該能非常接近0.3纔行。
下面是程序和實驗結果:

import tensorflow as tf

x = tf.placeholder(tf.float32,[1,2])

W = tf.Variable(tf.random_normal([2,1]),name = "weight")
b = tf.Variable(tf.random_normal([1]),name="biases")


y = tf.sigmoid(tf.matmul(x,W)+b)

y_ = tf.placeholder(tf.float32, [1])
cross_entropy = -tf.reduce_sum(y_*tf.log(y)+(1-y_)*tf.log(1-y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)

    for lin in range(10000):
        sess.run(train_step,feed_dict={x: [[1,1]],y_: [0.3]})

    print(sess.run(y,feed_dict={x: [[1,1]]}))

結果如下:
這裏寫圖片描述
可以看到這個結果非常接近0.3。

程序說明

在這個例子中,其實只有一個神經元,x1和x2是輸入。因此這個神經元需要有兩個權重(weight)和一個偏執(bias)。權重和編制需要反覆的修改,所以在tensorflow中需要用Variable來表示。

當我們需要給圖輸入數據時,我們需要使用placeholder,它被稱爲佔位符。他在這裏只是佔了個位置,並沒有真的數據輸入,要輸入數據,我們需要使用feed_dict這個字典來數據數據,就像下面這樣:

 sess.run(train_step,feed_dict={x: [[1,1]],y_: [0.3]})

例子中的y_其實是期望的輸出值。誤差函數選用的是交叉熵誤差函數,當然你也可以用二次誤差函數。交叉熵公式如下:
這裏寫圖片描述
對比這個公式,

cross_entropy = -tf.reduce_sum(y_*tf.log(y)+(1-y_)*tf.log(1-y))

這行代碼就不難理解了。
接下來我們就可以開始訓練我們的神經網絡了。tensorflow已經幫我們做好了訓練需要的東西:

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

這個函數實現了梯度下降算法,0.01是學習的速度。minimize需要傳入我們計算出的代價。我們需要反覆的調用這個函數來訓練我們的神經網絡。tensorflow中,我們需要構建一個Sesson來執行我們構建好的神經網絡。

with tf.Session() as sess:
    sess.run(init)

    for lin in range(10000):
        sess.run(train_step,feed_dict={x: [[1,1]],y_: [0.3]})

這裏就是訓練的代碼了,可以看到我們不斷的輸入1,1,並期望輸出0.3。最終,進過一萬次的訓練,你將得到一個非常接近0.3的數。這意味着我們的神經網絡能夠識別1,1這兩個數字了,並且只要你輸入1,1.它就會輸出0.3。這就是我們訓練的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章