如何得到一致的结果

2024-09-28 05:15:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我被张量流度量平均值_iou()难住了。我尝试使用会导致相同数据的结果不一致,而且我在任何地方都找不到有用的示例。在

这篇博文讨论了这个问题。。。但我不能用这里的想法来解决我的问题。http://ronny.rest/blog/post_2017_09_11_tf_metrics/

最终目标是使用validation_func(y_true, y_pred)作为参数'metric'传递给Keras模型.编译()方法。在

最终目标

像是。。。在

def my_iou(y_true, y_pred):
  num_classes = 2
  score, update_op = tf.metrics.mean_iou(tf.argmax(y_true, axis=3), tf.argmax(y_pred, axis=3), num_classes)
  K.get_session().run(tf.local_variables_initializer())
  # K.get_session().run(tf.global_variables_initializer())
  with tf.control_dependencies([update_op]):
    final_score = tf.identity(score)
  return final_score

虚拟数据

  • 尺寸为:(批次、高度、宽度、数量级)
  • 类1-前景对象;我要分割的对象
  • 0级-背景

我真正关心的是一班的借据。在这种情况下,应为7/9=0.778。但我希望这篇文章能说出的是每堂课的平均借据。。。在

  • iou等级0:0/2=0
  • iou等级1:7/9=0.778
  • 总体:平均值(借据0,借据1)=0.3889

数据

^{pr2}$

如果我用下面这样的东西来模拟,大多数时候我得到预期的0.3889。。。但我偶尔也会得到3.5或0.0,我不知道为什么?在

results = []
for i in range(20):
  with tf.Session() as sess:
    y_t = tf.convert_to_tensor(y_true)
    y_p = tf.convert_to_tensor(y_pred)
    results.append(my_iou(y_t, y_p).eval())

最近的跑步

[0.3888889,
 0.3888889,
 0.3888889,
 0.3888889,
 3.5,
 0.3888889,
 0.3888889,
 0.3888889,
 0.3888889,
 0.3888889,
 0.3888889,
 0.3888889,
 0.3888889,
 3.5,
 0.3888889,
 0.3888889,
 0.3888889,
 3.5,
 0.3888889,
 0.3888889]

有什么帮助吗?在

编辑

现在我使用的是硬编码的二进制分类,但我不喜欢它。不可概括,可能太简单,也可能完全错误。(同样值得注意的是。。。在这段代码中,类0是前景,与我的示例设置不同,类1是前景)

def my_iou_binary(self, y_true, y_pred):
  yt0 = y_true[:,:,:,0]
  yp0 = K.cast(y_pred[:,:,:,0] > 0.5, 'float32')

  inter = tf.count_nonzero(tf.logical_and(tf.equal(yt0, 1), tf.equal(yp0, 1)))
  union = tf.count_nonzero(tf.add(yt0, yp0))
  iou = tf.where(tf.equal(union, 0), 1., tf.cast(inter/union, 'float32'))

  return iou

Tags: 数据true示例mytfequalmetrics平均值

热门问题