# 實現操作門
神經網絡最基本的概念之一是作為操作門操作。在本節中,我們將從乘法操作開始作為門,然后再繼續考慮嵌套門操作。
## 做好準備
我們將實現的第一個操作門是`f(x) = a · x`。為優化此門,我們將`a`輸入聲明為變量,將`x`輸入聲明為占位符。這意味著 TensorFlow 將嘗試更改`a`值而不是`x`值。我們將創建損失函數作為輸出和目標值之間的差異,即 50。
第二個嵌套操作門將是`f(x) = a · x + b`。同樣,我們將`a`和`b`聲明為變量,將`x`聲明為占位符。我們再次將輸出優化到目標值 50。值得注意的是,第二個例子的解決方案并不是唯一的。有許多模型變量組合可以使輸出為 50.對于神經網絡,我們并不關心中間模型變量的值,而是更加強調所需的輸出。
將這些操作視為我們計算圖上的操作門。下圖描繪了前面兩個示例:

圖 1:本節中的兩個操作門示例
## 操作步驟
要在 TensorFlow 中實現第一個操作門`f(x) = a · x`并將輸出訓練為值 50,請按照下列步驟操作:
1. 首先加載`TensorFlow`并創建圖會話,如下所示:
```py
import tensorflow as tf
sess = tf.Session()
```
1. 現在我們需要聲明我們的模型變量,輸入數據和占位符。我們使輸入數據等于值`5`,因此得到 50 的乘法因子將為 10(即`5X10=50`),如下所示:
```py
a = tf.Variable(tf.constant(4.))
x_val = 5.
x_data = tf.placeholder(dtype=tf.float32)
```
1. 接下來,我們使用以下輸入將操作添加到計算圖中:
```py
multiplication = tf.multiply(a, x_data)
```
1. 我們現在將損失函數聲明為輸出與`50`的期望目標值之間的 L2 距離,如下所示:
```py
loss = tf.square(tf.subtract(multiplication, 50.))
```
1. 現在我們初始化我們的模型變量并將我們的優化算法聲明為標準梯度下降,如下所示:
```py
init = tf.global_variables_initializer()
sess.run(init)
my_opt = tf.train.GradientDescentOptimizer(0.01)
train_step = my_opt.minimize(loss)
```
1. 我們現在可以將模型輸出優化到`50`的期望值。我們通過連續輸入 5 的輸入值并反向傳播損失來將模型變量更新為`10`的值,如下所示:
```py
print('Optimizing a Multiplication Gate Output to 50.')
for i in range(10):
sess.run(train_step, feed_dict={x_data: x_val})
a_val = sess.run(a)
mult_output = sess.run(multiplication, feed_dict={x_data: x_val})
print(str(a_val) + ' * ' + str(x_val) + ' = ' + str(mult_output))
```
1. 上一步應該產生以下輸出:
```py
Optimizing a Multiplication Gate Output to 50\.
7.0 * 5.0 = 35.0
8.5 * 5.0 = 42.5
9.25 * 5.0 = 46.25
9.625 * 5.0 = 48.125
9.8125 * 5.0 = 49.0625
9.90625 * 5.0 = 49.5312
9.95312 * 5.0 = 49.7656
9.97656 * 5.0 = 49.8828
9.98828 * 5.0 = 49.9414
9.99414 * 5.0 = 49.9707
```
接下來,我們將對兩個嵌套的操作門`f(x) = a · x + b`進行相同的操作。
1. 我們將以與前面示例完全相同的方式開始,但將初始化兩個模型變量`a`和`b`,如下所示:
```py
from tensorflow.python.framework import ops
ops.reset_default_graph()
sess = tf.Session()
a = tf.Variable(tf.constant(1.))
b = tf.Variable(tf.constant(1.))
x_val = 5\.
x_data = tf.placeholder(dtype=tf.float32)
two_gate = tf.add(tf.multiply(a, x_data), b)
loss = tf.square(tf.subtract(two_gate, 50.))
my_opt = tf.train.GradientDescentOptimizer(0.01)
train_step = my_opt.minimize(loss)
init = tf.global_variables_initializer()
sess.run(init)
```
1. 我們現在優化模型變量以將輸出訓練到`50`的目標值,如下所示:
```py
print('Optimizing Two Gate Output to 50.')
for i in range(10):
# Run the train step
sess.run(train_step, feed_dict={x_data: x_val})
# Get the a and b values
a_val, b_val = (sess.run(a), sess.run(b))
# Run the two-gate graph output
two_gate_output = sess.run(two_gate, feed_dict={x_data: x_val})
print(str(a_val) + ' * ' + str(x_val) + ' + ' + str(b_val) + ' = ' + str(two_gate_output))
```
1. 上一步應該產生以下輸出:
```py
Optimizing Two Gate Output to 50\.
5.4 * 5.0 + 1.88 = 28.88
7.512 * 5.0 + 2.3024 = 39.8624
8.52576 * 5.0 + 2.50515 = 45.134
9.01236 * 5.0 + 2.60247 = 47.6643
9.24593 * 5.0 + 2.64919 = 48.8789
9.35805 * 5.0 + 2.67161 = 49.4619
9.41186 * 5.0 + 2.68237 = 49.7417
9.43769 * 5.0 + 2.68754 = 49.876
9.45009 * 5.0 + 2.69002 = 49.9405
9.45605 * 5.0 + 2.69121 = 49.9714
```
> 這里需要注意的是,第二個例子的解決方案并不是唯一的。這在神經網絡中并不重要,因為所有參數都被調整為減少損失。這里的最終解決方案將取決于 a 和 b 的初始值。如果這些是隨機初始化的,而不是值 1,我們會看到每次迭代的模型變量的不同結束值。
## 工作原理
我們通過 TensorFlow 的隱式反向傳播實現了計算門的優化。 TensorFlow 跟蹤我們的模型的操作和變量值,并根據我們的優化算法規范和損失函數的輸出進行調整。
我們可以繼續擴展操作門,同時跟蹤哪些輸入是變量,哪些輸入是數據。這對于跟蹤是很重要的,因為 TensorFlow 將更改所有變量以最小化損失而不是數據,這被聲明為占位符。
每個訓練步驟自動跟蹤計算圖并自動更新模型變量的隱式能力是 TensorFlow 的強大功能之一,也是它如此強大的原因之一。
- 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