Keras度量产生意外值

Keras度量产生意外值,keras,metric,Keras,Metric,在前一个问题的帮助下,我设计了以下IoU实现: def iou(y_pred_batch, y_true_batch): intersection = tf.zeros(()) union = tf.zeros(()) y_pred_batch = np.argmax(y_pred_batch, axis=-1) y_true_batch = np.argmax(y_true_batch, axis=-1) for i in range(num_class

在前一个问题的帮助下,我设计了以下IoU实现:

def iou(y_pred_batch, y_true_batch):
    intersection = tf.zeros(())
    union = tf.zeros(())
    y_pred_batch = np.argmax(y_pred_batch, axis=-1)
    y_true_batch = np.argmax(y_true_batch, axis=-1)
    for i in range(num_classes):
        iTensor = tf.to_int64(tf.fill(y_pred_batch.shape, i))
        intersection = tf.add(intersection, tf.to_float(tf.count_nonzero(tf.logical_and(K.equal(y_true_batch, y_pred_batch), K.equal(y_true_batch, iTensor)))))
        union = tf.add(union, tf.to_float(tf.count_nonzero(tf.logical_or(K.equal(y_true_batch, iTensor), K.equal(y_pred_batch, iTensor)))))
    return intersection/union
我使用以下行测试代码:

sess = tf.InteractiveSession()

y_true_batch = np.asarray([np.random.rand(imRows, imCols, num_classes) for i in range(2)])
y_pred_batch = np.asarray([np.random.rand(imRows, imCols, num_classes) for i in range(2)])

print (iou(y_true_batch, y_pred_batch).eval())
sess.close()
这将产生~0.02的值,这是随机初始化值的预期值。但是,当我在keras模型中使用此度量时,度量从第1纪元开始返回1.0000,这显然是错误的。我不知道这是为什么,如果有任何帮助,我将不胜感激。

刚刚更改了

np.argmax()

原因是当您使用np.argmax()计算时,没有创建张量,代码应该使用张量语言。 你需要在keras中执行张量运算

用于keras测试

y_true = np.asarray([np.random.rand(4,4, 4) for i in range(2)])
y_pred = np.asarray([np.random.rand(4, 4, 4) for i in range(2)])


iou_value = iou(
    K.variable(y_true),
    K.variable(y_pred),
).eval(session=K.get_session())
print('iou', iou)
y_true = np.asarray([np.random.rand(4,4, 4) for i in range(2)])
y_pred = np.asarray([np.random.rand(4, 4, 4) for i in range(2)])


iou_value = iou(
    K.variable(y_true),
    K.variable(y_pred),
).eval(session=K.get_session())
print('iou', iou)