最近使用keras调整参数,使用到自动调参,从网上找到一些资料,主要使用scikit-learn中GridSearchCV进行自动搜索最优参数,很实用分享到这里,帮助需要的朋友。
Grid search 是一种最优超参数的选择算法,实际就是暴力搜索。首先设定参数的候选值,然后穷举所有参数组合,根据评分机制,选择最好的那一组设置
在scikit-learn中,类GridSearchCV可以为我们实现Grid Search。
默认情况下,accuracy是GridSearchCV的评分标准,可以通过scoring参数设置
param_grid是一个字典,表示为 [参数名:候选值],GridSearchCV将会组合这些参数进行评估最优。这些参数包括训练参数(epochs,batch_size等)以及模型参数(kernel_size, pool_size, num_filters等等等等)
n_jobs默认为1,表示将使用一个进程,将其设置为-1,表示将调用最大数量的进行(我在实验过程中,如果设置为-1,就在无限等待,所以以下代码n_jogs的值均为1)
GridSearchCV通过Cross validation来评估每个模型。
更多参考 sklearn.model_selection.GridSearchCV
#举个例子
param_grid = dict(epochs=[10,20,30])
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=1)
grid_result = grid.fit(X, Y)
例一:对Batch Size 和 Epochs进行调参
在keras中可以使用EarlyStopping这里的回调函数来监控训练过程,因此Epochs参数的选择可能不是那么重要了。
有些模型对batch_size参数还是很敏感的,所以对batch_size进行调参还是很有必要的
import numpy as np
from sklearn.model_selection import GridSearchCV
from keras import models
from keras import layers
from keras import optimizers
from keras.wrappers import scikit_learn
# 模型创建函数,KerasClassifier需要这个函数
def create_model():
# create model
model = models.Sequential()
model.add(layers.Dense(12, activation='relu', input_shape=(8,)))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
return model
# 导入数据
dataset = np.loadtxt('pima-indians-diabetes.csv', delimiter=',')
# 分割数据为输入X, 和目标Y
X = dataset[:, :8]
Y = dataset[:, 8]
# 归一化
means = np.mean(X, axis=0)
X -= means
stds = np.std(X, axis=0)
X /= stds
# 设置种子,为了可复现(这个无关紧要)
seed = 7
np.random.seed(seed)
# 创建模型
model = scikit_learn.KerasClassifier(build_fn=create_model, verbose=0)
# 设置参数候选值
batch_size = [8,16]
epochs = [10,50]
# 创建GridSearchCV,并训练
param_grid = dict(batch_size=batch_size, epochs=epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=1)
grid_result = grid.fit(X, Y)
# 打印结果
print('Best: {} using {}'.format(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, std, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, std, param))
Best: 0.7799479166666666 using {'batch_size': 8, 'epochs': 50}
0.763021 (0.041504) with: {'batch_size': 8, 'epochs': 10}
0.779948 (0.034104) with: {'batch_size': 8, 'epochs': 50}
0.744792 (0.030647) with: {'batch_size': 16, 'epochs': 10}
0.769531 (0.039836) with: {'batch_size': 16, 'epochs': 50}
例二:对Optimization Algorithm调参
Keras提供了很多最优化算法,例如adam, sgd, rmsprop等等。更多参考优化器optimizers
但是通常我们只会用其中某一种算法,不太可能去关注不同优化算法之间的区别,因此下面的例子就是为了举个例子,可能没有多少实际意义
# 模型创建函数,KerasClassifier需要这个函数
def create_model(optimizer='adam'):
# create model
model = models.Sequential()
model.add(layers.Dense(12, activation='relu', input_shape=(8,)))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['acc'])
return model
# 导入数据
dataset = np.loadtxt('pima-indians-diabetes.csv', delimiter=',')
# 分割数据为输入X, 和目标Y
X = dataset[:, :8]
Y = dataset[:, 8]
# 归一化
means = np.mean(X, axis=0)
X -= means
stds = np.std(X, axis=0)
X /= stds
# 设置种子,为了可复现(这个无关紧要)
seed = 7
np.random.seed(seed)
# 创建模型
model = scikit_learn.KerasClassifier(build_fn=create_model, epochs=20, batch_size=8, verbose=0)
# 设置参数候选值
optimizer = ['sgd', 'rmsprop', 'adam', 'adagrad']
# 创建GridSearchCV,并训练
param_grid = dict(optimizer=optimizer)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=1)
grid_result = grid.fit(X, Y)
# 打印结果
print('Best: {} using {}'.format(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, std, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, std, param))
Best: 0.7682291666666666 using {'optimizer': 'rmsprop'}
0.765625 (0.037603) with: {'optimizer': 'sgd'}
0.768229 (0.025582) with: {'optimizer': 'rmsprop'}
0.764323 (0.031466) with: {'optimizer': 'adam'}
0.760417 (0.034104) with: {'optimizer': 'adagrad'}
通过上面两个例子,应该明白其他参数如何调参了,这里就不一一写出,关于有哪些参数可以使用:到官网查看https://keras.io/optimizers/
注意:如果多个参数一起调整,运行的速度非常慢,很难输出结果,所以单个参数调整更快一些。
参考:
https://blog.csdn.net/weiwei9363/article/details/79222268
https://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/