# 使用多個層
現在我們已經介紹了多個操作,我們將介紹如何連接具有通過它們傳播的數據的各個層。
## 做好準備
在本文中,我們將介紹如何最好地連接各種層,包括自定義層。我們將生成和使用的數據將代表小型隨機圖像。最好通過一個簡單的例子來理解這種類型的操作,看看我們如何使用一些內置層來執行計算。我們將探索的第一層稱為移動窗口。我們將在 2D 圖像上執行小的移動窗口平均值,然后第二層將是自定義操作層。
在本節中,我們將看到計算圖可能變得龐大且難以查看。為了解決這個問題,我們還將介紹命名操作和創建層范圍的方法。首先,加載`numpy`和`tensorflow`,然后使用以下命令創建圖:
```py
import tensorflow as tf
import numpy as np
sess = tf.Session()
```
## 操作步驟
我們按如下方式處理秘籍:
1. 首先,我們使用 NumPy 創建示例 2D 圖像。該圖像將是`4` x `4`像素圖像。我們將在四個方面創建它;第一個和最后一個維度的大小為 1.請注意,某些 TensorFlow 圖像函數將在四維圖像上運行。這四個維度是圖像編號,高度,寬度和通道,為了使其成為一個具有一個通道的圖像,我們將兩個維度設置為`1`,如下所示:
```py
x_shape = [1, 4, 4, 1]
x_val = np.random.uniform(size=x_shape)
```
1. 現在,我們必須在圖中創建占位符,我們可以在其中提供示例圖像,如下所示:
```py
x_data = tf.placeholder(tf.float32, shape=x_shape)
```
1. 為了在我們的`4` x `4`圖像上創建一個移動窗口平均值,我們將使用一個內置函數,它將在形狀窗口`2` x `2`上收斂一個常量。我們將使用的函數是`conv2d()`;此函數在圖像處理和 TensorFlow 中非常常用。此函數采用窗口的分段產品和我們指定的過濾器。我們還必須在兩個方向上指定移動窗口的步幅。在這里,我們將計算四個移動窗口平均值:左上角,右上角,左下角和右下角四個像素。我們通過創建`2` x `2`窗口并在每個方向上具有長度`2`的步幅來實現這一點。為取平均值,我們將`2` x `2`窗口用`0.25`的常數卷積,如下:
```py
my_filter = tf.constant(0.25, shape=[2, 2, 1, 1])
my_strides = [1, 2, 2, 1]
mov_avg_layer= tf.nn.conv2d(x_data, my_filter, my_strides,
padding='SAME', name='Moving_Avg_Window')
```
> 請注意,我們還使用函數的`name`參數命名此層`Moving_Avg_Window`。 為了計算卷積層的輸出大小,我們可以使用下面的公式`: Output = (W - F + 2P) / S + 1`,其中`W`是輸入大小,`F`是過濾器大小,`P`是零填充,并且`S`是步幅。
1. 現在,我們定義一個自定義層,它將在移動窗口平均值的`2` x `2`輸出上運行。自定義函數將首先將輸入乘以另一個`2` x `2`矩陣張量,然后為每個條目添加 1。在此之后,我們取每個元素的 sigmoid 并返回`2` x `2`矩陣。由于矩陣乘法僅對二維矩陣進行操作,因此我們需要刪除大小為`1`的圖像的額外維度。 TensorFlow 可以使用內置的`squeeze()`函數執行此操作。在這里,我們定義新層:
```py
def custom_layer(input_matrix):
input_matrix_sqeezed = tf.squeeze(input_matrix)
A = tf.constant([[1., 2.], [-1., 3.]])
b = tf.constant(1., shape=[2, 2])
temp1 = tf.matmul(A, input_matrix_sqeezed)
temp = tf.add(temp1, b) # Ax + b
return tf.sigmoid(temp)
```
1. 現在,我們必須將新層放在圖上。我們將使用命名范圍執行此操作,以便它在計算圖上可識別和可折疊/可擴展,如下所示:
```py
with tf.name_scope('Custom_Layer') as scope:
custom_layer1 = custom_layer(mov_avg_layer)
```
1. 現在,我們只需輸入`4` x `4`圖像來替換占位符并告訴 TensorFlow 運行圖,如下所示:
```py
print(sess.run(custom_layer1, feed_dict={x_data: x_val}))
[[ 0.91914582 0.96025133]
[ 0.87262219 0.9469803 ]]
```
## 工作原理
通過命名操作和層范圍,可視化繪圖看起來更好。我們可以折疊和展開自定義層,因為我們在命名范圍內創建了它。在下圖中,請參閱左側的折疊版本和右側的展開版本:

圖 3:具有兩層的計算圖
第一層名為 Moving_Avg_Window。第二個是名為 Custom_Layer 的操作集合。它在左側折疊并在右側展開。
- TensorFlow 入門
- 介紹
- TensorFlow 如何工作
- 聲明變量和張量
- 使用占位符和變量
- 使用矩陣
- 聲明操作符
- 實現激活函數
- 使用數據源
- 其他資源
- TensorFlow 的方式
- 介紹
- 計算圖中的操作
- 對嵌套操作分層
- 使用多個層
- 實現損失函數
- 實現反向傳播
- 使用批量和隨機訓練
- 把所有東西結合在一起
- 評估模型
- 線性回歸
- 介紹
- 使用矩陣逆方法
- 實現分解方法
- 學習 TensorFlow 線性回歸方法
- 理解線性回歸中的損失函數
- 實現 deming 回歸
- 實現套索和嶺回歸
- 實現彈性網絡回歸
- 實現邏輯回歸
- 支持向量機
- 介紹
- 使用線性 SVM
- 簡化為線性回歸
- 在 TensorFlow 中使用內核
- 實現非線性 SVM
- 實現多類 SVM
- 最近鄰方法
- 介紹
- 使用最近鄰
- 使用基于文本的距離
- 使用混合距離函數的計算
- 使用地址匹配的示例
- 使用最近鄰進行圖像識別
- 神經網絡
- 介紹
- 實現操作門
- 使用門和激活函數
- 實現單層神經網絡
- 實現不同的層
- 使用多層神經網絡
- 改進線性模型的預測
- 學習玩井字棋
- 自然語言處理
- 介紹
- 使用詞袋嵌入
- 實現 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 進行預測
- 使用 doc2vec 進行情緒分析
- 卷積神經網絡
- 介紹
- 實現簡單的 CNN
- 實現先進的 CNN
- 重新訓練現有的 CNN 模型
- 應用 StyleNet 和 NeuralStyle 項目
- 實現 DeepDream
- 循環神經網絡
- 介紹
- 為垃圾郵件預測實現 RNN
- 實現 LSTM 模型
- 堆疊多個 LSTM 層
- 創建序列到序列模型
- 訓練 Siamese RNN 相似性度量
- 將 TensorFlow 投入生產
- 介紹
- 實現單元測試
- 使用多個執行程序
- 并行化 TensorFlow
- 將 TensorFlow 投入生產
- 生產環境 TensorFlow 的一個例子
- 使用 TensorFlow 服務
- 更多 TensorFlow
- 介紹
- 可視化 TensorBoard 中的圖
- 使用遺傳算法
- 使用 k 均值聚類
- 求解常微分方程組
- 使用隨機森林
- 使用 TensorFlow 和 Keras