为Keras层添加正则化时抛出Shapes must be equal rank错误如何解决
问题原因
你触发报错的核心原因是损失张量维度不匹配:
- Keras自带的
kernel_regularizer、activity_regularizer生成的正则损失都是0维标量 - 你自定义的多损失层输出的损失是1维张量:你在
build方法中定义的log_vars参数形状为(1,),最终计算得到的总损失形状也为(1,)
训练时Keras会自动把所有正则损失和自定义损失通过AddN节点相加,0维标量和1维张量无法直接相加,就触发了秩不匹配的报错。
解决方案
只需修改自定义损失层的一处参数即可:
将CustomMultiLossLayer类build方法中log_vars的形状从(1,)改为标量形状(),修改后代码如下:
def build(self, input_shape=None): self.log_vars = [] for i in range(self.nb_outputs): # 把shape从(1,)改成(),生成标量权重 self.log_vars += [self.add_weight(name='log_var' + str(i), shape=(),initializer=tf.keras.initializers.Constant(1.), trainable=True)] super(CustomMultiLossLayer, self).build(input_shape)
另外你提供的代码中遗漏了import tensorflow as tf的导入语句,运行前需要补上,否则会触发未定义tf的报错。
验证
修改完成后,自定义层输出的损失会变成0维标量,和正则损失形状一致,添加kernel_regularizer、activity_regularizer后训练可正常运行。
内容的提问来源于stack exchange,提问作者user2651805
相关产品推荐
相关产品推荐

