Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tensorflow mean_iou-如何获得一致的结果_Python_Tensorflow_Keras_Image Segmentation - Fatal编程技术网

Python tensorflow mean_iou-如何获得一致的结果

Python tensorflow mean_iou-如何获得一致的结果,python,tensorflow,keras,image-segmentation,Python,Tensorflow,Keras,Image Segmentation,我被tensorflow度量mean_iou()难住了。我尝试使用相同的数据会导致不一致的结果,我在任何地方都找不到有用的示例 这篇博文讨论了这个问题。。。但我不能用这里的想法来解决我的问题 最终目标是使用validation\u func(y\u true,y\u pred)将参数“metric”作为参数传递给Keras Model.compile()方法 最终目标 类似于 def my_iou(y_true, y_pred): num_classes = 2 score, updat

我被tensorflow度量mean_iou()难住了。我尝试使用相同的数据会导致不一致的结果,我在任何地方都找不到有用的示例

这篇博文讨论了这个问题。。。但我不能用这里的想法来解决我的问题

最终目标是使用
validation\u func(y\u true,y\u pred)
将参数“metric”作为参数传递给Keras Model.compile()方法

最终目标

类似于

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
  • 欠条类别1:7/9=0.778
  • 总体:平均值(借据0,借据1)=0.3889
资料

如果我用下面这样的东西进行模拟,我大部分时间都会得到预期的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是前景)


有关于为什么没有得到评论/答案的记录吗?我想这对所有的TensorFlow大师来说都是轻而易举的事。这是一个不恰当的问题吗?我面临着同样的问题。我认为,“weights”arg可以用来为后台类赋予0权重。因此,对于二进制情况,我认为[0.0,1.0]可能会起作用。当我使用我的桌面时,我也会尝试一下。
[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]
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