使用keras_tuner的RandomSearch时logits与labels维度不匹配如何解决
错误原因
- 损失函数与标签格式不匹配
你已经通过to_categorical()将标签转换为one-hot编码格式,单样本标签形状为(15,),但模型编译时使用的sparse_categorical_crossentropy损失函数仅支持整数格式的标签,单样本标签形状应为标量。格式不匹配导致框架将one-hot标签直接展平计算,batch为32时,logits第一维是32,标签展平后长度为32*15=480,和报错信息完全吻合。 build_model函数存在逻辑错误
函数中第一次return model之后的所有代码都不会执行,重复编写的model.compile和model.summary属于无效冗余代码,同时提前返回也会导致你写的第二次编译配置完全不生效。
修复方案
二选一即可:
方案A:适配one-hot标签修改损失函数
将模型编译时的损失函数替换为适配one-hot编码的categorical_crossentropy,同时清理build_model的冗余逻辑,修改后的函数如下:
def build_model(hp): model = keras.Sequential([ keras.layers.Conv2D( filters=hp.Int('conv_1_filter', min_value=32, max_value=128, step=20), kernel_size=hp.Choice('conv_1_kernel', values=[3, 5]), activation='relu', input_shape=(50, 50, 3) ), keras.layers.Conv2D( filters=hp.Int('conv_2_filter', min_value=32, max_value=64, step=20), kernel_size=hp.Choice('conv_2_kernel', values=[3, 5]), activation='relu' ), keras.layers.Flatten(), keras.layers.Dense( units=hp.Int('dense_1_units', min_value=32, max_value=128, step=20), activation='relu' ), keras.layers.Dense(15, activation='softmax') ]) model.compile(optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-3])), loss='categorical_crossentropy', metrics=['accuracy']) model.summary() return model
方案B:保留稀疏损失修改标签格式
删除代码中y = to_categorical(y)这一行,保留LabelEncoder输出的整数格式标签,同时同样清理build_model函数的冗余逻辑即可。
内容的提问来源于stack exchange,提问作者T. Elhassan
相关产品推荐
相关产品推荐

