![](/img/trans.png)
[英]Can I let mean_iou depend on update_op? Both of them are returned by tf.metrics.mean_iou()
[英]Keras/Tensorflow calculate mean_iou for batches
我正在嘗試計算mean_iou
並為每個批次更新一個混淆矩陣。 但是經過30個步驟后,我得到了SIGKILL事件。 由於我的batch_size為2,因此我在生成器中使用的圖像的分辨率為2048x1024。似乎一步完成后,我無法釋放內存。 我在遍歷所有圖像時測試了生成器,但是一切正常。
我將Keras 2.1.2和Tensorflow 1.4.1用作GTX 1080的后端。如果有人提出建議,那將非常好。
def calculate_iou_tf(model, generator, steps, num_classes):
conf_m = K.tf.zeros((num_classes, num_classes), dtype=K.tf.float64)
generator.reset()
pb = Progbar(steps)
for i in range(0, steps):
x, y_true = generator.next()
y_pred = model.predict_on_batch(x)
# num_classes = K.int_shape(y_pred)[-1]
y_pred = K.flatten(K.argmax(y_pred, axis=-1))
y_true = K.reshape(y_true, (-1,))
mask = K.less_equal(y_true, num_classes - 1)
y_true = K.tf.to_int32(K.tf.boolean_mask(y_true, mask))
y_pred = K.tf.to_int32(K.tf.boolean_mask(y_pred, mask))
mIoU, up_op = K.tf.contrib.metrics.streaming_mean_iou(y_pred, y_true, num_classes, updates_collections=[conf_m])
K.get_session().run(K.tf.local_variables_initializer())
with K.tf.control_dependencies([up_op]):
score = K.eval(mIoU)
print(score)
pb.update(i + 1)
conf_m = K.eval(conf_m)
return conf_m, K.eval(mIoU)
問題在於使用keras.backend
函數而不是numpy
函數。 每次調用函數時,都會創建一個新的張量。 不幸的是-在當前的tf
實現中-沒有系統的張量垃圾回收-因此這使內存已滿錯誤。 切換到numpy
解決了這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.