# 使用批量和隨機訓練
雖然 TensorFlow 根據反向傳播更新我們的模型變量,但它可以同時操作從一個基準觀察到一大批數據的任何事物。在一個訓練示例上操作可以使得學習過程非常不穩定,而使用太大的批次可能在計算上是昂貴的。選擇正確類型的訓練對于使我們的機器學習算法融合到解決方案至關重要。
## 做好準備
為了使 TensorFlow 計算反向傳播的可變梯度,我們必須測量樣本或多個樣本的損失。隨機訓練一次只適用于一個隨機抽樣的數據 - 目標對,就像我們在上一個秘籍中所做的那樣。另一種選擇是一次放置大部分訓練樣例并平均梯度計算的損失。訓練批次的大小可以一次變化,直到并包括整個數據集。在這里,我們將展示如何將先前的回歸示例(使用隨機訓練)擴展到批量訓練。
我們將首先加載`numpy`,`matplotlib`和`tensorflow`,然后開始圖會話,如下所示:
```py
import matplotlib as plt
import numpy as np
import tensorflow as tf
sess = tf.Session()
```
## 操作步驟
我們按如下方式處理秘籍:
1. 我們將從聲明批量大小開始。這將是我們將同時通過計算圖提供多少數據觀察:
```py
batch_size = 20
```
1. 接下來,我們在模型中聲明數據,占位符和變量。我們在這里做的改變是我們改變了占位符的形狀。它們現在是兩個維度,第一個維度是`None`,第二個維度是批次中的數據點數。我們可以明確地將它設置為 20,但我們可以推廣并使用`None`值。同樣,正如[第 1 章](../Text/0.html),TensorFlow 入門中所述,我們仍然需要確保維度在模型中運行,這不允許我們執行任何非法矩陣操作:
```py
x_vals = np.random.normal(1, 0.1, 100)
y_vals = np.repeat(10., 100)
x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
A = tf.Variable(tf.random_normal(shape=[1,1]))
```
1. 現在,我們將操作添加到圖中,現在將是矩陣乘法而不是常規乘法。請記住,矩陣乘法不是可交換的,因此我們必須在`matmul()`函數中以正確的順序輸入矩陣:
```py
my_output = tf.matmul(x_data, A)
```
1. 我們的`loss`函數會發生變化,因為我們必須采用批次中每個數據點的所有 L2 損失的平均值。我們通過將先前的損失輸出包裝在 TensorFlow 的`reduce_mean()`函數中來實現:
```py
loss = tf.reduce_mean(tf.square(my_output - y_target))
```
1. 我們像以前一樣聲明我們的優化器并初始化我們的模型變量,如下所示:
```py
my_opt = tf.train.GradientDescentOptimizer(0.02)
train_step = my_opt.minimize(loss)
init = tf.global_variables_initializer()
sess.run(init)
```
1. 最后,我們將循環并迭代訓練步驟以優化算法。這部分與以前不同,因為我們希望能夠繪制隨時間的損失并比較批次與隨機訓練的收斂。因此,我們初始化一個列表,每隔五個時間間隔存儲一次損失函數:
```py
loss_batch = []
for i in range(100):
rand_index = np.random.choice(100, size=batch_size)
rand_x = np.transpose([x_vals[rand_index]])
rand_y = np.transpose([y_vals[rand_index]])
sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})
if (i + 1) % 5 == 0:
print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)))
temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})
print('Loss = ' + str(temp_loss))
loss_batch.append(temp_loss)
```
1. 這是 100 次迭代的最終輸出。請注意,`A`的值有一個額外的維度,因為它現在必須是一個 2D 矩陣:
```py
Step #100 A = [[ 9.86720943]]
Loss = 0\.
```
## 工作原理
批量訓練和隨機訓練的優化方法和收斂性不同。找到一個好的批量大小可能很困難。為了了解批量與隨機指標之間的收斂程度如何不同,建議讀者將批量大小更改為各種級別。以下是保存和記錄訓練循環中隨機損失的代碼。只需在上一個秘籍中替換此代碼:
```py
loss_stochastic = []
for i in range(100):
rand_index = np.random.choice(100)
rand_x = [x_vals[rand_index]]
rand_y = [y_vals[rand_index]]
sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})
if (i + 1) % 5 == 0:
print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)))
temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})
print('Loss = ' + str(temp_loss))
loss_stochastic.append(temp_loss)
```
下面是為同一回歸問題生成隨機和批量損失圖的代碼:
```py
plt.plot(range(0, 100, 5), loss_stochastic, 'b-', label='Stochastic Loss')
plt.plot(range(0, 100, 5), loss_batch, 'r--', label='Batch' Loss, size=20')
plt.legend(loc='upper right', prop={'size': 11})
plt.show()
```
我們得到以下繪圖:

圖 6:在 100 次迭代中繪制的隨機損失和批量損失(批量大小= 20)。請注意,批次損失更加平滑,隨機損失更加不穩定。
## 更多
| 訓練類型 | 好處 | 缺點 |
| --- | --- | --- |
| 隨機 | 隨機性可能有助于擺脫當地的最低限度。 | 通常,需要更多迭代才能收斂。 |
| 批量 | 更快地找到最小值。 | 需要更多資源來計算。 |
- 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