TensorFlow中tf.control_dependencies报错:无法将列表转为Tensor/Operation
嘿,问题一眼就能看出来——你传给crop函数的第一个参数Image是普通Python嵌套列表,不是TensorFlow的Tensor对象!
为什么会触发这个报错?
tf.control_dependencies()的依赖列表里只能放TensorFlow的Operation或者Tensor对象,而你传入的images是原生Python列表,TensorFlow没办法把它转换成合法的依赖项,这就是报错的直接原因。
你看你的输入定义:
Image =[[[[1, 1, 1,1], [2, 2, 2,2]], [[3,3, 3, 3], [4,4, 4, 4]]]]
这只是个Python数据结构,没有被转换成TF Tensor。虽然crop函数里前面的tf.shape(images)这类操作能勉强通过隐式转换处理,但到tf.control_dependencies这里会严格检查类型,直接抛出错误。
解决方案(不用修改crop函数)
只需要把Image转换成TensorFlow的Tensor就行,修改你的输入部分:
# 把原来的Image列表改成TF常量Tensor Image = tf.constant([[[[1, 1, 1,1], [2, 2, 2,2]], [[3,3, 3, 3], [4,4, 4, 4]]]], dtype=tf.float32)
这样传入crop的就是合法的TF Tensor了,tf.control_dependencies([assert_op, images, batch_inds])里的每个元素都是TF认可的类型,报错就会消失。
额外小提醒(可选,因为你不想改crop函数)
顺带提一句,你crop函数里的boxes处理逻辑有点奇怪:先把boxesreshape成[-1,4],又立刻reshape成[-1,2],这会把原本的[x1,y1,x2,y2]拆成两两一组,可能不符合tf.image.crop_and_resize对boxes的格式要求(它需要每个box是[y1, x1, y2, x2]且值是归一化后的0-1范围)。不过既然你明确不想修改crop函数,那先解决当前的类型报错再说~
内容的提问来源于stack exchange,提问作者Go Go Gadget 2

