怎樣在Python的深度學習庫Keras中使用度量
Keras庫提供了一種在訓練深度學習模型時計算並報告一套標準度量的方法。
除了提供分類和迴歸問題的標準度量外,Keras還允許在訓練深度學習模型時,定義和報告你自定義的度量。如果你想要跟蹤在訓練過程中更好地捕捉模型技能的效能度量,這一點尤其有用。
在本教程中,你將學到在Keras訓練深度學習模型時,如何使用內建度量以及如何定義和使用自己的度量。
完成本教程後,你將知道:
- Keras度量的工作原理,以及如何在訓練模型時使用它們。
- 如何在Keras中使用迴歸和分類度量,並提供例項。
- 如何在Keras中定義和使用你自定義的度量標準,並提供例項。
讓我們開始吧。
教程概述
本教程分為4部分,分別是:
1.Keras的度量
2.Keras迴歸度量
3.Keras分類度量
4.Keras自定義度量
Keras的度量
Keras允許你列出在你的模型訓練期間監控的度量。
你可以通過在模型上指定“ metrics ”引數並提供函式名稱列表給compile()函式實現這一點。
例如:
model.compile(..., metrics=['mse'])
你列出的特定帶的度量可以是Keras函式的名稱(如mean_squared_error)或這些函式得字串別名(如“ mse ”)。
度量的值在訓練資料集上每個週期結束時記錄。如果還提供驗證資料集,那麼也為驗證資料集計算度量記錄。
所有度量都以詳細輸出和從呼叫fit()函式返回的歷史物件中報告。在這兩種情況下,度量函式的名稱都用作度量值的密匙。在這種情況下對於驗證資料集來說度量將“ val_ ”字首新增到金鑰。
損失函式和明確定義的Keras度量都可以用作訓練度量。
Keras迴歸度量
以下是你可以在Keras中使用迴歸問題的度量列表。
- 均方誤差:mean_squared_error,MSE或mse
- 平均絕對誤差:mean_absolute_error,MAE,mae
- 平均絕對百分比誤差:mean_absolute_percentage_error,MAPE,mape
- 餘弦距離: cosine_proximity, cosine
下面的示例在簡單的迴歸問題上演示了這些4個內建的迴歸度量。
from numpyimport array from keras.modelsimport Sequential from keras.layersimport Dense from matplotlibimport pyplot # prepare sequence X= array([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]) # create model model= Sequential() model.add(Dense(2, input_dim=1)) model.add(Dense(1)) model.compile(loss='mse', optimizer='adam', metrics=['mse','mae','mape','cosine']) # train model history= model.fit(X, X, epochs=500, batch_size=len(X), verbose=2) # plot metrics pyplot.plot(history.history['mean_squared_error']) pyplot.plot(history.history['mean_absolute_error']) pyplot.plot(history.history['mean_absolute_percentage_error']) pyplot.plot(history.history['cosine_proximity']) pyplot.show()
執行實力列印每個週期結束的度量值
...
Epoch96/100
0s - loss:1.0596e-04 - mean_squared_error:1.0596e-04 - mean_absolute_error:0.0088 - mean_absolute_percentage_error:3.5611 - cosine_proximity:-1.0000e+00
Epoch97/100
0s - loss:1.0354e-04 - mean_squared_error:1.0354e-04 - mean_absolute_error:0.0087 - mean_absolute_percentage_error:3.5178 - cosine_proximity:-1.0000e+00
Epoch98/100
0s - loss:1.0116e-04 - mean_squared_error:1.0116e-04 - mean_absolute_error:0.0086 - mean_absolute_percentage_error:3.4738 - cosine_proximity:-1.0000e+00
Epoch99/100
0s - loss:9.8820e-05 - mean_squared_error:9.8820e-05 - mean_absolute_error:0.0085 - mean_absolute_percentage_error:3.4294 - cosine_proximity:-1.0000e+00
Epoch100/100
0s - loss:9.6515e-05 - mean_squared_error:9.6515e-05 - mean_absolute_error:0.0084 - mean_absolute_percentage_error:3.3847 - cosine_proximity:-1.0000e+00
接著,建立4個度量在訓練週期的折線圖。
請注意,度量使用字串別名值[‘mse’,‘mae’,’‘mape’,‘cos’]指定,並使用擴充套件函式名稱將其作為歷史物件的鍵值引用。
我們還可以使用副檔名指定度量,如下所示:
model.compile(loss='mse', optimizer='adam', metrics=['mean_squared_error','mean_absolute_error','mean_absolute_percentage_error','cosine_proximity'])
或者你也可以使用損失函式作為度量
例如,您可以使用均方對數誤差(mean_squared_logarithmic_error,MSLE或msle)損失函式作為度量,如下所示:
model.compile(loss='mse', optimizer='adam', metrics=['msle'])
Keras分類度量
以下是可以在Keras中使用的關於分類問題的度量列表。
- 二進位制精度:binary_accuracy,
- 分類準確度:categorical_accuracy, acc
- 稀疏分類精度:sparse_categorical_accuracy
- top k分類精度:top_k_categorical_accuracy(需要指定一個k引數)
- 稀疏Top k分類精度:sparse_top_k_categorical_accuracy(需要指定一個k引數)
精度是指定好的。無論你的問題是二進位制還是多分類問題,都可以指定“ acc ”度量來報告精度。
下面是一個內建的精度度量演示的二進位制分類問題的示例。
from numpyimport array
from keras.modelsimport Sequential
from keras.layersimport Dense
from matplotlibimport pyplot
# prepare sequence
X= array([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0])
y= array([0,0,0,0,0,1,1,1,1,1])
# create model
model= Sequential()
model.add(Dense(2, input_dim=1))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
# train model
history= model.fit(X, y, epochs=400, batch_size=len(X), verbose=2)
# plot metrics
pyplot.plot(history.history['acc'])
pyplot.show()
執行這個示例,在每個週期結束時記錄精度
...
Epoch396/400
0s - loss:0.5934 - acc:0.9000
Epoch397/400
0s - loss:0.5932 - acc:0.9000
Epoch398/400
0s - loss:0.5930 - acc:0.9000
Epoch399/400
0s - loss:0.5927 - acc:0.9000
Epoch400/400
0s - loss:0.5925 - acc:0.9000
建立一個精度的折線圖。
自定義Keras的度量
你還可以定義自己的度量並且在為“metrics”引數呼叫compile()函式時在函式列表中指定函式名。
我通常喜歡跟蹤的度量是RMSE(均方根誤差)。
你可以通過檢查現有度量的程式碼來了解如何編寫自定義的度量。例如,下面是Keras中mean_squared_error損失函式和度量的程式碼。
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred- y_true), axis=-1)
K是Keras使用的後端。
在該示例、其他的損失函式示例和度量中,這個方法是在後端使用標準數學函式來計算興趣度量。例如,我們可以編寫一個自定義度量來計算RMSE,如下所示:
from kerasimport backend
def rmse(y_true, y_pred):
return backend.sqrt(backend.mean(backend.square(y_pred- y_true), axis=-1))
你可以看到函式與添加了sqrt()包含結果的程式碼MSE相同。
我們可以在我們的迴歸示例中進行如下測試。請注意,我們只是直接列出了函式名,而不是將其作為Keras的字串或別名來解決。
from numpyimport array
from keras.modelsimport Sequential
from keras.layersimport Dense
from matplotlibimport pyplot
from kerasimport backend
def rmse(y_true, y_pred):
return backend.sqrt(backend.mean(backend.square(y_pred- y_true), axis=-1))
# prepare sequence
X= array([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0])
# create model
model= Sequential()
model.add(Dense(2, input_dim=1, activation='relu'))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam', metrics=[rmse])
# train model
history= model.fit(X, X, epochs=500, batch_size=len(X), verbose=2)
# plot metrics
pyplot.plot(history.history['rmse'])
pyplot.show()
執行示例記錄每個訓練週期結束時自定義的RMSE度量。
…
Epoch 496/500
0s – loss: 1.2992e-06 – rmse: 9.7909e-04
Epoch 497/500
0s – loss: 1.2681e-06 – rmse: 9.6731e-04
Epoch 498/500
0s – loss: 1.2377e-06 – rmse: 9.5562e-04
Epoch 499/500
0s – loss: 1.2079e-06 – rmse: 9.4403e-04
Epoch 500/500
0s – loss: 1.1788e-06 – rmse: 9.3261e-04
在執行結束時,建立自定義RMSE度量的折線圖。
你自定義度量函式必須對Keras內部資料結構進行操作,這些內部資料結構可能會因使用的後端不同而有所差別(例如,在使用tensorflow時為tensorflow.python.framework.ops.Tensor),而不是直接使用原始yhat值和y值。
因此,我建議儘可能使用後端數學函式來保持一致性和執行速度。
拓展閱讀
如果你想學的更多,可以訪問以下的資源。
- Keras度量API文件:https://keras.io/metrics/
- Keras度量原始碼:https://github.com/fchollet/keras/blob/master/keras/metrics.py
- Keras Loss API文件:https://keras.io/losses/
- Keras Loss 原始碼:https://github.com/fchollet/keras/blob/master/keras/losses.py
總結
在本教程中,你已經學會如何在訓練深度學習模型時使用Keras度量。
具體來說,你學到了:
- Keras度量如何原理,以及如何配置模型以在訓練期間報告度量。
- 如何使用Keras內建的分類和迴歸度量。
- 如何有效地定義和報告自定義度量,同時訓練的深度學習模型。