Tensorflow 中流式 F1 分数计算中的数据类型不匹配

Posted

技术标签:

【中文标题】Tensorflow 中流式 F1 分数计算中的数据类型不匹配【英文标题】:Data type mismatch in streaming F1 score calculation in Tensorflow 【发布时间】:2019-10-18 20:55:58 【问题描述】:

我试图在 Tensorflow 1.13.1 上使用 this code。但是,它会引发以下错误:

sherlock@mybox:~/cs273/autocat/bert$ python streaming2.py 
Traceback (most recent call last):
  File "streaming2.py", line 233, in <module>
    tf_f1 = tf_f1_score(t, p)
  File "streaming2.py", line 161, in tf_f1_score
    f1s[2] = tf.reduce_sum(f1 * weights)
  File "/home/sherlock/.virtualenvs/autocat/local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 812, in binary_op_wrapper
    return func(x, y, name=name)
  File "/home/sherlock/.virtualenvs/autocat/local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 1078, in _mul_dispatch
    return gen_math_ops.mul(x, y, name=name)
  File "/home/sherlock/.virtualenvs/autocat/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 5860, in mul
    "Mul", x=x, y=y, name=name)
  File "/home/sherlock/.virtualenvs/autocat/local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 547, in _apply_op_helper
    inferred_from[input_arg.type_attr]))
TypeError: Input 'y' of 'Mul' Op has type float64 that does not match type int64 of argument 'x'.

尝试修复演员表一段时间,但未能找到使代码正常工作的最小更改。谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

我可以重现您的错误:它发生在 Python 2 但不是 3。

所以要么切换到 Python 3,要么使用 tf.cast 更改代码

f1 = tf.cast(f1, tf.float64)
f1s[2] = tf.reduce_sum(f1 * weights)

也许在其他地方,但就是这样

【讨论】:

恐怕只投射f1 可能不正确。如果我没记错的话,f1 被计算为int 张量,所以在转换之前可能会出现截断错误。 我想知道为什么 Tensorflow 没有为如此常见的任务提供标准 API!

以上是关于Tensorflow 中流式 F1 分数计算中的数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Spark ML 感知器分类器的 F1 分数很高,而 TensorFlow 上的相同模型表现很差?

训练SSD后如何预测Precision、Recall和F1分数

使用 sklearn 计算 F1 分数

scikit加权f1分数计算及使用

使用 sklearn 计算宏 f1 分数

在 tf.Estimator 设置中使用 tf.metrics.precision/recall 计算 F1 分数