仅供学习参考,不做商用!
系列文章目录
深度学习入门系列1:多层感知器概述 深度学习入门系列2:用TensorFlow构建你的第一个神经网络 深度学习入门系列3:深度学习模型的性能评价方法 待更新: 深度学习入门系列4:使用keras模型与scikit-learn进行通用机器学 深度学习入门系列5:项目:花种的多分类 深度学习入门系列6:项目:声纳二分类 深度学习入门系列7:项目:波士顿房屋价格回归 深度学习入门系列8:保存模型以便稍后进行序列化 深度学习入门系列9:训练期间用检查点保存最好模型 深度学习入门系列10:从绘制记录中理解训练期间的模型行为 深度学习入门系列11:用Dropout正则减少过拟合 深度学习入门系列12:使用学习规划来提升性能 深度学习入门系列13:卷积神经网络 深度学习入门系列14项目:手写数字识别 深度学习入门系列15用图像增强改善模型性能 深度学习入门系列16:图像中对象识别项目 深度学习入门系列17:项目:从电影评论预测情感 深度学习入门系列18:递归神经网络
当我们设计和配置深度学习模型时,需要做很多决策。大多数决策通过试错来经验性解决并在真实数据上评价它们。因为这样,需要一个强大的方法来评价你的神经网络和深度学习模型是非常重要的。在这节课中,你将学习几种使用Keras评价模型性能的方法。完成这节课之后你将了解:
- 如何使用自动验证集评价Keras模型。
- 如何使用手动验证集评价Keras模型。
- 如何使用K-折叉验证评价Keras模型。
让我们开始吧。
1 先验地评价网络配置
当你设计和配置你的深度学习模型,你必须做很多决定。大部分决定你可以通过复制其他人的网络结构来解决和使用启发式方法。归根结底,最好的技术是实际设计小实验并使用真实数据先验地评估你的选择。这包括高水平的选择,如你网络中的层的数量,大小和类型。也包括低水平选择,像损失函数,激活函数,优化程序和迭代数量。 深度学习经常在有大规模数据的问题上使用。这有成千上万个实例。因此,你需要有个鲁棒性高的测试工具,允许你在未知数据上评估你配置的性能,并且能可靠和其他配置进行比较。
2 数据分割
大规模数据和复杂模型需要非常长训练时间。因此,典型将数据简单分割成训练集和测试集或者训练集和验证集。Keras提供了两种方便的评价你的深度学习算法的方法: 1.使用自动验证集。 2.使用手动验证集。
2.1 使用自动验证集
Keras 能力分割训练集部分数据为验证集并在每次迭代时在验证集上评价你模型性能。你可以这么做,在fit() 函数中validation_split参数设置训练集的百分百比。例如,合理值可能是0.2或者0.33对应于训练集中20%或者33%为验证集。下面这个例子描述了在Pima Indians 糖尿病数据集上使用自动验证集的方法。
from keras.models import Sequential
from keras.models import Dense
import numpy
seed = 7
numpy.random.seed(seed)
dataset = numpy.loadtxt("pima-indians-diabets.csv",delimiter=",")
X = dataset[:,0.8]
Y = dataset[:,8]
model = Sequential()
model.add(Dense(12,input_dim=9,init='uniform',activation='relu'))
model.add(Dense(8,init='uniform',acitvation='relu'))
model.add(Dense(8,init='uniform',acitvation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy']
model.fit(X,Y,validation_split=0.33,nb_epoch=150,batch_size=10)
scores = model.evaluate(X,Y)
print("%s:%.2f%%"%(model.metrics_name[1],scores[1]*100)
运行这个例子,你能看到每次迭代的详细输出,显示在训练集和验证集上的损失和精度。
Epoch 147/150
514/514 [==============================] - 0s - loss: 0.4864 - acc:0.7743 - val_loss:0.5604 - val_acc: 0.7244
Epoch 148/150
514/514 [==============================] - 0s - loss: 0.4831 - acc:0.7665 - val_loss: 0.5589 - val_acc: 0.7126
Epoch 149/150
514/514 [==============================] - 0s - loss: 0.4961 - acc:0.7782 - val_loss:0.5663 - val_acc: 0.7126
Epoch 150/150
514/514 [==============================] - 0s - loss: 0.4967 - acc: 0.7588 - val_loss: 0.5810 - val_acc: 0.6929
2.2 使用手动验证集
Keras 也允许你在训练时指定验证集。在这个例子中,我们使用来自Python中 scikit-learn 机器学习库的train_test_split() 函数将数据分成训练集和测试集。我们使用67%作为训练集,剩下33%作为验证集。验证集可以keras中的fit() 函数中validation_data 参数指定。它需要一组输入和输出数据集。
from keras.models import Sequential
from keras.models import Dense
from sklearn.model_selection import train_test_split
import numpy
seed = 7
numpy.random.seed(seed)
dataset = numpy.loadtxt("pima-indians-diabets.csv",delimiter=",")
X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=0.3,random_state=seed)
X = dataset[:,0.8]
Y = dataset[:,8]
model = Sequential()
model.add(Dense(12,input_dim=9,init='uniform',activation='relu'))
model.add(Dense(8,init='uniform',acitvation='relu'))
model.add(Dense(8,init='uniform',acitvation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy']
model.fit(X_train,y_train,validation_data=(X_test,y_test),nb_epoch=150,batch_size=10)
scores = model.evaluate(X,Y)
print("%s:%.2f%%"%(model.metrics_name[1],scores[1]*100)
与之前一样,运行该示例,提供了详细的训练输出,其中包括模型在每次迭代的训练和验证数据集上的损失和准确性。
3 手动K折交叉验证
机器学习模型评价的黄金标准是K-折交叉验证。它提供了一个在未知数据上可靠的模型性能估计。它是通过将训练集分成k个子集实现的,在所有子集上轮流训练,除了一个,会在这个除外的验证集上进行模型的评估。这个过程不断的重复,直到所有的模型都有机会作为验证集。性能的测量值是通过所有创建模型的平均值。 交叉验证一般不对深度学习模型进行评估,因为需要较大的计算力。例如,k-交叉验证经常使用5或者10。因此,需要构建和评估5或者10个模型,很大程度上,增加了评估模型的时间。尽管如此,当你的问题足够小或者你有充足的计算资源时,k-交叉验证在模型的性能评估上误差更小。 下面这个例子,我们使用了来自scikit-learn 库中的StratifiedKFold类,将数据分成10折。折是分层的,意味着算法在每层都要平衡每个类的实例数。例子中创建和评价类10个模型,使用的是10份数据集,并收集类所有评分。通过在fit()和evaluate()函数中传verbos=0来关闭每个周期的verbos输出。每个模型的性能被打印出来并存下来。模型性能的平均值和标准差也在运行末尾打印出来,为了提供一个可靠的模型准确度的评估。
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import StratifiedKFold
import numpy
seed = 7
numpy.random.seed(seed)
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) cvscores = []
for train, test in kfold.split(X, Y):
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X[train], Y[train], epochs=150, batch_size=10, verbose=0)
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%)
值得注意的是,没错循环我们都不得不重新创建模型,是为了用K折数据拟合和评估它。在接下来的课程中,我们将要学到使用scikit-learn机器学习库的Keras模型。
4 总结
在这节课中给,你已经学习了在未知数据上评估深度学习模型性能方法的重要性。你已经学习三种方法,这三种方法让你能在Python中用Keras 库评估深度学习模型的性能。
- 自动地分割数据为训练集和验证集
- 手动而明确定义训练集和验证集。
- 使用K-折交叉验证评价性能,黄金标准技术。
4.1 接下来
你现在知道如何评价你的模型和估计他们的性能。在接下来课程,你将学习如何将scikit-learn 机器学习库整合到你的Keras模型中。
|