我正在尝试计算mean_iou
并更新每个批次的混淆矩阵。但经过30个步骤,我得到了一个SIGKILL事件。我在我的生成器中使用的图像具有2048x1024的分辨率,因为我的batch_size是2.看来我在一步完成后无法释放内存。我在迭代所有图像时测试了发生器,但一切都运行良好。
我在GTX 1080上使用带有Tensorflow 1.4.1的Keras 2.1.2作为后端。如果有人有建议,那将是非常好的。
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)
答案 0 :(得分:2)
问题在于使用keras.backend
函数而不是numpy
函数。每次调用函数时 - 都会创建一个新的张量。不幸的是 - 对于tf
的当前实现 - 没有系统的张量垃圾收集 - 所以这使得内存完全错误。切换到numpy
解决了问题。