全連接神經元網絡測試MNIST數據集

1、代碼的運⾏log截圖

輸入圖片說明

2、對模型結構的理解

本模型是一個2層的全連接神經元網絡,包含輸入層、1個隱藏層、1個輸出層。

輸入層爲784個node的張量,既爲32*32分辨率並經過二值化後的圖片的所有像素點組成的一個向量。

第一層爲隱藏層,有100個node,其值爲輸入層的784個節點乘以784*100個權重加上偏置項後的和,經過relu激活函數取得的結果。

L1_units_count = 100   #第一層網絡

W_1 = tf.Variable(initialize([784, L1_units_count]))
b_1 = tf.Variable(initialize([L1_units_count]))
logits_1 = tf.matmul(x, W_1) + b_1
output_1 = tf.nn.relu(logits_1)

第二層爲輸出層,輸出10個node,其值爲隱藏層的輸出值乘以100*10個權重,加上偏置項取得(此時的數據未經過激活函數,將會在後面使用softmax函數激活)。

L2_units_count = 10   #第二層網絡
W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))
b_2 = tf.Variable(initialize([L2_units_count]))
logits_2 = tf.matmul(output_1, W_2) + b_2  

logits = logits_2

3、對模型訓練過程(梯度如何計算,參數如何更新)的理解

模型一次訓練過程包括前向傳播和反向傳播

前向傳播過程中通過權重與輸入數值相乘累加,並通過激活函數得到輸出值作爲下一層的輸入值,逐層計算得到最終的輸出值。

反向傳播過程的核心,是通過比較輸出y和真值t,對參與計算的w進行調整。其計算方法是從網絡的輸出層開始,向輸入層方向逐層計算梯度並更新權重,與前饋運算正好相反。首先計算輸出節點的總誤差,並將這些誤差用反向傳播算法傳播回網絡,以計算梯度。接下來,使用類似梯度下降之類的算法來調整網絡中的所有權重,目的是減少輸出層的誤差。當計算一個節點的誤差項時,需要先計算每個與其相連的下一層節點的誤差項。這就要求誤差項的計算順序必須是從輸出層開始,然後反向依次計算每個隱藏層的誤差項,直到與輸入層相連的那個隱藏層。當所有節點的誤差項計算完畢後,就更新了所有的權重。

4、對計算圖的理解。

計算圖主要由四個部分構成:
1、張量(Tensor)
2、操作(Option)
3、變量(Variable)
4、會話(Session)

在計算圖計算或者張量的運算中,會經常使用一些方法來對數據進行操作,包括最簡單的對元素的運算,對矩陣進行運算,定義常量,大量的神經元函數的操作以及保存模型的相關操作等。上圖中包含的操作有placehold、Matmul、add、Relu、Softmax、ArgMax、Equal、Cast、Mean、Saver和Restore等。

變量就是在計算圖的過程中可以改變的節點,在本例中,權重w和偏置項b都會隨着迭代的進行而不斷變化着,這樣的值就可以拿來作爲變量。在實際的訓練過程中,一般會把需要訓練的值設置爲變量。一般來講,在使用變量的時候,我們都會給變量設置一個初始值,然後根據訓練的次數迭代,再將真正的變量不斷地推斷出來。一般會通過構造一個Variable類的實例在圖中添加一個變量。當這個變量被設置初始值後,這個變量的形狀和類型就會被固定下來。通過assign()函數來改變它,通過Variable()創造的變量可以作爲圖中的其他操作來使用,你也可以在圖中添加節點,對變量進行算術操作。

在Tensorflow中,啓動一個圖的前提是先要創建一個會話(Session),Tensorflow的所有對圖的操作,都必須放在會話中進行。在會話中提供了一個run方法,用來執行計算圖的整體或局部的操作。

5、解釋這⾥的模型爲什麼效果⽐較差。

這裏的神經網絡模型只有一個隱藏層,神經元數目也較少,模型相對比較簡單,而且訓練輪次較少,所以模型效果比較差。

程序:

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