评估Keras深度学习模型的性能

时间:2022-05-02
本文章向大家介绍评估Keras深度学习模型的性能,主要内容包括经验法评估网络配置、数据拆分、使用手动验证数据集、使用手动k-折交叉验证、总结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

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/