AttributeError: у объекта 'Tensor' нет атрибута 'numpy' в Tensorflow 2.1 - PullRequest
2 голосов
/ 22 февраля 2020

Я пытаюсь преобразовать shape свойство Tensor в Tensorflow 2.1 и получаю эту ошибку:

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

Я уже проверил, что вывод tf.executing eagerly() равен True ,

Немного контекста: я загружаю tf.data.Dataset из TFRecords, затем применяю map. Функция отображения пытается преобразовать свойство shape одного из образцов набора данных Tensor в 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() приводит к тому же поведению в трансформере и кодде чуть выше.

Я проверил тип img_shape, и он <class 'tensorflow.python.framework.ops.Tensor'>.

Кто-нибудь решил эту проблему в новых версиях Tensorflow?

1 Ответ

2 голосов
/ 24 февраля 2020

Проблема в вашем коде в том, что вы не можете использовать .numpy() внутри функций, которые отображаются на tf.data.Datasets, потому что. numpy() - это Python код, не чистый код TensorFlow.

Когда вы используете такая функция, как my_dataset.map(my_function), вы можете использовать только функции tf.* внутри вашей функции my_function.

Это не ошибка версий TensorFlow 2.x, а скорее о том, как графы stati c генерируется за кулисами для повышения производительности.

Если вы хотите использовать собственный код Python внутри функции, которую вы отображаете в наборе данных, вы должны использовать https://www.tensorflow.org/api_docs/python/tf/py_function. В действительности нет другого способа смешать код Python и код TensorFlow при отображении в набор данных.

Вы также можете обратиться к этому вопросу для получения дополнительной информации; это точный вопрос, который я задавал пару месяцев go: Есть ли альтернатива tf.py_function () для пользовательского Python кода?

...