gpt4 book ai didi

tensorflow - Tensorflow CTC 损失的填充标签?

转载 作者:行者123 更新时间:2023-12-03 23:16:57 27 4
gpt4 key购买 nike

我想填充我的标签,以便它们具有相同的长度以传递给 ctc_loss 函数。显然,-1 是不允许的。如果我要应用填充,填充值是否应该成为 ctc 标签的一部分?

更新

我有这段代码将密集标签转换为稀疏标签,以传递给我认为与问题有关的 ctc_loss 函数。

def dense_to_sparse(dense_tensor, out_type):
indices = tf.where(tf.not_equal(dense_tensor, tf.constant(0, dense_tensor.dtype)
values = tf.gather_nd(dense_tensor, indices)
shape = tf.shape(dense_tensor, out_type=out_type)
return tf.SparseTensor(indices, values, shape)

最佳答案

其实,-1允许值存在于 y_truectc_batch_cost 的论据有一个限制 - 它们不应出现在 label_length 指定的实际标签“内容”中。 (这里 i -th 标签“内容”将从索引 0 开始并在索引 label_length[i] 结束)。

所以用 -1 填充标签是完全没问题的。以便它们的长度相同,如您所愿。您唯一需要注意的是正确计算并通过相应的label_length值。

这是示例代码,它是 test_ctc 的修改版本unit test from keras :

import numpy as np
from tensorflow.keras import backend as K

number_of_categories = 4
number_of_timesteps = 5

labels = np.asarray([[0, 1, 2, 1, 0], [0, 1, 1, 0, -1]])
label_lens = np.expand_dims(np.asarray([5, 4]), 1)

# dimensions are batch x time x categories
inputs = np.zeros((2, number_of_timesteps, number_of_categories), dtype=np.float32)
input_lens = np.expand_dims(np.asarray([5, 5]), 1)

k_labels = K.variable(labels, dtype="int32")
k_inputs = K.variable(inputs, dtype="float32")
k_input_lens = K.variable(input_lens, dtype="int32")
k_label_lens = K.variable(label_lens, dtype="int32")

res = K.eval(K.ctc_batch_cost(k_labels, k_inputs, k_input_lens, k_label_lens))

即使使用 -1 也能正常运行作为(第二个)的最后一个元素 labels序列因为对应 label_lens item (second) 指定其长度为 4。

如果我们将其更改为 5 或者将其他标签值更改为 -1然后我们有 All labels must be nonnegative integers你提到的异常(exception)。但这仅仅意味着我们的 label_lens是无效的。

关于tensorflow - Tensorflow CTC 损失的填充标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49063938/

27 4 0