我正在尝试将多个tf.write_file操作合并到一个操作中,以在单个Session.run()调用中保存一批图像,但是没有运气。
此代码:
r = tf.range(tf.shape(images)[0])
crops = tf.image.crop_and_resize(images, boxes, r, [160, 160])
crops = tf.image.convert_image_dtype(crops, dtype=tf.uint8)
def write_ith_image(i):
nonlocal out_file_tensor, crops
encoded_image = tf.image.encode_jpeg(crops[i])
return tf.write_file(out_file_tensor[i], encoded_image)
encode_all = tf.map_fn(write_ith_image, r)
导致:
TypeError: Can't convert Operation 'map/while/WriteFile' to Tensor (target dtype=None, name='value', as_ref=False)
tf.while_loop
给出相似的结果。有没有办法将张量映射到可以在单个tf.Session.run()调用中执行的一组操作?为什么这适用于张量,但不适用于具有副作用的操作?
答案 0 :(得分:2)
您可以返回一个虚拟值。
def write_ith_image(i):
nonlocal out_file_tensor, crops
encoded_image = tf.image.encode_jpeg(crops[i])
with tf.control_dependencies([tf.write_file(out_file_tensor[i], encoded_image)]):
dummy = tf.constant([0])
return dummy
encode_all = tf.map_fn(write_ith_image, r)
不漂亮,但是可以完成工作。
使用tf.while_loop
可以使您满意一些(没有伪值),但这会更冗长,而且效率可能更高。