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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:45:04