恐怕除了学习率之外,还有很多值可供您选择很多超参数,特别是如果您使用 ADAM 优化等。
调优的原则性重要性顺序如下
- 学习率𝛼
- 动量项𝛽,每层隐藏单元的数量,批量大小。
- 隐藏层数,学习率衰减。
要调整一组超参数,您需要定义一个对每个参数有意义的范围。给定您想要根据预算尝试的多个不同值,您可以从随机抽样中选择一个超参数值。
但是,专门针对学习率调查,您可能希望尝试广泛的值,例如从 0.0001 到 1,因此您可以避免直接从 0.0001 到 1 采样随机值。您可以改为 x = [ - 4 , 0 ] 为了 一个=10X 基本上遵循对数刻度。
就时期数而言,您应该使用 设置提前停止回调patience~=50,具体取决于您的“探索”预算。这意味着,如果在定义的 epoch 数量上没有改进,您将放弃具有特定学习率值的训练。
可以说,神经网络的参数调整是一种艺术形式。出于这个原因,我建议您查看非手动调整的基本方法,例如在 sklearn 包中实现的方法GridSearch。RandomSearch此外,可能值得研究更高级的技术,例如使用高斯过程的贝叶斯优化和 Tree Parzen 估计器。祝你好运!
Keras 中参数调优的随机搜索
- 定义创建模型实例的函数
# Model instance
input_shape = X_train.shape[1]
def create_model(n_hidden=1, n_neurons=30, learning_rate = 0.01, drop_rate = 0.5, act_func = 'ReLU',
act_func_out = 'sigmoid',kernel_init = 'uniform', opt= 'Adadelta'):
model = Sequential()
model.add(Dense(n_neurons, input_shape=(input_shape,), activation=act_func,
kernel_initializer = kernel_init))
model.add(BatchNormalization())
model.add(Dropout(drop_rate))
# Add as many hidden layers as specified in nl
for layer in range(n_hidden):
# Layers have nn neurons model.add(Dense(nn, activation='relu'
model.add(Dense(n_neurons, activation=act_func, kernel_initializer = kernel_init))
model.add(BatchNormalization())
model.add(Dropout(drop_rate))
model.add(Dense(1, activation=act_func_out, kernel_initializer = kernel_init))
opt= Adadelta(lr=learning_rate)
model.compile(loss='binary_crossentropy',optimizer=opt, metrics=[f1_m])
return model
- 定义参数搜索空间
params = dict(n_hidden= randint(4, 32),
epochs=[50], #, 20, 30],
n_neurons= randint(512, 600),
act_func=['relu'],
act_func_out=['sigmoid'],
learning_rate= [0.01, 0.1, 0.3, 0.5],
opt = ['adam','Adadelta', 'Adagrad','Rmsprop'],
kernel_init = ['uniform','normal', 'glorot_uniform'],
batch_size=[256, 512, 1024, 2048],
drop_rate= [np.random.uniform(0.1, 0.4)])
- 用 sklearn API 包装 Keras 模型并实例化随机搜索
model = KerasClassifier(build_fn=create_model)
random_search = RandomizedSearchCV(model, params, n_iter=5, scoring='average_precision',
cv=5)
- 搜索最优超参数
random_search_results = random_search.fit(X_train, y_train,
validation_data =(X_test, y_test),
callbacks=[EarlyStopping(patience=50)])