【Keras】微调神经网络超参数

微调神经网络超参数

  • 我们可以使用 GridSearchCV 或 RandomizedSearchCV 来探索超参数空间。为此我们需要将 Keras 模型包装在模仿常规 Scikit-Learn 回归器的对象中。第一步是构建一个函数,该函数将在给定一组超参数的情况下,构建并比编译 Keras模型:
def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):
    model = keras.models.Sequential()
    model.add(keras.layers.InputLayer(input_shape=input_shape))
    for layer in range(n_hidden):
        model.add(keras.layers.Dense(n_neurons, activation="relu"))
    model.add(keras.layers.Dense(1))
    optimizer = keras.optimizers.SGD(lr=learning_rate)
    model.compile(loss="mse", optimizer=optimizer)
    return model
  • 最好为尽可能多的超参数提供合理的默认值。
  • 接下来,基于build_model() 函数创建一个 KerasRegressor:
keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)
  • KerasRegressor 对象是使用 build_model() 构建的 Keras 模型的一个包装。我们可以像常规 Scikit-Learn 回归器一样使用该对象:
keras_reg.fit(X_train, y_train, epochs=100,
             validation_data=(X_valid, y_valid),
             callbacks=[keras.callbacks.EarlyStopping(patience=10)])
mse_test = keras_reg.score(X_test, y_test)
y_pred = keras_reg.predict(X_new)
  • 尝试探索隐藏层的数量、神经元的数量和学习率:
from scipy.stats import reciprocal
from sklearn.model_selection import RandomizedSearchCV

param_distribs = {
    "n_hidden": [0,1,2,3],
    "n_neurons": np.arange(1, 100),
    "learning_rate": reciprocal(3e-4, 3e-2),
}

rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3)
rnd_search_cv.fit(X_train, y_train, epochs=100,
                 validation_data=(X_valid, y_valid),
                 callbacks=[keras.callbacks.EarlyStopping(patience=10)])
  • RandomizedSearchCV 使用K折交叉验证,因此它不使用 X_valid 和 y_valid,它们仅用于提取停止。结束时,可以访问找到的最佳参数,最佳分数和经过训练的Keras模型:
print(rnd_search_cv.best_params_)
print(rnd_search_cv.best_estimator_.model)
  • 之后可以保存该模型,在测试集上对其进行评估。
  • 一些可用于优化超参数的Python库:
库名描述
Hyperopt用于优化各种复杂的搜索空间(包括诸如学习率的实数值和诸如层数的离散值
Hyperas、kopt或Talos用于优化Keras模型的超参数(前两个基于Hyperopt)
  • 了解每个超参数的合理值,有助于构建快速原型并限制搜索空间。

隐藏层数量

  • 与浅层网络相比,深层网络可以使用更少的神经元对复杂的函数进行建模。现实中的数据通常以层次结构进行构造,而深度神经网络会自动利用这一事实。
  • 迁移学习:如果已经训练了一个模型来识别人脸,现在想识别发型,则可以通过重用第一个网络较低层的权重和偏置值,而不是随机初始化新神经网络前几层的权重和偏置值。

每个隐藏层的神经元数量

  • 对于隐藏层,通常将神经元数量调整以形成金字塔状,每一层的神经元越来越少,理由是许多低层特征可以合并成更少的高层特征。
  • 通常增加层数,而不是每层神经元数,更有效。

学习率、批量大小和其他超参数

  • 学习率
    找到一个好的学习率的方法是:对模型进行数百次迭代训练,从非常低的学习率(例如10-5)开始,然后并逐渐将其增加到非常大的值(例如10)。这是通过在每次迭代中,将学习率乘以恒定因子来完成的。如果将损失作为学习率的函数进行绘制(对学习率使用对数坐标),最佳学习率将比损失开始攀升的点低一些。
  • 批量大小
    建议使用可容纳在GPU RAM中的最大批量。但是大批量通常会导致训练不稳定。因此一种策略是尝试使用大批量处理,慢慢增加学习率,如果训练不稳定或最终表现令人失望,则尝试使用小批量处理。
  • 激活函数
    通常,ReLU激活函数是所有隐藏层的良好的默认设置。
  • 迭代次数
    实际上不需要调整训练迭代次数,只需使用提前停止即可。
  • 最佳学习率取决于其他超参数,尤其是批量大小,因此如果你修改了任何超参数,确保也更新学习率。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值