我正在使用以下代码和平从张量图像或图像中获得边缘映射,但我正在获得错误,我们如何解决它?我使用TensorFlow 2.4版本和python 3.7版本。
使用代码:
image_GT = [image_GT]
aperture_size = 7
t_lower = 0 # Lower Threshold
t_upper = 1
print("image_GT[0].shape: ", image_GT[0].shape)
image = image_GT[0][0]
print("type(image): ", type(image))
print("image.shape: ", image.shape)
image = tf.make_ndarray(image)
image = cv2.Canny(image, t_lower, t_upper, apertureSize=aperture_size)
输出错误:
image_GT[0].shape: (16, 256, 256, 3)
type(image): <class 'tensorflow.python.framework.ops.Tensor'>
image.shape: (256, 256, 3)
/Code/aiisp_base.py:962 calc_losses_EdgeNet1 *
image = tf.make_ndarray(image)
/usr/local/lib/python3.7/site-packages/tensorflow/python/framework/tensor_util.py:597 MakeNdarray **
shape = [d.size for d in tensor.tensor_shape.dim]
AttributeError: 'Tensor' object has no attribute 'tensor_shape'
tf.make_ndarray
只接受TensorProto
作为输入,因此您需要将张量转换为tf.make_tensor_proto
image = tf.make_ndarray(tf.make_tensor_proto(image))
你可以只做image = image.numpy()
。
根据GitHub的javidcf(强调我的):
tf.make_ndarray
不是一个将张量转换为的一般函数NumPy数组(尽管有公认的误导性文档)函数可能会说)。它所做的就是转换aTensorProto
,它是a的低级二进制表示张量,变成NumPy数组。大多数典型的TensorFlow代码永远不会使用TensorProto
对象(直接),所以tf.make_ndarray
只是对大多数人来说不是一个有用的功能。这取决于具体情况用它从张量中构建NumPy数组是可能的,但是,再次强调,它的目的一般不是将张量转换为NumPy数组,并且它应该很少或永远不要使用。如果你想把TensorFlow张量转换成NumPy数组,你需要需要注意的是,TensorFlow代码可能运行在渴望模式或图形模式. 图形模式不那么"方便"使用,但对性能、优化、序列化等很重要的原因。虽然很少显式地进入图形模式库用户,编写在图形模式下运行的代码是很正常的,比如Keras模型中的代码。并非总是如此很容易知道代码运行的模式,尤其是因为TensorFlow的目标是对库用户隐藏这种复杂性,但复杂性仍然存在,理解这一点很重要它。
如果你在等待模式,你可以做
.numpy()
张量。图形模式但是,你不能获得NumPy数组对应于张量,因为张量不包含任何值特别是在图形模式中,但它们表达的是一种符号中间结果(有一些例外,如tf.constant
,其中可以转换为NumPy数组,即使在图形模式,因为它总是有相同的值)。如果你想做NumPy在图模式下对张量进行操作(事实并非如此在TensorFlow中可微分(顺便说一句),你需要暂时切换到<<strong>渴望模式/strong>图形模式,这可以通过tf.py_function
来实现。这里,你的张量是急切张量可以调用.numpy()