完整神經網絡樣例程序詳解


主要是對《tensorflow 實戰google深度學習框架》的第三章中在模擬數據集上訓練神經網絡的完整程序進行詳解,

所利用的神經網絡結構圖如下

詳細代碼如下

 

import tensorflow as tf
from numpy.random import RandomState
#定義神經網絡的參數,輸入和輸出節點
batch_size = 8
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
y_= tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
#定義前向傳播過程,損失函數及反向傳播算法
  a = tf.matmul(x, w1)
  y = tf.matmul(a, w2)
  cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 
  train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

#生成模擬數據集
rdm = RandomState(1)
X = rdm.rand(128,2)
Y = [[int(x1+x2 < 1)] for (x1, x2) in X]
#創建一個會話來運行tensorflow程序
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    
    # 輸出目前(未經訓練)的參數取值。
    print("w1:", sess.run(w1))
    print("w2:", sess.run(w2))
    print("\n") 
    
    # 訓練模型。
    STEPS = 5000
    for i in range(STEPS):
        start = (i*batch_size) % 128
        end = (i*batch_size) % 128 + batch_size
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
        if i % 1000 == 0:
            total_cross_entropy = sess.run(cross_entropy, feed_dict={x: X, y_: Y})
            print("After %d training step(s), cross entropy on all data is %g" % (i, total_cross_entropy))
  • 引入模塊的設置,因為實在模擬數據集中運行一個完整的神經網絡,因此需要做的事情是引入隨機數種子,使得其可以隨機產生數據

 下面我們對代碼進行詳細的解讀

from numpy.random import RandomState

 RandomState():隨機數種子 
功能:隨機產生所需數據。這段引入主要是為了引入可以產生隨機數組的RandomState

  • 定義神經網絡的參數,輸入節點和輸出節點參數

由於在每次迭代的開始,首先需要選取一小部分訓練數據,這一小部分數據稱為一個batch,batch_size的大小決定了一次性讀入多少批量的數據

batch_size = 8
batch_size的介紹如下
定義:一次性讀入多少批量的樣本,不是圖片,其有幾個子類型
Full Batch Learning:batch_size=數據集的大小,適用於小數據集
Mini-batches Learning:Batch_size= N(自己設定),適用於大數據集。
Online Learning(在線學習):Batch_size=1,
確定了batch_size之后,我們需要設置W1和w2的權重及其形式
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

 在tensorflow中,變量(tf.Variable)的作用是保存和更新神經網絡中的參數,需要指定初始值,一般是使用隨機初始值。stddev=1代表矩陣元素中的方差為1

設置輸入輸出矩陣

x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
y_= tf.placeholder(tf.float32, shape=(None, 1), name='y-input')

在tensorflow 中提供了placeholder這一機制用於提供輸入數據,placeholder相當於定義了一個位置,這個位置中的數據在程序運行時再指定,這樣程序中就不需要生成大量常量來提供輸入數據,而只需要將這個數據通過placeholder傳入tensorflow計算圖,在placeholder定義時,這個位置上的數據類型是需要指定的,和其他張量一樣,placeholder的類型也是不可以改變的

這個函數的形式為tf.placeholder(dtype,shape=數據維度,name=數據名稱)

函數功能:

插入一張張量的占位符,這個張量總是被喂入圖片數據,相當於一個形參

形參:只有在調用時才分配內存單元,在調用結束時,就會釋放所分配的內存單元

  • 定義前向傳播過程,損失函數及反向傳播函數
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

在這里,由於我們做的神經網絡輸入層是x,隱含層是a,輸出層是y,因此這里主要是調用tensorflow中的矩陣相乘的函數實現矩陣的乘法

cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

在得到一個batch的前向傳播結果之后,需要定義一個損失函數來刻畫當前的預測值和真實答案之間的差距,因此我們定義了如上的損失函數來刻畫預測值和真實值之間的差距

y_:正確結果,y:預測結果,tf.clip_by_value(y, 1e-10, 1.0)將張量限制在1e-10和1.0之間,
  • 生成模擬數據集
rdm = RandomState(1)
X = rdm.rand(128,2)
Y = [[int(x1+x2 < 1)] for (x1, x2) in X]
  • 創建一個會話來運行tensorflow程序
with tf.Session() as sess:

這是tensorflow創建會話的模式,這個就是創建一個會話,並通過python中的上下文管理器來管理這個會話,通過python的上下文管理機制,只要將所有的計算資源放在"with"的內部就可以,當上下文管理器推出時會自動釋放所有資源,這樣解決了因為異常退出時資源釋放的問題

init_op = tf.global_variables_initializer()
sess.run(init_op)

tensorflow中提供了一種便捷的方式來完成變量初始化過程,,利用以上代碼可以直接完成變量的初始化

STEPS = 5000
    for i in range(STEPS):
     #每次選取batch_size個樣本進行訓練
        start = (i*batch_size) % 128
        end = (i*batch_size) % 128 + batch_size
     #通過選取的樣本訓練神經網絡並更新
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
        if i % 1000 == 0:
        #每隔一段時間計算所在數據的交叉熵並輸出
            total_cross_entropy = sess.run(cross_entropy, feed_dict={x: X, y_: Y})
            print("After %d training step(s), cross entropy on all data is %g" % (i, total_cross_entropy))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM