深度学习模型和评估
设计和配置深度学习模型时,面临选择(比如网络的层数、大小和类型,以及损失函数的选择等),必须做出决策来选择合适的设计与配置。最好的选择是设计小型实验,并用实际数据来评估各个选项。
深度学习具有数据量大和模型复杂的特征,在评估模型时,通常将数据简单地分成训练集和测试集。keras提供了两种评估学习模型地方法:自动评估和手动评估。
自动评估
Keras可将数据集的一部分分成评估集,并在每个epoch中使用该评估数据集对模型进行评估。可以通过fit()函数的验证分割参数(validation_split)设置为数据集大小的百分比来实现。
import tensorflow
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
#设定随机数种子
np.random.seed(7)
#导入数据
dataset = np.loadtxt('pima-indians-diabetes.csv',delimiter=',')
#分割输入变量x和输出变量Y
x = dataset[:,:8]
Y = dataset[:,8]
#创建模型
model = Sequential()
model.add(Dense(input_dim=8,units=12,activation='relu'))
model.add(Dense(units=8,activation='relu'))
model.add(Dense(units=1,activation='sigmoid'))
#编译模型
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
#训练模型并自动评估模型
model.fit(x=x,y=Y,epochs=150,batch_size=10,validation_split=0.2)
k折交叉验证
机器学习模型评估的黄金标准是k折交叉验证。它提供了模型对未知数据性能的可靠估计。
k折交叉验证的过程是将数据集分成k个子集,选择其中一个子集作为测试集,利用剩余的k-1个子集训练模型,并用预留的子集对模型进行评估。重复该过程,直到所有子集被赋予作为被评估数据集的机会。采用k个模型评估结果的平均值作为模型最终的评估结果。
k折交叉验证通常使用5个或10个子集。
import tensorflow
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
from sklearn.model_selection import StratifiedKFold
seed = 7
#设定随机数种子
np.random.seed(seed)
#导入数据
dataset = np.loadtxt('pima-indians-diabetes.csv',delimiter=',')
#分割输入变量x和输出变量Y
x = dataset[:,0:8]
Y = dataset[:,8]
kfold = StratifiedKFold(n_splits=10,random_state=True,shuffle=True)
cvscores = []
for train,validation in kfold.split(x,Y):
#创建模型
model = Sequential()
model.add(Dense(input_dim=8,units=12,activation='relu'))
model.add(Dense(units=8,activation='relu'))
model.add(Dense(units=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)
#通过设置verbose为0来关闭模型的fit()和evaluate()函数的详细输出
#评估模型
scores = model.evaluate(x[validation],Y[validation],verbose=0)
#输出评估结果
print('%s:%.2f%%' %(model.metrics_names[1],scores[1]*100))
cvscores.append(scores[1]*100)
#输出均值和标准差
print('%.2f%%(+/-%.2f%%)' %(np.mean(cvscores),np.std(cvscores)))
#将数据分割成10个子集,并利用折10个子集创建和评估10个模型,且收集这10个模型的评估得分。