Tensorflow CTC损耗的填充标签?

问题描述 投票:1回答:1

我想填充我的标签,以便它们具有相同的长度以传递到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)
tensorflow
1个回答
1
投票

这是我如何做到的。我有一个密集的张量labels,包括填充-1,以便批处理中的所有目标具有相同的长度。然后我用

labels_sparse = dense_to_sparse(labels, sparse_val=-1)

哪里

def dense_to_sparse(dense_tensor, sparse_val=0):
    """Inverse of tf.sparse_to_dense.

    Parameters:
        dense_tensor: The dense tensor. Duh.
        sparse_val: The value to "ignore": Occurrences of this value in the
                    dense tensor will not be represented in the sparse tensor.
                    NOTE: When/if later restoring this to a dense tensor, you
                    will probably want to choose this as the default value.
    Returns:
        SparseTensor equivalent to the dense input.
    """
    with tf.name_scope("dense_to_sparse"):
        sparse_inds = tf.where(tf.not_equal(dense_tensor, sparse_val),
                               name="sparse_inds")
        sparse_vals = tf.gather_nd(dense_tensor, sparse_inds,
                                   name="sparse_vals")
        dense_shape = tf.shape(dense_tensor, name="dense_shape",
                               out_type=tf.int64)
        return tf.SparseTensor(sparse_inds, sparse_vals, dense_shape)

这会产生标签的稀疏张量,这是您需要投入到ctc损失中的。也就是说,你调用tf.nn.ctc_loss(labels=labels_sparse, ...)填充(即在密集张量中所有值等于-1)根本没有在这个稀疏张量中表示。

© www.soinside.com 2019 - 2024. All rights reserved.