1個TensorFlow樣例,終於明白如何實現前向傳播過程?

shenmanli發表於2017-08-28
神經網路的結構,就是不同神經元間的連線結構

–圖示了一個三層全連線神經網路。
神經元結構的輸出,是所有輸入的加權、加上偏置項,再經過一個啟用(傳遞)函式得到。




全連線神經網路


全連線神經網路,就是相鄰兩層之間,任意兩個節點之間都有連線。
–這也是其與後面介紹的卷積層、LSTM結構的區分。
–除了輸入層,所有節點都代表了一個神經元的結構。
計算神經網路的前向傳播結果,要三部分資訊。
–第一個部分是神經網路的輸入,這個輸入就是從實體中提取的特徵向量。
–第二個部分為神經網路的連線結構。神經網路是由神經元構成的,神經網路的結構,給出不同神經元之間輸入、輸出的連線關係。
–第三部分是每個神經元中的引數。




示例分析


圖中,a11節點有兩個輸入,分別是x1和x2的輸出,而a11的輸出是節點Y的輸入。

–用w來表示神經元中的權重,b表示偏置項。
–w的上標表明瞭神經網路的層數,如w(1)表示第一層節點的引數,而w(2)表示第二層節點的引數。
–w的下標表明瞭連線節點編號,比如w 1,2 (1)表示連線x1和a12節點的邊上的權重。




給定神經網路的輸入、神經網路的結構,以及邊上權重,就可以通過前向傳播演算法,來計算出神經網路的輸出
•下面公式給出了在ReLU啟用函式下,前圖神經網路前向傳播的過程。此處假設x1=0.7, x2=0.9
–a11=f(W1,1(1)x1+W2,1(1)x2+b1(1))
–=f(0.7×0.2+0.9×0.3+(-0.5)) =f(-0.09)=0
–a12=f(W1,2(1)x1+W2,2(1)x2+b2(1))
–=f(0.7×0.1+0.9×(-0.5)+0.1)=f(-0.28)=0
–a13=f(W1,3(1)x1+W2,3(1)x2+b3(1))
–=f(0.7×0.4+0.9×0.2+(-0.1))=f(0.36)=0.36
–Y=f(W1,1(2)a11+W1,2(2)a12+W1,3(2)a13+b1(2))
–=f(0.054+0.028+(-0.072)+0.1)=f(0.11)=0.11
•在虛擬機器中執行相應的chap3中的前向神經網路例子,檢視相關的圖計算。




在TensorFlow中,可以通過矩陣乘法的方法,實現神經網路的前向傳播過程。
–a = tf.nn.relu(tf.matmul(x, w1)+b1)
–y = tf.nn.relu(tf.matmul(a, w2)+b2)
在上面的程式碼中並沒有定義w1、w2、b1、b2,
–TensorFlow可以通過變數(tf.Variable),來儲存和更新神經網路中的引數。
比如通過下面語句可以定義w1:
–weights = tf.Variable(tf.random_normal([2, 3], stddev=2))
–這段程式碼呼叫了TensorFlow變數的宣告函式tf.Variable。在變數宣告函式中,給出了初始化這個變數的方法。




TensorFlow中變數的初始值,可以設定成隨機數、常數或者是通過其他變數的初始值,計算得到
樣例中,tf.random_normal([2, 3], stddev=2)會產生一個2×3的矩陣,矩陣中的元素是均值為0,標準差為2的隨機數。
–注:標準差,也稱為標準偏差

tf.random_normal函式,可以通過引數mean,來指定平均值,在沒有指定時預設為0。
–通過滿足正態分佈的隨機數,來初始化神經網路中的引數,是一個常用的方法。




下面的樣例,介紹瞭如何通過變數,實現神經網路的引數,並實現前向傳播的過程。
import tensorflowas tf
# 宣告變數。
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
b1 = tf.Variable(tf.constant(0.0, shape=[3]))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
b2 = tf.Variable(tf.constant(0.0, shape=[1]))
# 暫時將輸入的特徵向量定義為一個常量。這裡x是一個1*2的矩陣。
x = tf.constant([[0.7, 0.9]])




# 實現神經網路的前向傳播過程,並計算神經網路的輸出。
a = tf.nn.relu(tf.matmul(x, w1)+b1)
y = tf.nn.relu(tf.matmul(a, w2)+b2)
sess= tf.Session()
# 執行變數初始化過程。
init_op= tf.global_variables_initializer()
sess.run(init_op)
# 輸出[[3.95757794]]
print(sess.run(y))

sess.close()



相關文章