如何将固定超参数作为变量传入Keras-Tuner的模型构建函数
Keras Tuner向model_builder传入固定参数的解决方案
你的写法错误核心是Keras Tuner要求传入的model_builder是仅以hp作为第一个入参的可调用对象,你直接调用model_builder(img_dim1, img_dim2)既缺少必填的hp参数,返回的也是模型实例而非Tuner需要的可调用对象,不符合入参要求。
下面是两种可行的实现方式:
方案1:使用闭包封装固定参数
通过外层函数接收固定参数,返回仅接收hp作为入参的内层模型构建函数,内层函数可直接复用外层传入的固定参数:
import tensorflow as tf from tensorflow import keras import keras_tuner as kt # 外层函数接收固定参数 def build_model_with_params(img_dim1, img_dim2): def model_builder(hp): model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(img_dim1, img_dim2))) hp_units = hp.Int('units', min_value=32, max_value=512, step=32) model.add(keras.layers.Dense(units=hp_units, activation='relu')) model.add(keras.layers.Dense(10)) hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) return model # 返回内层的可调用对象 return model_builder # 实例化Tuner时先传入固定参数,得到符合要求的模型构建函数 tuner = kt.Hyperband( build_model_with_params(img_dim1=28, img_dim2=28), objective='val_accuracy', max_epochs=10, factor=3 ) tuner.search(train_X, train_y, epochs=50)
方案2:使用functools.partial预绑定固定参数
无需调整原函数结构,直接通过partial方法提前把固定参数绑定到模型构建函数上,剩余的hp参数留待Tuner调用时传入:
import tensorflow as tf from tensorflow import keras import keras_tuner as kt import functools def model_builder(hp, img_dim1, img_dim2): model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(img_dim1, img_dim2))) hp_units = hp.Int('units', min_value=32, max_value=512, step=32) model.add(keras.layers.Dense(units=hp_units, activation='relu')) model.add(keras.layers.Dense(10)) hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) return model # 预绑定固定参数 bound_model_builder = functools.partial(model_builder, img_dim1=28, img_dim2=28) # 直接传入绑定后的可调用对象即可,不要加括号执行 tuner = kt.Hyperband( bound_model_builder, objective='val_accuracy', max_epochs=10, factor=3 ) tuner.search(train_X, train_y, epochs=50)
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

