Keras 指标产生意外值
Keras metric produces unexpected values
在上一个问题的帮助下,我设计了以下 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 模型中使用这个指标时,指标 returns 1.0000 从 epoch 1 开始,这显然是错误的。我不知道这是为什么,我们将不胜感激。
刚刚更改了
np.argmax()
至
from keras import backend as K
K.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)
在上一个问题的帮助下,我设计了以下 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 模型中使用这个指标时,指标 returns 1.0000 从 epoch 1 开始,这显然是错误的。我不知道这是为什么,我们将不胜感激。
刚刚更改了
np.argmax()
至
from keras import backend as K
K.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)