Python tensorflow mean_iou-如何获得一致的结果
我被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
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-背景
- iou类别0:0/2=0
- 欠条类别1:7/9=0.778
- 总体:平均值(借据0,借据1)=0.3889
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