1. 程式人生 > 其它 >評估Keras深度學習模型的效能

評估Keras深度學習模型的效能

Keras是Python中一個的強大而易用的庫,主要用於深度學習。在設計和配置你的深度學習模型時,需要做很多決策。大多數決定必須通過反覆試錯的方法來解決,並在真實的資料上進行評估。因此,有一個可靠的方法來評估神經網路和深度學習模型的效能至關重要。

在這篇文章中,你將學到使用Keras評估模型效能的幾種方法。

讓我們開始吧。

經驗法評估網路配置

在設計和配置你的深度學習模型時,你必須做出無數決策。

這些決策大都可以通過複製其他網路的結構和使用啟發法來解決。然而,最好的方法是實際設計小型實驗,並用實際的資料進行經驗評估。這包括高級別決策,如網路中的層數,數量和型別。它還包括較低級別的決策,如選擇損失函式,啟用函式,優化過程和週期數。深度學習常用於有非常大的資料集的問題上,這種問題往往有成千上萬個例項。

因此,你需要有一個強大的測試工具,可以讓你在不可見的資料上估計給定配置的效能,並可靠地將效能與其他配置進行比較。

資料拆分

大量的資料和複雜的模型需要很長的訓練時間。因此,通常使用簡單的資料分離將資料分成訓練和測試資料集或者訓練和驗證資料集。

Keras提供了兩種方便的方式來評估你的深入學習演算法:

1.使用自動驗證資料集。

2.使用手動驗證資料集。

使用自動驗證資料集

Keras可將你的訓練資料的一部分分成驗證資料集,然後評估每個週期該驗證資料集的效能。

你可以通過設定fit()函式上的validation_split引數(設定成你的訓練資料集尺寸的百分比)來實現。

例如,一個合理的值可能是0.2或0.33,即設定20%或33%的訓練資料被用於驗證。

下面的示例演示瞭如何在小型二進位制分類問題上使用自動驗證資料集。本文中的所有例子都使用了Pima印度人發病的糖尿病資料集。你可以從UCI Machine Learning Repository下載,並將資料檔案儲存在你當前的工作目錄中,檔名為pima-indians-diabetes.csv。

# MLP with automatic validation set
from keras.modelsimport Sequential
from keras.layersimport Dense
import numpy
# fix random seed for reproducibility
numpy.random.seed(7)
# load pima indians dataset
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X= dataset[:,0:8]
Y= dataset[:,8]
# create model
model= Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10)

執行示例,你可以看到每個週期的詳細輸出,顯示了訓練資料集和驗證資料集的損失和準確度。

...
Epoch145/150
514/514 [==============================]- 0s - loss:0.5252 - acc:0.7335 - val_loss:0.5489 - val_acc:0.7244
Epoch146/150
514/514 [==============================]- 0s - loss:0.5198 - acc:0.7296 - val_loss:0.5918 - val_acc:0.7244
Epoch147/150
514/514 [==============================]- 0s - loss:0.5175 - acc:0.7335 - val_loss:0.5365 - val_acc:0.7441
Epoch148/150
514/514 [==============================]- 0s - loss:0.5219 - acc:0.7354 - val_loss:0.5414 - val_acc:0.7520
Epoch149/150
514/514 [==============================]- 0s - loss:0.5089 - acc:0.7432 - val_loss:0.5417 - val_acc:0.7520
Epoch150/150
514/514 [==============================]- 0s - loss:0.5148 - acc:0.7490 - val_loss:0.5549 - val_acc:0.7520

使用手動驗證資料集

Keras還允許你手動設定要在訓練期間進行驗證的資料集。

在這個例子中,我們使用Python的scikit-learn機器學習庫的train_test_split()函式將

我們的資料分成訓練和測試資料集。我們使用67%的訓練,剩下的33%的資料用於驗證。

驗證資料集可以通過validation_data引數指定給Keras中的fit()函式。它需要一個輸入和輸出資料集的陣列:

# MLP with manual validation set
from keras.modelsimport Sequential
from keras.layersimport Dense
from sklearn.model_selectionimport train_test_split
import numpy
# fix random seed for reproducibility
seed= 7
numpy.random.seed(seed)
# load pima indians dataset
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X= dataset[:,0:8]
Y= dataset[:,8]
# split into 67% for train and 33% for test
X_train, X_test, y_train, y_test= train_test_split(X, Y, test_size=0.33, random_state=seed)
# create model
model= Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test,y_test), epochs=150, batch_size=10)

像以前一樣,執行示例提供詳細的訓練輸出,包括每個週期的訓練和驗證資料集上的模型的損失和準確度。

...
Epoch145/150
514/514 [==============================]- 0s - loss:0.4847 - acc:0.7704 - val_loss:0.5668 - val_acc:0.7323
Epoch146/150
514/514 [==============================]- 0s - loss:0.4853 - acc:0.7549 - val_loss:0.5768 - val_acc:0.7087
Epoch147/150
514/514 [==============================]- 0s - loss:0.4864 - acc:0.7743 - val_loss:0.5604 - val_acc:0.7244
Epoch148/150
514/514 [==============================]- 0s - loss:0.4831 - acc:0.7665 - val_loss:0.5589 - val_acc:0.7126
Epoch149/150
514/514 [==============================]- 0s - loss:0.4961 - acc:0.7782 - val_loss:0.5663 - val_acc:0.7126
Epoch150/150
514/514 [==============================]- 0s - loss:0.4967 - acc:0.7588 - val_loss:0.5810 - val_acc:0.6929

使用手動k-折交叉驗證

評估機器學習模型的黃金標準是k-折交叉驗證(k-fold cross validation)。

它為未知資料模型效能提供了可靠的評估。它通過將訓練資料集分為k個子集,推出一個子集做測試集,剩下的子集輪流與它比較來訓練模型。重複這個過程直到所有資料集都曾成為驗證資料集。最後將所有模型的效能評估平均。

交叉驗證通常不用於評估深度學習模型,因為計算代價更大。例如k-折交叉驗證通常使用5或10次摺疊。因此,必須構建和評估5或10個模型,大大增加了模型的評估時間。

然而,當問題足夠小或者如果你有足夠的計算資源時,k-折交叉驗證可以讓你對模型效能的估計偏倚較少。

在下面的例子中,我們使用Python的scikit-learn機器學習庫中的StratifiedKFold類,將訓練資料集分為10折。摺疊是分層的,這意味著演算法試圖平衡每一個類的例項數量

該示例使用10個分裂資料建立和評估10個模型,並收集所有得分。通過將“verbose=0”傳遞給模型上的fit()函式和evaluate()函式,關閉每個週期的詳細輸出。

列印每個模型的效能,並存儲。然後在執行結束時列印模型效能的平均值和標準偏差,以提供可靠的模型精度估計。

# MLP for Pima Indians Dataset with 10-fold cross validation
from keras.modelsimport Sequential
from keras.layersimport Dense
from sklearn.model_selectionimport StratifiedKFold
import numpy
# fix random seed for reproducibility
seed= 7
numpy.random.seed(seed)
# load pima indians dataset
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X= dataset[:,0:8]
Y= dataset[:,8]
# define 10-fold cross validation test harness
kfold= StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
cvscores= []
for train, testin kfold.split(X, Y):
  # create model
    model= Sequential()
    model.add(Dense(12, input_dim=8, activation='relu'))
    model.add(Dense(8, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    # Fit the model
    model.fit(X[train], Y[train], epochs=150, batch_size=10, verbose=0)
    # evaluate the model
    scores= model.evaluate(X[test], Y[test], verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
    cvscores.append(scores[1]* 100)
print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))

執行示例需要不到一分鐘,產生以下輸出:

acc:77.92%
acc:68.83%
acc:72.73%
acc:64.94%
acc:77.92%
acc:35.06%
acc:74.03%
acc:68.83%
acc:34.21%
acc:72.37%
64.68% (+/- 15.50%)

總結

在這篇文章中,你知道了一種可靠的方法來評估深度學習模型在不可見資料上的效能非常重要。

你學到了三種方法,你可以使用Python中的Keras庫來評估深度學習模型的效能:

  • 使用自動驗證資料集。
  • 使用手動驗證資料集。
  • 使用手動k-折交叉驗證。

原文:http://machinelearningmastery.com/evaluate-performance-deep-learning-models-keras/