TensorFlow實現單隱層神經網絡

TensorFlow實現單隱層神經網絡

在 z中通過無隱層的網絡在MNIST數據集上取得了大約92%的正確率,現在我們要給神經網絡增加隱層,並使用減少過擬合的Dropout、自適應學習速率的Adagrad,以及解決梯度彌散的激活函數ReLU。

1、加載MNIST數據集

from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tfmnist = input_data.read_data_sets("MNIST_data/", one_hot=True)sess = tf.InteractiveSession()

2、設置網絡參數並進行初始化

in_units是輸入節點數,h1_units是隱層的輸出節點數,w1、b1是隱層的權重和偏置,w2、b2是輸出層的權重和偏置。

in_units=784h1_units=300w1=tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1))b1=tf.Variable(tf.zeros([h1_units]))w2=tf.Variable(tf.zeros([h1_units, 10]))b2=tf.Variable(tf.zeros([10]))

因為在訓練和預測時候,Dropout的保留節點的概率不同,所以把Dropout的比率也作為一個計算圖的輸入。

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

3、定義模型結構

tf.nn.relu是ReLU激活函數,tf.nn.dropout實現Dropout的功能,在訓練時應該小於1,用於製造隨機性,防止過擬合,預測時應該等於1,即使用全部特徵來預測樣本的類別。

hidden1=tf.nn.relu(tf.matmul(x,w1)+b1)hidden1_drop=tf.nn.dropout(hidden1,keep_prob)y=tf.nn.softmax(tf.matmul(hidden1_drop,w2)+b2)

4、定義損失函數和優化器

損失函數選擇使用交叉信息熵,優化器選擇自適應的優化器Adagrad。

y_ = tf.placeholder("float", [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)

4、訓練

訓練時加入了Dropout的策略。

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})

5、模型準確率評測

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%的準確率,相比之前錯誤率由8%降低到2%。可以看到增加了一個隱層對神經網絡效果的提升,因為隱層本身對特徵進行了抽象和轉換。

不過全連接神經網絡也有侷限,即使我們使用很深的網絡,更多的隱層節點,更多的迭代次數也很難在MNIST數據集上有99%以上的準確率。而卷積神經網絡可以有更大的突破。


分享到:


相關文章: