簡體   English   中英

Keras / Tensorflow計算批次的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM