使用 TensorFlow 中搭建 DNN 網絡(二)
-
⽹絡結構實現
上⾯咱們已經介紹了 TensorFlow ⾥⾯全連接層的實現,下⾯咱們就可以⽤ TensorFlow 提供的磚蓋房了。
⾸先咱們需要把輸⼊定義好:
inputs = tf.placeholder(tf.float32, [768])
對沒錯就是 placeholder ,還記得上節的內容嗎?輸⼊數據是⼀個變化的值時,咱們需要使⽤佔位符告訴 TensorFlow 這個值我後⾯會輸⼊進來,先別動。
下⾯就是整個⽹絡的搭建,代碼也是⼗分簡單,就是 5 層的全連接(最 後分類層也算⼀層)。
第⼆層隱藏層,隱藏節點爲 2048。
fc2 = tf.contrib.layers.fully_connected(fc1, 2048)
第三層隱藏層,隱藏節點爲 1024。
fc3 = tf.contrib.layers.fully_connected(fc2, 1024)
第四層隱藏層,隱藏節點爲 512。
fc4 = tf.contrib.layers.fully_connected(fc3, 512)
輸出隱藏層,隱藏節點爲 10,節點的個數爲分類類別數。
outputs = tf.contrib.layers.fully_connected(fc4, 10, activation_fn=None)
這⾥有⼀點需要注意的就是最後輸出的激活函數需要設置爲 None ,爲什麼會這麼做呢?因爲最後⼀層已經沒有神經⽹絡層,我們需要對最後輸出的數據使⽤ softmax 求取對位置的概率。如果繼續使⽤ ReLU ,
還記得 ReLU 的作⽤嗎?⼤於 0 的不變,⼩於 0 的值爲 0。繼續使⽤ ReLU 就會使原來爲負數的值強⾏增⼤,對應到 softmax 之後的概率就會增加,這個明顯是不對的。
- ⽹絡結構可視化
還記得上節講⽹絡結構可視化嗎?下⾯咱們把設計的⽹絡結構可視化出來,看看我們搭建的⽹絡結構是不是跟預先設計好的草圖⼀樣。
全部代碼如下:
import tensorflow as tf
import numpy as np
初始化 Session
sess = tf.Session()
定義輸⼊數據佔位符。
inputs = tf.placeholder(tf.float32, [None, 768])
第⼀層隱藏層,隱藏節點爲 1024。
fc1 = tf.contrib.layers.fully_connected(inputs, 1024)
第⼆層隱藏層,隱藏節點爲 2048。
fc2 = tf.contrib.layers.fully_connected(fc1, 2048)
第三層隱藏層,隱藏節點爲 1024。
fc3 = tf.contrib.layers.fully_connected(fc2, 1024)
第四層隱藏層,隱藏節點爲 512。
fc4 = tf.contrib.layers.fully_connected(fc3, 512)
輸出隱藏層,隱藏節點爲 10,節點的個數爲分類類別數。
outputs = tf.contrib.layers.fully_connected(fc4, 10, activation_fn=None)
計算輸⼊數據在 10 個類別上的概率。
softmax_outputs = tf.nn.softmax(outputs)
獲取概率最⼤的那個節點作爲類別的預測結果。
predictions = tf.argmax(softmax_outputs, axis=1)
保存計算圖。
merged = tf.summary.merge_all()
tf.summary.FileWriter('mnist_dnn', sess.graph)
隨機初始化⽹絡參數。
sess.run(tf.global_variables_initializer())
隨機⽣成⼀些數據,運⾏計算圖,觀察預測結果。
random_inputs = np.random.rand(3, 768)
print sess.run(predictions, {inputs: random_inputs})
可以看到最後輸出的結果:
print sess.run(predictions, {inputs: random_inputs})
[0 0 1]
不必驚慌,爲啥⼤家的輸出結果跟我的不⼀樣。因爲到⽬前爲⽌,⽆論我們的⽹絡參數還是輸⼊數據都是隨機值,也就是說每⼀次執⾏的結果都是各不相同。⼤家可以嘗試在執⾏⼀次這段代碼,就會發現執⾏結果跟上次也是不同的。
Tensorboard ⾥⾯看看我們搭建的⽹絡結構是不是跟預想的⼀樣。
可以看到整個⽹絡結構⼀共有 5 個全連接層,整體⽹絡結構符合我們設計的預期。
但是中間節點的隱藏節點個數是不是也符合我們的預期呢?這時候我們可以點開其中⼀個節點,看到下⾯這個圖。這個是 fc1 層的參數,可以看到輸⼊是⼀個 768 的特徵,輸出是 1024 個隱藏節點。?×768 前⾯的 ? 代表的是 batch_size ,因爲我們不知道 batch_size 是多少,所以可以⽤ None 來代替。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/gx7dkAQ3u2agXVbnDY_xQQ