深度学习入门系列3:深度学习模型的性能评价方法

仅供学习参考,不做商用!

大家好,我技术人Howzit,这是深度学习入门系列第三篇,欢迎大家一起交流!

深度学习入门系列1:多层感知器概述
深度学习入门系列2:用TensorFlow构建你的第一个神经网络
深度学习入门系列3:深度学习模型的性能评价方法
深度学习入门系列4:用scikit-learn找到最好的模型
深度学习入门系列5项目实战:用深度学习识别鸢尾花种类
深度学习入门系列6项目实战:声纳回声识别
深度学习入门系列7项目实战:波士顿房屋价格回归
深度学习入门系列8:用序列化保存模型便于继续训练
深度学习入门系列9:用检查点保存训练期间最好的模型
深度学习入门系列10:从绘制记录中理解训练期间的模型行为
深度学习入门系列11:用Dropout正则减少过拟合
深度学习入门系列12:使用学习规划来提升性能
深度学习入门系列13:卷积神经网络概述
深度学习入门系列14:项目实战:基于CNN的手写数字识别
深度学习入门系列15:用图像增强改善模型性能
深度学习入门系列16:项目实战:图像中目标识别
深度学习入门系列17:项目实战:从电影评论预测情感
深度学习入门系列18:循环神经网络概述
深度学习入门系列19:基于窗口(window)的多层感知器解决时序问题
深度学习入门系列20:LSTM循环神经网络解决国际航空乘客预测问题
深度学习入门系列21:项目:用LSTM+CNN对电影评论分类
深度学习入门系列22:从猜字母游戏中理解有状态的LSTM递归神经网络
深度学习入门系列23:项目:用爱丽丝梦游仙境生成文本


当我们设计和配置深度学习模型时,需要做很多决策。大多数决策通过试错来经验性解决并在真实数据上评价它们。因此,需要一个强大的方法来评价你的神经网络和深度学习模型是非常有必要的。在这节课中,你将学习几种使用Keras评价模型性能的方法。完成这节课之后你将了解:
  • 如何使用自动验证集评价Keras模型。
  • 如何使用手动验证集评价Keras模型。
  • 如何使用K-折叉验证评价Keras模型。
    让我们开始吧。

1 先验地评价网络配置

当你设计和配置你的深度学习模型,你必须做很多决定。大部分决定你可以通过复制其他人的网络结构来解决和使用启发式方法。归根结底,最好的技术是实际设计小实验并使用真实数据先验地评估你的选择。这包括高水平的选择,如你网络中的层的数量,大小和类型。也包括低水平选择,像损失函数,激活函数,优化程序和迭代数量。
深度学习经常在有大规模数据的问题上使用。这有成千上万个实例。因此,你需要有个鲁棒性高的测试工具,允许你在未知数据上评估你配置的性能,并且能可靠和其他配置进行比较。

2 数据分割

大规模数据和复杂模型需要非常长训练时间。因此,典型将数据简单分割成训练集和测试集或者训练集和验证集。Keras提供了两种方便的评价你的深度学习算法的方法:
1.使用自动验证集。
2.使用手动验证集。

2.1 使用自动验证集

Keras 能力分割训练集部分数据为验证集并在每次迭代时在验证集上评价你模型性能。你可以这么做,在fit() 函数中validation_split参数设置训练集的百分百比。例如,合理值可能是0.2或者0.33对应于训练集中20%或者33%为验证集。下面这个例子描述了在Pima Indians 糖尿病数据集上使用自动验证集的方法。

# create your first MLP in Keras

from keras.models import Sequential
from keras.models import Dense
import numpy

# fix random seed for reproducility
seed = 7
numpy.random.seed(seed)

# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabets.csv",delimiter=",")

# splite into input(X) and output(Y) variables
X = dataset[:,0.8]
Y = dataset[:,8]

# create model
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'))

# compile model
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy']

# Fit the model
model.fit(X,Y,validation_split=0.33,nb_epoch=150,batch_size=10)

# evaluate the model
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 参数指定。它需要一组输入和输出数据集。

# create your first MLP in Keras

from keras.models import Sequential
from keras.models import Dense
from sklearn.model_selection import train_test_split
import numpy

# fix random seed for reproducility
seed = 7
numpy.random.seed(seed)

# load pima indians dataset
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)

# splite into input(X) and output(Y) variables
X = dataset[:,0.8]
Y = dataset[:,8]

# create model
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'))

# 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),nb_epoch=150,batch_size=10)

# evaluate the model
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输出。每个模型的性能被打印出来并存下来。模型性能的平均值和标准差也在运行末尾打印出来,为了提供一个可靠的模型准确度的评估。

# MLP for Pima Indians Dataset with 10-fold cross validation

from keras.models import Sequential  
from keras.layers import Dense  
from sklearn.model_selection import 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, test in 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%)

值得注意的是,没错循环我们都不得不重新创建模型,是为了用K折数据拟合和评估它。在接下来的课程中,我们将要学到使用scikit-learn机器学习库的Keras模型。

4 总结

在这节课中给,你已经学习了在未知数据上评估深度学习模型性能方法的重要性。你已经学习三种方法,这三种方法让你能在Python中用Keras 库评估深度学习模型的性能。

  • 自动地分割数据为训练集和验证集
  • 手动而明确定义训练集和验证集。
  • 使用K-折交叉验证评价性能,黄金标准技术。

4.1 接下来

你现在知道如何评价你的模型和估计他们的性能。在接下来课程,你将学习如何将scikit-learn 机器学习库整合到你的Keras模型中。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术人Howzit

钱不钱的无所谓,这是一种鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值