使用 TensorFlow 中搭建 DNN 網絡(二)

  1. ⽹絡結構實現

    上⾯咱們已經介紹了 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 之後的概率就會增加,這個明顯是不對的。

  1. ⽹絡結構可視化

還記得上節講⽹絡結構可視化嗎?下⾯咱們把設計的⽹絡結構可視化出來,看看我們搭建的⽹絡結構是不是跟預先設計好的草圖⼀樣。

全部代碼如下:

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