Keras/Tensorflow计算批次的平均值

2024-09-28 17:03:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试计算mean_iou,并为每个批次更新一个混淆矩阵。但走了30步,我就得到了一个标志性的事件。我在生成器中使用的图像的分辨率为2048x1024,因为我的批处理大小是2。一步完成后,我似乎无法释放记忆。我在迭代所有图像的同时测试了生成器,但一切正常。在

我使用Keras2.1.2和Tensorflow 1.4.1作为GTX1080的后端。如果有人能给我个建议那就太好了。在

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)

Tags: 图像truemodelconftfevalmasksteps
1条回答
网友
1楼 · 发布于 2024-09-28 17:03:59

问题在于使用keras.backend函数而不是numpy函数。每次调用函数时,都会创建一个新的张量。不幸的是,在tf的当前实现中,没有张量的系统垃圾收集,因此这导致内存完全错误。切换到numpy解决了这个问题。在

相关问题 更多 >