You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将固定超参数作为变量传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:27:00