属性错误:在Tensorflow 2.1中,"Tensor"对象没有属性"numpy"

nfeuvbwi  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(172)

我尝试在Tensorflow 2.1中转换Tensorshape属性,但遇到以下错误:

AttributeError: 'Tensor' object has no attribute 'numpy'

我已经检查了tf.executing eagerly()的输出是True
一点背景:我从TFRecords中加载了一个tf.data.Dataset,然后应用了一个map。Map函数试图将数据集示例Tensorshape属性转换为numpy:

def _parse_and_decode(serialized_example):
    """ parse and decode each image """
    features = tf.io.parse_single_example(
        serialized_example,
        features={
            'encoded_image': tf.io.FixedLenFeature([], tf.string),
            'kp_flat': tf.io.VarLenFeature(tf.int64),
            'kp_shape': tf.io.FixedLenFeature([3], tf.int64),
        }
    )
    image = tf.io.decode_png(features['encoded_image'], dtype=tf.uint8)
    image = tf.cast(image, tf.float32)

    kp_shape = features['kp_shape']

    kp_flat = tf.sparse.to_dense(features['kp_flat'])
    kp = tf.reshape(kp_flat, kp_shape)

    return image, kp

def read_tfrecords(records_dir, batch_size=1):
    # Read dataset from tfrecords
    tfrecords_files = glob.glob(os.path.join(records_dir, '*'))
    dataset = tf.data.TFRecordDataset(tfrecords_files)
    dataset = dataset.map(_parse_and_decode, num_parallel_calls=batch_size)
    return dataset

def transform(img, labels):
    img_shape = img.shape  # type: <class 'tensorflow.python.framework.ops.Tensor'>`
    img_shape = img_shape.numpy()  # <-- Throws the error
    # ...    

dataset = read_tfrecords(records_dir)

这将抛出错误:

dataset.map(transform, num_parallel_calls=1)

虽然这是完美的工作:

for img, labels in dataset.take(1):
    print(img.shape.numpy())
  • 编辑:* 尝试访问img.numpy()而不是img.shape.numpy()会导致上面的转换器和codde出现相同的行为。

我检查了img_shape的类型,它是<class 'tensorflow.python.framework.ops.Tensor'>
有没有人在新版Tensorflow中解决了这类问题?

y1aodyip

y1aodyip1#

代码中的问题是,您无法在Map到tf.data.Datasets的函数中使用.numpy(),因为. numpy()是Python代码,而不是纯TensorFlow代码。
当使用my_dataset.map(my_function)这样的函数时,只能在my_function函数中使用tf.*函数。
这不是TensorFlow 2.x版本的错误,而是出于性能目的在后台生成静态图的方式。
如果你想在Map到数据集的函数中使用自定义Python代码,你必须使用tf.py_function(),docs:https://www.tensorflow.org/api_docs/python/tf/py_function。在数据集上Map时,确实没有其他方法可以混合Python代码和TensorFlow代码。
您也可以参考此问题以获取更多信息;这正是我几个月前问的问题Is there an alternative to tf.py_function() for custom Python code?

nnvyjq4y

nnvyjq4y2#

为了进一步扩展Timbus Calin的答案,下面是一个使用tf.py_function()的用例实现示例。保持现有的转换函数不变,您应该像这样更改dataset.map

dataset.map(lambda img, labels: tf.py_function(transform, 
                                               inp=[img, labels], 
                                               Tout=[tf.float64, tf.float32]))

根据数据更改Tout中的输出类型。

相关问题