TensorFlow2 Keras Tuner同时调优层数与激活函数时出现ValueError问题求助
ValueError: Unknown activation function: sigmoidtanh when tuning activations with Keras Tuner
问题分析
这个错误看起来特别奇怪——sigmoidtanh明显是两个内置激活函数名称的拼接,说明Keras在处理模型激活函数配置时出现了异常。结合你的代码,我找到了两个核心根源:
输入层未正确添加到模型
你的代码里这一行多了个多余的逗号:tf.keras.layers.InputLayer(input_shape=(2,)),这个逗号会让这行代码创建一个包含
InputLayer的元组,而不是把它添加到Sequential模型中。虽然Keras可以通过输入数据自动推断输入形状(这也是固定激活函数时能正常运行的原因),但在超参数调优过程中,模型需要频繁序列化/反序列化,缺失明确的输入层会打乱序列化逻辑,进而引发激活函数名称的异常拼接。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
相关产品推荐
相关产品推荐

