tf.nn.ctc_loss和pytorch.nn.CTCLoss有什么区别

时间:2019-08-05 16:02:28

标签: tensorflow machine-learning neural-network pytorch ctc

对于相同的输入和标签:

  • private Configuration getRedisConfiguration(int database) { ConfigurationBuilder cb = new ConfigurationBuilder(); cb.persistence() .passivation(false) .addStore(RedisCacheStoreConfigurationBuilder.class) .ignoreModifications(false) .fetchPersistentState(false) .purgeOnStartup(false) .preload(false) .shared(true) .addProperty("host", System.getenv("REDIS_HOST")) .addProperty("port", System.getenv("REDIS_PORT")) .addProperty("database", String.valueOf(database)); return cb.build(); } 的输出为5.74,
  • RedisCacheStoreConfigurationBuilder的输出为129.69,
  • 但是org.keycloak.models.sessions.infinispan的输出是4.86

那么pytorch.nn.CTCLosstf.nn.ctc_loss有什么区别?

math.log(tf ctc loss)

我尝试过这些:

  1. pytorch.nn.CTCLoss输入,然后将其发送到tf.nn.ctc_loss

  2. tf: 1.13.1 pytorch: 1.1.0 输入,然后将其发送到log_softmax

  3. 直接将输入发送到pytorch.nn.CTCLoss

  4. 直接将输入发送到tf.nn.log_softmax,然后tf.nn.ctc_loss

在情况2,情况3和情况4中,计算结果与tf.nn.ctc_loss的差异

tf.nn.ctc_loss

我希望math.log(output of tf.nn.ctc_loss)的输出与pytorch.nn.CTCLoss的输出相同,但实际上它们并不相同,但是我如何使它们相同?

1 个答案:

答案 0 :(得分:1)

pytorch的CTCLoss的自动均值减少与计算所有单个损失,然后进行均值计算(如您在Tensorflow实现中所做的一样)不同。确实来自CTCLoss(pytorch)的文档:

``'mean'``: the output losses will be divided by the target lengths and
            then the mean over the batch is taken.

要获得相同的值:

1-将归约方法更改为:

ctc_loss = nn.CTCLoss(reduction='sum')

2-除以batch_size计算的损失:

loss = ctc_loss(x.log_softmax(2).detach(), y, x_lengths, y_lengths)
loss = (loss.item())/batch_size

3-将Tensorflow的参数ctc_merge_repeated更改为True(我假设在pytorch CTC中也是这种情况)

    ctclosses = tf.nn.ctc_loss(
    y,
    tf.cast(x, dtype=tf.float32),
    x_len,
    preprocess_collapse_repeated=False,
    ctc_merge_repeated=True,
    ignore_longer_outputs_than_inputs=False
)

您现在将在热释流损失和张量流损失之间获得非常接近的结果(无需获取值的对数)。剩下的微小差异可能是由于实现之间的细微差异。 在我的最后三个运行中,我得到了以下值:

pytorch loss : 113.33 vs tf loss = 113.52
pytorch loss : 116.30 vs tf loss = 115.57
pytorch loss : 115.67 vs tf loss = 114.54