属性错误: 'Tensor'对象没有属性'tensor_shape'



我正在使用以下代码和平从张量图像或图像中获得边缘映射,但我正在获得错误,我们如何解决它?我使用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()

相关内容

  • 没有找到相关文章

最新更新