tf.data流水线实现PIL负坐标裁剪时符号张量转numpy报错求解
问题1:报错解决方法
报错根因
tf.data的map方法默认会将传入的预处理函数转换为TensorFlow静态计算图执行,图模式下所有输入都是没有实际数值的符号张量,无法传入Numpy函数执行计算。你遇到的报错触发自tf.zeros的内部逻辑:旧版本TensorFlow创建零张量时会调用np.prod(shape)判断张量大小,你传入的shape参数包含动态符号张量(如复现代码里的number、你完整代码里的body_size),Numpy无法处理符号张量,因此抛出错误。
另外你的实现代码还存在两个隐性问题:
tf.image.crop_to_bounding_box的第三个参数是裁剪高度,你误写为crop_br[0] - crop_tl[1],正确应为crop_br[0] - crop_tl[0]- 普通TensorFlow张量是不可变对象,不能直接使用
assign方法做切片赋值,需要使用可变的tf.Variable或张量更新算子。
修复方案
推荐用更高效的tf.pad+tf.slice组合实现你要的带负坐标自动补零的裁剪功能,完全避开动态零张量创建和切片赋值的问题,性能远高于手动分配张量赋值:
def _crop(self, img, center, body_size, res): tl = tf.cast(center - body_size/2, dtype=tf.int32) br = tf.cast(center + body_size/2, dtype=tf.int32) height, width = tf.shape(img)[0], tf.shape(img)[1] # 计算需要给原图上下左右补的零的行数/列数 pad_top = tf.maximum(-tl[0], 0) pad_left = tf.maximum(-tl[1], 0) pad_bottom = tf.maximum(br[0] - height, 0) pad_right = tf.maximum(br[1] - width, 0) # 给原图补零 padded_img = tf.pad(img, [ [pad_top, pad_bottom], [pad_left, pad_right], [0, 0] ], constant_values=0) # 计算补零后图上的裁剪坐标 crop_tl_y = tl[0] + pad_top crop_tl_x = tl[1] + pad_left # 裁剪得到指定大小的图像 cropped_img = tf.image.crop_to_bounding_box( padded_img, offset_height=crop_tl_y, offset_width=crop_tl_x, target_height=body_size, target_width=body_size ) return tf.image.resize(cropped_img, (res, res))
如果确实需要创建动态shape的零张量,把tf.zeros(shape)替换为tf.fill(tf.cast(shape, tf.int32), 0.0)即可避开内部Numpy调用,切片赋值改用tf.tensor_scatter_nd_update算子实现。
问题2:为什么tf.data流水线必须用TensorFlow原生函数才能发挥全部特性
TensorFlow的tf.data和PyTorch的DataLoader底层设计逻辑完全不同:
- PyTorch
DataLoader默认采用Python多进程架构,每个进程独立执行Python侧的预处理逻辑,本质还是运行普通Python代码,因此支持任意Python库调用,代价是Python GIL锁、进程间通信开销大,无法利用图优化、跨设备执行等特性。 - TensorFlow
tf.data默认采用静态图执行模式,会把整个数据预处理流水线编译成一张独立的计算图,所有操作都在TensorFlow Runtime内部执行,不需要频繁切换回Python解释器,因此可以支持自动预取、算子融合、GPU/TPU offload、分布式训练等高级优化特性。如果使用非TensorFlow原生的Python函数,会强制打断图执行流程,每次处理数据都要在TensorFlow Runtime和Python解释器之间切换,性能会下降10~100倍不等,同时丢失大部分高级优化特性。
如果确实需要在tf.data中使用自定义Python逻辑,可以用tf.py_function包裹函数,但该方法仅适合调试使用,生产环境会大幅降低性能且不支持序列化、分布式训练。
内容的提问来源于stack exchange,提问作者benjs
相关产品推荐
相关产品推荐

