Tensorflow 机器学习CTC丢失日志概率

Tensorflow 机器学习CTC丢失日志概率,tensorflow,machine-learning,keras,conv-neural-network,ctc,Tensorflow,Machine Learning,Keras,Conv Neural Network,Ctc,我有一个经过训练的CRNN模型,应该可以从图像中识别文本。 这真的很有效,到目前为止还不错 我的输出是一个CTC丢失层,我用tensorflow函数keras.backend.CTC_decode对其进行解码,正如文档所说(),它返回一个带有解码结果的元组,以及一个带有预测对数概率的张量 通过对模型进行一些测试,我得到了以下结果: True value: test0, prediction: test0, log_p: 1.841524362564087 True value: test1, p

我有一个经过训练的
CRNN
模型,应该可以从图像中识别文本。 这真的很有效,到目前为止还不错

我的输出是一个CTC丢失层,我用tensorflow函数
keras.backend.CTC_decode
对其进行解码,正如文档所说(),它返回一个带有解码结果的
元组,以及一个带有预测对数概率的
张量

通过对模型进行一些测试,我得到了以下结果:

True value: test0, prediction: test0, log_p: 1.841524362564087
True value: test1, prediction: test1, log_p: 0.9661365151405334
True value: test2, prediction: test2, log_p: 1.0634151697158813
True value: test3, prediction: test3, log_p: 2.471940755844116
True value: test4, prediction: test4, log_p: 1.4866207838058472
True value: test5, prediction: test5, log_p: 0.7630811333656311
True value: test6, prediction: test6, log_p: 0.35642576217651367
True value: test7, prediction: test7, log_p: 1.5693446397781372
True value: test8, prediction: test8, log_p: 0.9700028896331787
True value: test9, prediction: test9, log_p: 1.4783780574798584

预测总是正确的。然而,我认为它的概率似乎不是我所期望的。它们看起来像完全随机的数字,甚至比1或2还要大!我做错了什么???

好吧,我猜你把概率和对数概率混在一起了。虽然你的直觉是正确的,但概率值高于或低于
0-1
都会很奇怪。然而,你的函数并没有给出概率,而是对数概率,它实际上只是对数标度中的概率。所以你的模特一切都很好

如果您想知道为什么我们使用日志概率而不是概率本身,那么它主要与缩放问题有关,但是,您可以阅读线程

将日志概率更改为实际概率的示例:
我的代码中的简短示例:

predictions, log_probabilities = keras.backend.ctc_decode(pred, input_length=input_len, greedy=False,top_paths=5)
The Log-probabilites are:  tf.Tensor([-0.00242825 -6.6236324  -7.3623376  -9.540713   -9.54832   ], shape=(5,), dtype=float32)


probabilities = tf.exp(log_probabilities)
The probabilities are:  tf.Tensor([0.9975747  0.0013286  0.00063471 0.00007187 0.00007132], shape=(5,), dtype=float32)
这里我认为重要的是,当使用参数
greedy=True
时,返回的
log\u概率是正的,因此需要对其进行否定

本质上,
beam\u search
beam\u width
为1相当于贪婪搜索。然而,以下两种方法给出的结果不同:

predictions_beam, log_probabilities_beam = keras.backend.ctc_decode(pred, input_length=input_len, greedy=False,top_paths=1)
vs


从某种意义上说,后者总是返回一个正对数,因此,有必要在
np.exp(log\u概率)/tf.exp(log\u概率)
之前对其进行否定。然而,我不明白如何解释这些数字。我是说对数概率2.4比0.97好吗?对数概率函数的范围是什么?回答你关于解释的问题,对数概率越高越好。但是,只需获取这些日志概率的指数(
np.exp()
),就可以将日志概率转换为实际概率(我在上面的答案中添加了一个示例)。如果它回答了您的问题,请告诉我。再次感谢,但在您的情况下,您使用了负数。我得到的总是正的,通过使用np.exp()来反转,我得到的结果超出[0,1]概率范围。你是对的,在我看来,这些都是“负”对数概率,因为你所有的值都是正的,如果你看
log(x)
图,你会在[0-1]区间中看到函数值是负的,因此,在您的情况下,它应该是
-log(x)
。因此,要将这些转化为概率,只需在指数中添加一个“负”符号(如
np.exp(-x)
),这应该是可行的。我一直在研究这个问题,这是一个有趣的现象。对于贪婪搜索,返回的日志概率始终为正整数。对于beam搜索,比如beam_width=5,返回的数字都是负数,因此np.exp(x)很容易返回良好的概率,介于0和1之间。
predictions_beam, log_probabilities_beam = keras.backend.ctc_decode(pred, input_length=input_len, greedy=False,top_paths=1)
predictions_greedy, log_probabilities_greedy = keras.backend.ctc_decode(pred, input_length=input_len, greedy=True)