Tensorflow實現(xiàn)多層感知機

在普通神經(jīng)網(wǎng)絡的基礎上,加入隱藏層,減輕過擬合的Dropout,自適應學習速率的Adagrad,以及可以解決梯度你三的激活函數(shù)Relu.

首先是載入Tensorflow并加載MNIST數(shù)據(jù)集,創(chuàng)建一個Tensorflow默認的InteractiveSession,這樣后面執(zhí)行各項操作就無需指定Session。

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

mnist=input_data.read_data_sets('/tmp/data',one_hot=True)

sess=tf.InteractiveSession()

接下來給隱藏層的參數(shù)設置Variable并進行初始化。這里in_units是輸入節(jié)點數(shù),hl_units是隱藏層的輸出節(jié)點數(shù)設為300(200~1000結果區(qū)別不大)。w1,b1是隱藏層的權重和偏置。我們將偏置全部賦值為0,并將權重初始化為截斷的正太分布,器標準差為0.1,這一步可以通過tf.truncated_normal方便實現(xiàn)。因為模型使用的激活函數(shù)為ReLu,所以需要使用正太分布給參數(shù)加一點噪聲,來打破完全堆成并且避免0梯度。最后的輸出層的softmax,z直接權重W2,偏置b2全部初始化為0即可。

in_units=784

hl_units=300

w1=tf.Variable(tf.truncated_normal([in_units,hl_units],stddev=0.1))

b1=tf.Variable(tf.zeros([hl_units]))

w2=tf.Variable(tf.zeros([hl_units,10]))

b2=tf.Variable(tf.zeros([10]))

接下來定義輸入x的placeholder,另外因為在訓練和預測時,Dropout的比率keep_prob(即保留節(jié)點的概率)是不一樣的,通常訓練是小于1,而預測時是等于1,所以也把Dropout的比率作為計算圖的輸入,并定義一個placeholder。

x=tf.placeholder(tf.float32,[None,in_units])

keep_prob=tf.placeholder(tf.float32)

下面定義模型結構,首先需要一個隱藏層,命名為hiddenl,通過tf.nn.relu(tf.matmul(x,w1)+b1)實現(xiàn)一個激活函數(shù)為ReLu的隱藏層。這個隱藏層的計算公式為y=relu(wx+b).接下來,調用tf.nn.dropout實現(xiàn)dropout的功能,即將一部分節(jié)點置為0,這里的keep_prob是保留數(shù)據(jù)而不置為0的比例,在訓練時應該是小于1的,泳衣制造隨機性,防止過擬合;在預測時。等于1,即全部特征來預測樣本的類別。最后是輸出層。

hiddenl=tf.nn.relu(tf.matmul(x,w1)+b1)

hiddenl_drop=tf.nn.dropout(hiddenl,keep_prob)

y=tf.nn.softmax(tf.matmul(hiddenl_drop,w2)+b2)

接下來是定義損失函數(shù)和選擇優(yōu)化器來優(yōu)化LOSS,這里的損失函數(shù)使用交叉信息熵。優(yōu)化器選擇自適應的優(yōu)化器Adagrad,并把學習率設為0.3,這里我們直接使用tf.train.AdagradOptimizer就可以了,類似的還有Adadelta以及Adam等優(yōu)化器,讀者可以自行嘗試,不過學習率可能需要調整。

y_=tf.placeholder(tf.float32,[None,10])

cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))

train_step=tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)

下面是訓練步驟。加入keep_prob作為計算圖的輸入,并且在訓練時設為0.75,即保留75%的節(jié)點,其余25%置為0.一般來說,對于越復雜越大規(guī)模的神經(jīng)網(wǎng)絡,dropout的效果越顯著。另外,因為加入隱藏層,我們需要更多的訓練迭代來優(yōu)化模型參數(shù)已達到一個比較好的效果。所以一共采用了3000個batch,每個batch包含100個樣本,一共30W,相當于是對全數(shù)據(jù)及進行了5輪(epoch)迭代。

tf.global_variables_initializer().run()

for i in range(3000):

? ? batch_xs,batch_ys=mnist.train.next_batch(100)

? ? train_step.run({x:batch_xs,y_:batch_ys,keep_prob:0.75})

最后一步對模型進行準確率的評測。

correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))

accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

print accuracy.eval({x:mnist.test.images,y_:mnist.test.labels,keep_prob:1.0})

最終我們再測試集上得到的98%的準確率,隱藏層起了很大的作用,他能對特征進行抽象和轉化。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容