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

TensorFlow2 Keras Tuner同时调优层数与激活函数时出现ValueError问题求助

ValueError: Unknown activation function: sigmoidtanh when tuning activations with Keras Tuner

问题分析

这个错误看起来特别奇怪——sigmoidtanh明显是两个内置激活函数名称的拼接,说明Keras在处理模型激活函数配置时出现了异常。结合你的代码,我找到了两个核心根源:

  1. 输入层未正确添加到模型
    你的代码里这一行多了个多余的逗号:

    tf.keras.layers.InputLayer(input_shape=(2,)),
    

    这个逗号会让这行代码创建一个包含InputLayer的元组,而不是把它添加到Sequential模型中。虽然Keras可以通过输入数据自动推断输入形状(这也是固定激活函数时能正常运行的原因),但在超参数调优过程中,模型需要频繁序列化/反序列化,缺失明确的输入层会打乱序列化逻辑,进而引发激活函数名称的异常拼接。

  2. Keras Tuner版本bug
    旧版本的Keras Tuner在处理多层独立的激活函数超参数选择时,存在序列化bug,可能导致不同激活函数的名字被错误拼接成一个字符串。


修复步骤

1. 修正输入层的添加

把输入层正确加入模型,去掉多余的逗号:

def model_builder(hp):
    model = tf.keras.Sequential()
    # 正确添加输入层
    model.add(tf.keras.layers.InputLayer(input_shape=(2,)))
    #===调优层数===#
    for i in range(hp.Int('num_layers', 2, 5)):
        #===调优每层的单元数与激活函数===#
        hp_units = hp.Int('units_' + str(i), min_value=12, max_value=512, step=10)
        activation = hp.Choice('activation_' + str(i), ['linear', 'relu', 'selu', 'sigmoid', 'tanh'])
        model.add(tf.keras.layers.Dense(units=hp_units, activation=activation))
    #===添加输出层===#
    model.add(tf.keras.layers.Dense(units=2, activation='linear'))
    #===编译模型===#
    model.compile(optimizer='adam', loss=euclidean_distance_loss, metrics=['MeanSquaredError'])
    return model

你也可以省略显式的InputLayer,直接在第一个Dense层指定input_shape:

model.add(tf.keras.layers.Dense(units=hp_units, activation=activation, input_shape=(2,)))

2. 升级Keras Tuner到最新版本

打开终端运行以下命令,避免已知的序列化bug:

pip install --upgrade keras-tuner

3. 验证超参数选项

再确认一遍hp.Choice的激活函数选项,确保sigmoid和tanh是两个独立的选项,没有不小心写成sigmoidtanh。


验证修复

完成以上修改后重新运行调优代码,应该就不会再出现sigmoidtanh的错误了。如果问题仍然存在,可以尝试减少max_trials或executions_per_trial,排查是否是训练过程中的其他序列化问题。

内容的提问来源于stack exchange,提问作者The Dude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:57:27