如何在 keras 中使用 tensorflow ctc_batch_cost 函数?

Posted

技术标签:

【中文标题】如何在 keras 中使用 tensorflow ctc_batch_cost 函数?【英文标题】:How do you use tensorflow ctc_batch_cost function with keras? 【发布时间】:2020-07-02 01:23:21 【问题描述】:

我这几天一直在尝试在 keras 中实现 CTC 损失函数。

不幸的是,我还没有找到一种适合 keras 的简单方法。我找到了 tensorflow 的 tf.keras.backend.ctc_batch_cost 函数,但没有太多关于它的文档。我对一些事情感到困惑。首先,input_lengthlabel_length 参数是什么?我正在尝试制作一个手写识别模型,我的图像是 32x128,我的 RNN 有 32 个时间步长,我的字符列表的长度为 80。我尝试对两个参数都使用 32,这给了我下面的错误。

函数不应该已经从前两个参数(y_truey_pred)的形状中知道input_lengthlabel_length 吗?

其次,我需要对我的训练数据进行编码吗?这一切都是自动完成的吗?

我知道 tensorflow 也有一个叫做 tf.keras.backend.ctc_decode 的函数。这仅在进行预测时使用吗?

def ctc_cost(y_true, y_pred):
    return tf.keras.backend.ctc_batch_cost(
        y_true, y_pred, 32, 32)


model = tf.keras.Sequential([
    layers.Conv2D(32, 5, padding="SAME", input_shape=(32, 128, 1)),
    layers.BatchNormalization(),
    layers.Activation("relu"),
    layers.MaxPool2D(2, 2),
    layers.Conv2D(64, 5, padding="SAME"),
    layers.BatchNormalization(),
    layers.Activation("relu"),
    layers.MaxPool2D(2, 2),
    layers.Conv2D(128, 3, padding="SAME"),
    layers.BatchNormalization(),
    layers.Activation("relu"),
    layers.MaxPool2D((1, 2), (1, 2)),
    layers.Conv2D(128, 3, padding="SAME"),
    layers.BatchNormalization(),
    layers.Activation("relu"),
    layers.MaxPool2D((1, 2), (1, 2)),
    layers.Conv2D(256, 3, padding="SAME"),
    layers.BatchNormalization(),
    layers.Activation("relu"),
    layers.MaxPool2D((1, 2), (1, 2)),
    layers.Reshape((32, 256)),
    layers.Bidirectional(layers.LSTM(256, return_sequences=True)),
    layers.Bidirectional(layers.LSTM(256, return_sequences=True)),
    layers.Reshape((-1, 32, 512)),
    layers.Conv2D(80, 1, padding="SAME"),
    layers.Softmax(-1)
])

print(model.summary())

model.compile(tf.optimizers.RMSprop(0.001), ctc_cost)

错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError:squeeze_dims[0] 不在 [0,0) 中。对于具有输入形状的“loss/softmax_loss/Squeeze”(操作:“Squeeze”):[]

型号:

Layer (type)                 Output Shape              Param #
=================================================================
conv2d (Conv2D)              (None, 32, 128, 32)       832
batch_normalization (BatchNo (None, 32, 128, 32)       128
activation (Activation)      (None, 32, 128, 32)       0
max_pooling2d (MaxPooling2D) (None, 16, 64, 32)        0
conv2d_1 (Conv2D)            (None, 16, 64, 64)        51264
batch_normalization_1 (Batch (None, 16, 64, 64)        256
activation_1 (Activation)    (None, 16, 64, 64)        0
max_pooling2d_1 (MaxPooling2 (None, 8, 32, 64)         0
conv2d_2 (Conv2D)            (None, 8, 32, 128)        73856
batch_normalization_2 (Batch (None, 8, 32, 128)        512
activation_2 (Activation)    (None, 8, 32, 128)        0
max_pooling2d_2 (MaxPooling2 (None, 8, 16, 128)        0
conv2d_3 (Conv2D)            (None, 8, 16, 128)        147584
batch_normalization_3 (Batch (None, 8, 16, 128)        512
activation_3 (Activation)    (None, 8, 16, 128)        0
max_pooling2d_3 (MaxPooling2 (None, 8, 8, 128)         0
conv2d_4 (Conv2D)            (None, 8, 8, 256)         295168
batch_normalization_4 (Batch (None, 8, 8, 256)         1024
activation_4 (Activation)    (None, 8, 8, 256)         0
max_pooling2d_4 (MaxPooling2 (None, 8, 4, 256)         0
reshape (Reshape)            (None, 32, 256)           0
bidirectional (Bidirectional (None, 32, 512)           1050624
bidirectional_1 (Bidirection (None, 32, 512)           1574912
reshape_1 (Reshape)          (None, None, 32, 512)     0
conv2d_5 (Conv2D)            (None, None, 32, 80)      41040     
softmax (Softmax)            (None, None, 32, 80)      0

这是我参考的 tensorflow 文档:

https://www.tensorflow.org/api_docs/python/tf/keras/backend/ctc_batch_cost

【问题讨论】:

【参考方案1】:

首先,input_length和label_length参数是什么?

input_length 是输入序列的时间步长。 label_length 是文本标签的长度。

例如,如果您尝试识别:

并且您在 32 个时间步中执行此操作,那么您的 input_length 是 32,而您的 label_length 是 12 (len("John Hancock"))。

该函数不应该已经从前两个参数(y_true 和 y_pred)的形状中知道 input_length 和 label_length 吗?

您通常分批处理输入数据,这些数据必须填充到批处理中的最大元素,因此这些信息会丢失。在您的情况下,input_length 始终相同,但 label_length 会有所不同。

例如,在处理语音识别时,input_length 也会有所不同。

其次,我需要对我的训练数据进行编码吗?这一切都是自动完成的吗?

不确定我是否理解您的要求,但这是用 Keras 编写的一个很好的示例:

https://keras.io/examples/image_ocr/

我知道 tensorflow 也有一个叫做 tf.keras.backend.ctc_decode 的函数。这仅在进行预测时使用吗?

一般来说,是的。你也可以尝试用它来做你早上的早餐,但它不是很擅长;)

【讨论】:

以上是关于如何在 keras 中使用 tensorflow ctc_batch_cost 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google colab 中更改 Keras/tensorflow 版本?

如何使用 Tensorflow 张量设置 Keras 层的输入?

如何在 Tensorflow 2.0 + Keras 中进行并行 GPU 推理?

如何在 keras 中使用 tensorflow ctc_batch_cost 函数?

如何在 Keras 模型中使用 TensorFlow 的采样 softmax 损失函数?

如何在 tensorflow 2.0 w/keras 中保存/恢复大型模型?