对于相同的输入和标签:
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.CTCLoss
和tf.nn.ctc_loss
有什么区别?
math.log(tf ctc loss)
我尝试过这些:
pytorch.nn.CTCLoss
输入,然后将其发送到tf.nn.ctc_loss
,
tf: 1.13.1
pytorch: 1.1.0
输入,然后将其发送到log_softmax
直接将输入发送到pytorch.nn.CTCLoss
直接将输入发送到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
的输出相同,但实际上它们并不相同,但是我如何使它们相同?
答案 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