# 評估模型
我們已經學會了如何在 TensorFlow 中訓練回歸和分類算法。在此之后,我們必須能夠評估模型的預測,以確定它的效果。
## 做好準備
評估模型非常重要,每個后續模型都將采用某種形式的模型評估。使用 TensorFlow,我們必須將此函數構建到計算圖中,并在我們的模型進行訓練時和/或完成訓練后調用它。
在訓練期間評估模型可以讓我們深入了解算法,并可以提供調試,改進或完全更改模型的提示。雖然訓練期間的評估并不總是必要的,但我們將展示如何使用回歸和分類進行評估。
訓練結束后,我們需要量化模型對數據的執行方式。理想情況下,我們有一個單獨的訓練和測試集(甚至是驗證集),我們可以在其上評估模型。
當我們想要評估模型時,我們希望在大批數據點上進行評估。如果我們已經實現了批量訓練,我們可以重用我們的模型來對這樣的批次進行預測。如果我們實現了隨機訓練,我們可能必須創建一個可以批量處理數據的單獨評估器。
> 如果我們在`loss`函數中包含對模型輸出的轉換,例如`sigmoid_cross_entropy_with_logits()`,我們必須在計算精度計算的預測時考慮到這一點。不要忘記將此包含在您對模型的評估中。
我們要評估的任何模型的另一個重要方面是它是回歸還是分類模型。
回歸模型試圖預測連續數。目標不是類別,而是所需數量。為了評估這些針對實際目標的回歸預測,我們需要對兩者之間的距離進行綜合測量。大多數情況下,有意義的損失函數將滿足這些標準。此秘籍向您展示如何將之前的簡單回歸算法更改為打印出訓練循環中的損失并在結束時評估損失。例如,我們將在本章的先前實現反向傳播秘籍中重新審視并重寫我們的回歸示例。
分類模型基于數字輸入預測類別。實際目標是 1 和 0 的序列,我們必須衡量我們與預測的真實程度。分類模型的損失函數通常對解釋模型的運行情況沒有幫助。通常,我們需要某種分類準確率,這通常是正確預測類別的百分比。對于此示例,我們將使用本章中先前實現反向傳播秘籍的分類示例。
## 操作步驟
首先,我們將展示如何評估簡單回歸模型,該模型簡單地適應目標的常數乘法,即 10,如下所示:
1. 首先,我們首先加載庫并創建圖,數據,變量和占位符。本節還有一個非常重要的部分。在我們創建數據之后,我們將數據隨機分成訓練和測試數據集。這很重要,因為我們總是會測試我們的模型,看看它們是否預測良好。在訓練數據和測試數據上評估模型還可以讓我們看到模型是否過擬合:
```py
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
sess = tf.Session()
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)
batch_size = 25
train_indices = np.random.choice(len(x_vals), round(len(x_vals)*0.8), replace=False)
test_indices = np.array(list(set(range(len(x_vals))) - set(train_indices)))
x_vals_train = x_vals[train_indices]
x_vals_test = x_vals[test_indices]
y_vals_train = y_vals[train_indices]
y_vals_test = y_vals[test_indices]
A = tf.Variable(tf.random_normal(shape=[1,1]))
```
1. 現在,我們聲明我們的模型,`loss`函數和優化算法。我們還將初始化模型變量`A`。使用以下代碼:
```py
my_output = tf.matmul(x_data, A)
loss = tf.reduce_mean(tf.square(my_output - y_target))
my_opt = tf.train.GradientDescentOptimizer(0.02)
train_step = my_opt.minimize(loss)
init = tf.global_variables_initializer()
sess.run(init)
```
1. 我們正如我們之前看到的那樣運行訓練循環,如下所示:
```py
for i in range(100):
rand_index = np.random.choice(len(x_vals_train), size=batch_size) rand_x = np.transpose([x_vals_train[rand_index]])
rand_y = np.transpose([y_vals_train[rand_index]])
sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})
if (i + 1) % 25 == 0:
print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)))
print('Loss = ' + str(sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})))
Step #25 A = [[ 6.39879179]]
Loss = 13.7903
Step #50 A = [[ 8.64770794]]
Loss = 2.53685
Step #75 A = [[ 9.40029907]]
Loss = 0.818259
Step #100 A = [[ 9.6809473]]
Loss = 1.10908
```
1. 現在,為了評估模型,我們將在訓練和測試集上輸出 MSE(損失函數),如下所示:
```py
mse_test = sess.run(loss, feed_dict={x_data: np.transpose([x_vals_test]), y_target: np.transpose([y_vals_test])})
mse_train = sess.run(loss, feed_dict={x_data: np.transpose([x_vals_train]), y_target: np.transpose([y_vals_train])})
print('MSE' on test:' + str(np.round(mse_test, 2)))
print('MSE' on train:' + str(np.round(mse_train, 2)))
MSE on test:1.35
MSE on train:0.88
```
對于分類示例,我們將做一些非常相似的事情。這一次,我們需要創建我們自己的精確度函數,我們可以在最后調用。其中一個原因是我們的損失函數內置了 sigmoid,我們需要單獨調用 sigmoid 并測試它以查看我們的類是否正確:
1. 在同一個腳本中,我們可以重新加載圖并創建數據,變量和占位符。請記住,我們還需要將數據和目標分成訓練和測試集。使用以下代碼:
```py
from tensorflow.python.framework import ops
ops.reset_default_graph()
sess = tf.Session()
batch_size = 25
x_vals = np.concatenate((np.random.normal(-1, 1, 50), np.random.normal(2, 1, 50)))
y_vals = np.concatenate((np.repeat(0., 50), np.repeat(1., 50)))
x_data = tf.placeholder(shape=[1, None], dtype=tf.float32)
y_target = tf.placeholder(shape=[1, None], dtype=tf.float32)
train_indices = np.random.choice(len(x_vals), round(len(x_vals)*0.8), replace=False)
test_indices = np.array(list(set(range(len(x_vals))) - set(train_indices)))
x_vals_train = x_vals[train_indices]
x_vals_test = x_vals[test_indices]
y_vals_train = y_vals[train_indices]
y_vals_test = y_vals[test_indices]
A = tf.Variable(tf.random_normal(mean=10, shape=[1]))
```
1. 我們現在將模型和損失函數添加到圖中,初始化變量,并創建優化過程,如下所示:
```py
my_output = tf.add(x_data, A)
init = tf.initialize_all_variables()
sess.run(init)
xentropy = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(my_output, y_target))
my_opt = tf.train.GradientDescentOptimizer(0.05)
train_step = my_opt.minimize(xentropy)
```
1. 現在,我們運行我們的訓練循環,如下所示:
```py
for i in range(1800):
rand_index = np.random.choice(len(x_vals_train), size=batch_size)
rand_x = [x_vals_train[rand_index]]
rand_y = [y_vals_train[rand_index]]
sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})
if (i+1)%200==0:
print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)))
print('Loss = ' + str(sess.run(xentropy, feed_dict={x_data: rand_x, y_target: rand_y})))
Step #200 A = [ 6.64970636]
Loss = 3.39434
Step #400 A = [ 2.2884655]
Loss = 0.456173
Step #600 A = [ 0.29109824]
Loss = 0.312162
Step #800 A = [-0.20045301]
Loss = 0.241349
Step #1000 A = [-0.33634067]
Loss = 0.376786
Step #1200 A = [-0.36866501]
Loss = 0.271654
Step #1400 A = [-0.3727718]
Loss = 0.294866
Step #1600 A = [-0.39153299]
Loss = 0.202275
Step #1800 A = [-0.36630616]
Loss = 0.358463
```
1. 為了評估模型,我們將創建自己的預測操作。我們將預測操作包裝在擠壓函數中,因為我們希望使預測和目標形成相同的形狀。然后,我們用相等的函數測試相等性。在那之后,我們留下了一個真值和假值的張量,我們將其轉換為`float32`并取平均值。這將產生準確率值。我們將為訓練集和測試集評估此函數,如下所示:
```py
y_prediction = tf.squeeze(tf.round(tf.nn.sigmoid(tf.add(x_data, A))))
correct_prediction = tf.equal(y_prediction, y_target)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
acc_value_test = sess.run(accuracy, feed_dict={x_data: [x_vals_test], y_target: [y_vals_test]})
acc_value_train = sess.run(accuracy, feed_dict={x_data: [x_vals_train], y_target: [y_vals_train]})
print('Accuracy' on train set: ' + str(acc_value_train))
print('Accuracy' on test set: ' + str(acc_value_test))
Accuracy on train set: 0.925
Accuracy on test set: 0.95
```
1. 通常,查看模型結果(準確率,MSE 等)將有助于我們評估模型。我們可以在這里輕松繪制模型和數據的繪圖,因為它是一維的。以下是使用`matplotlib`使用兩個單獨的直方圖可視化模型和數據的方法:
```py
A_result = sess.run(A)
bins = np.linspace(-5, 5, 50)
plt.hist(x_vals[0:50], bins, alpha=0.5, label='N(-1,1)', color='white')
plt.hist(x_vals[50:100], bins[0:50], alpha=0.5, label='N(2,1)', color='red')
plt.plot((A_result, A_result), (0, 8), 'k--', linewidth=3, label='A = '+ str(np.round(A_result, 2)))
plt.legend(loc='upper right')
plt.title('Binary Classifier, Accuracy=' + str(np.round(acc_value, 2)))
plt.show()
```
## 工作原理
這導致繪圖顯示兩個單獨數據類的直方圖中兩個類的預測最佳分隔符。

圖 8:數據和結束模型的可視化,A。兩個正常值以-1 和 2 為中心,使理論最佳分割為 0.5。在這里,模型發現最接近該數字的最佳分割。
- 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