TensorFlow 2.7.0下ctc_batch_cost函数出现Shape change错误如何解决
修复方案
核心问题原因
你传入ctc_batch_cost的input_length和label_length都是形状为(batch_size, 1)的二维张量,而TensorFlow 2.7.0取消自动升秩的改动后,Keras后端的CTC损失函数明确要求这两个参数为(batch_size,)格式的一维张量,内部循环逻辑无法兼容多余的维度,才会触发形状不匹配报错。
具体修改步骤
- 对
label_length做降维处理,去掉最后一个多余的维度 - 对生成的
input_length同样做降维处理,去掉最后一个多余的维度
修改后可运行代码
class CTCLayer(layers.Layer): def __init__(self, name=None): super().__init__(name=name) self.loss_fn = keras.backend.ctc_batch_cost def call(self, labels, label_length, predictions): batch_len = tf.cast(tf.shape(labels)[0], dtype="int64") input_length = tf.cast(tf.shape(predictions)[1], dtype="int64") # 降维:去掉label_length最后一个多余维度,转为(batch_size,)的一维张量 label_length = tf.cast(tf.squeeze(label_length, axis=-1), dtype="int64") # 生成的input_length直接设为(batch_size,)格式,无需多余维度 input_length = input_length * tf.ones(shape=(batch_len,), dtype="int64") loss = self.loss_fn(y_true=labels, y_pred=predictions, input_length=input_length, label_length=label_length) self.add_loss(loss) return predictions
多版本兼容方案
如果需要同时兼容TensorFlow 2.6和2.7版本,可以增加维度判断逻辑,避免降维操作报错:
# 放在label_length类型转换之后即可 if label_length.shape.rank == 2: label_length = tf.squeeze(label_length, axis=-1)
内容的提问来源于stack exchange,提问作者pgov
相关产品推荐
相关产品推荐

