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

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

tensorflow

神經網絡的結構,就是不同神經元間的連接結構

技術分享

–圖示了一個三層全連接神經網絡。

神經元結構的輸出,是所有輸入的加權、加上偏置項,再經過一個激活(傳遞)函數得到。



全連接神經網絡


全連接神經網絡,就是相鄰兩層之間,任意兩個節點之間都有連接。

–這也是其與後面介紹的卷積層、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()


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