TensorFlow实现多层感知机MINIST分类
TensorFlow實現多層感知機MINIST分類
TensorFlow 支持自動求導,可以使用 TensorFlow 優化器來計算和使用梯度。使用梯度自動更新用變量定義的張量。本文將使用 TensorFlow 優化器來訓練網絡。
前面定義了層、權重、損失、梯度以及通過梯度更新權重。用公式實現可以幫助我們更好地理解,但隨著網絡層數的增加,這可能非常麻煩。
使用 TensorFlow 的一些強大功能,如 Contrib(層)來定義神經網絡層及使用 TensorFlow 自帶的優化器來計算和使用梯度。
通過前面的學習,已經知道如何使用 TensorFlow 的優化器。Contrib 可以用來添加各種層到神經網絡模型,如添加構建塊。這里使用的一個方法是 tf.contrib.layers.fully_connected,在 TensorFlow 文檔中定義如下:
這樣就添加了一個全連接層。
提示:上面那段代碼創建了一個稱為權重的變量,表示全連接的權重矩陣,該矩陣與輸入相乘產生隱藏層單元的張量。如果提供了 normalizer_fn(比如batch_norm),那么就會歸一化。否則,如果 normalizer_fn 是 None,并且設置了 biases_initializer,則會創建一個偏置變量并將其添加到隱藏層單元中。最后,如果 activation_fn 不是 None,它也會被應用到隱藏層單元。
具體做法
第一步是改變損失函數,盡管對于分類任務,最好使用交叉熵損失函數。這里繼續使用均方誤差(MSE):
接下來,使用 GradientDescentOptimizer:
對于同一組超參數,只有這兩處改變,在測試數據集上的準確率只有 61.3%。增加 max_epoch,可以提高準確性,但不能有效地發揮 TensorFlow 的能力。
這是一個分類問題,所以最好使用交叉熵損失,隱藏層使用 ReLU 激活函數,輸出層使用 softmax 函數。做些必要的修改,完整代碼如下所示:
解讀分析
修改后的 MNIST MLP 分類器在測試數據集上只用了一個隱藏層,并且在 10 個 epoch 內,只需要幾行代碼,就可以得到 96% 的精度:
由此可見 TensorFlow 的強大之處。
總結
以上是生活随笔為你收集整理的TensorFlow实现多层感知机MINIST分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow反向传播算法实现
- 下一篇: TensorFlow实现多层感知机函数逼