如何向Keras Tuner调优模型传入num_features、num_classes等自定义参数
错误原因
- 你的
_model函数参数顺序为(hp, num_features, num_classes),直接调用_model(FEATURES_COUNT, CLASS_COUNT)时,FEATURES_COUNT被分配给了第一个参数hp,CLASS_COUNT被分配给了第二个参数num_features,自然缺少第三个参数num_classes,触发参数缺失报错。 - Keras Tuner的
RandomSearch第一个参数要求传入仅接收hp作为唯一参数的可调用对象,不能直接传入函数执行后的返回值,也不能直接传入带额外参数的函数。hp是Tuner自动生成并注入的超参数管理对象,不需要你手动传入。
解决方法
步骤1:修正模型构建函数的小疏漏
InputLayer的input_shape参数要求传入元组,你当前少写了逗号,后续运行会触发形状报错,先修正:
# 原来的写法 model.add(tf.keras.layers.InputLayer(input_shape=(num_features))) # 修正后 model.add(tf.keras.layers.InputLayer(input_shape=(num_features,)))
步骤2:用lambda包装模型构建函数
用lambda把固定参数FEATURES_COUNT、CLASS_COUNT提前传入,仅保留hp作为入参供Tuner自动调用,修正后的调用代码:
tuner = RandomSearch( lambda hp: _model(hp, FEATURES_COUNT, CLASS_COUNT), objective="categorical_accuracy", max_trials=10, overwrite=True, directory="my_project", project_name="my_project", )
可选方案:用闭包封装
如果你不想用lambda,也可以用闭包把固定参数包裹起来,逻辑更清晰:
def build_model(num_features, num_classes): def _model(hp): model = keras.Sequential() model.add(tf.keras.layers.InputLayer(input_shape=(num_features,))) model.add(tf.keras.layers.Dense( hp.Int("dense_1_units", min_value=128, max_value=2048, step=128, default=128), activation="sigmoid" )) model.add(tf.keras.layers.Dense( hp.Int("dense_2_units", min_value=128, max_value=2048, step=128, default=128), activation="sigmoid" )) model.add(tf.keras.layers.Dense(num_classes, activation="softmax")) model.compile( optimizer=tf.keras.optimizers.Adam( hp.Choice("learning_rate", values=[1e-1, 1e-2, 1e-3]) ), loss="categorical_crossentropy", metrics="categorical_accuracy" ) return model return _model # 调用方式 tuner = RandomSearch( build_model(FEATURES_COUNT, CLASS_COUNT), objective="categorical_accuracy", max_trials=10, overwrite=True, directory="my_project", project_name="my_project", )
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

