大家好,我技术人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:项目:用爱丽丝梦游仙境生成文本
在Python中,scikit-learn库是通用机器学习中最流行的库。这节课你将学习在Python中如何用Keras中的scikit-learn 库来使用深度学习模型。完成这节课后,你讲了解:
让我们开始吧
Keras 是Python中一个流行的深度学习库,但是它的库目标是深度学习。实际上,它力求简单,只关注您需要的东西,让你能够快速而又简单地定义和构建深度学习模型。Python中scikit-learn 库是在Scipy上构建的,它提供了有效的数字计算。对于一般用途机器学习,它是一个功能齐全库,提供了很多在深度学习中有用的工具。至少提供了:
Keras 为深度学习模型提供便利的封装,用于在scikit-learn中的分类或回归的估计。在接下来的部分中, 我们将研究使用KerasClassifier的示例,包含在Keras创建分类神经网络并在scikit-learn库中使用。测试的问题是Pima Indians 糖尿病分类数据集。
Keras 中 KerasClassifer 和 KerasRegressor类的输入参数build_fn,需要传入创建模型的函数名。不管它是定义模型,编译它还是返回它,你必须定义一个函数。在下面例子中,我们定义create_model() 函数,它针对这个问题创建一个简单的多层神经网络。
我们通过build_fn参数把函数名传给KerasClassifier类,我们也传了nb_epoch=150 和 batch_size=10其他参数。这些都是自动捆绑在一起的并传到fit() 函数,而这个函数是通过KerasClassifier 类内部调用的。在这个例子中,我们使用了scikit-learn中StratifiedKFold执行10折分层交叉验证。这是一个重采样技术,它能够在位置数据上提供一个强大的机器学习性能评估。我们使用scikit-learn中cross_val_score 函数和交叉验证模式来评价我们模型并打印出结果。
import tensorflow as tf
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense
from tensorflow.python.keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_val_score
import numpy
def create_model():
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
# fix random seed for reproduciblity
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]
# create model
model = KerasClassifier(build_fn=create_model, nb_epoch=150, batch_size=10, verbose=0)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
运行例子会显示所用的配置,总共有10个模型要创建和要评价并展示最后的平均精度。
0.731715653237
与之前课程中手动折数的交叉验证相比,你能看到被封装的Keras 模型被已经被流水线化了。
上面的例子展示了,封装Keras深度学习模型并在scikit-learn库的函数中使用它是多么方便。在这个例子中,我们会更进一步。我们已经知道我们可以为fit() 函数提供参数。当我们创建KerasClassifier封装器时,可以通过参数build_fn的指定函数。我们能使用这些参数进一步自定义模型结构。
在这个例子中,对于我们神经网络模型,我们使用网格搜索法评价不同配置,而且暂时最佳评估性能的组合。create_model() 函数定义了两个参数,optimizer 和init,都必须有默认值。这允许我们评估网络的不同优化算法和权重初始化模型的效果。创建模型之后,我们定义一系列我们想搜索的参数,具体地如下:
这些设置放在字典而且被传到scikit-learn 的GridSearchCV配置中。对于优化器,初始化,迭代次数,批量大小的组合,这个类将要通过每一组参数组合(2×3×3×3)评价我们的神经网络。每个组合使用默认的3-折分层交叉验证来评价。会有许多模型和计算,这不是你轻易使用的模式,因为需要花时间计算。在数据集的子集上设计一个小的实验并在合理的时间完成是非常帮助的。由于网络小,数据小,在这种情况下,这个实验是合理的(少于1000个实例和9个属性)。最后,将展示模型配置的最好性能和组合,然后是所有配置组合的性能。
# MLP for Pima Indians Dataset with grid search via sklearn
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import GridSearchCV
import numpy
# Function to create model, required for KerasClassifier
def create_model(optimizer='rmsprop', init='glorot_uniform'):
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer=init, activation='relu'))
model.add(Dense(8, kernel_initializer=init, activation='relu'))
model.add(Dense(1, kernel_initializer=init, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return model
# 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]
# create model
model = KerasClassifier(build_fn=create_model, verbose=0)
# grid search epochs, batch size and optimizer
optimizers = ['rmsprop', 'adam']
inits = ['glorot_uniform', 'normal', 'uniform']
epochs = [50, 100, 150]
batches = [5, 10, 20]
param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=inits) grid = GridSearchCV(estimator=model, param_grid=param_grid)
grid_result = grid.fit(X, Y)
# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, stdev, param))
这个在你的工作站的CPU上可能需要5分钟。运行例子的结果如下。我们看到使用均匀分布初始化,rmsporp优化器,150迭代次数和5批量大小网络搜索法在这个问题上获得最好的交叉验证结果大概为75%。
Best:
0.752604 using {'init': 'uniform', 'optimizer': 'adam','batch_size': 5, 'epochs': 150}
0.707031 (0.025315) with: {'init': 'glorot_uniform', 'optimizer': 'rmsprop', 'batch_size': 5, 'epochs': 50}
0.589844 (0.147095) with: {'init': 'glorot_uniform', 'optimizer': 'adam', 'batch_size': 5, 'epochs': 50}
0.701823 (0.006639) with: {'init': 'normal', 'optimizer': 'rmsprop', 'batch_size': 5, 'epochs': 50}
0.714844 (0.019401) with: {'init': 'normal', 'optimizer': 'adam', 'batch_size': 5, 'epochs': 50}
0.718750 (0.016573) with: {'init': 'uniform', 'optimizer': 'rmsprop', 'batch_size': 5,
...
'epochs': 50}
在这节课中,你已经学习了如何封装Keras深度学习模型并在scikit-learn 通用机器学习库中使用它们。你已经学到:
你看到了,使用scikit-learn的标准机器学习操作-如模型评估和参数优化-要比你自己实现这些模式更节省时间。
你现在已经了解了如何最好集成Keras模型到scikit-learn机器学习库中。现在是时候测试你的新技能了。在接下来的几章中,你将实操并一步步的开发Keras神经网络模型,接下来从多分类问题开始。