Tensorflow 2 - OperatorNotAllowedInGraphError: использование `tf.Tensor` в качестве Python` bool` запрещено: AutoGraph отключен в этой функции - PullRequest
1 голос
/ 17 апреля 2020

Я пишу функцию отображения для набора данных в Tensorflow 2. Набор данных содержит несколько изображений и соответствующие метки, более конкретно, есть только три возможных значения для меток, 13, 17 и 34. Предполагается, что функция отображения возьмите метки и преобразуйте их в категориальные метки.

Возможно, есть более эффективные способы реализации этой функции (пожалуйста, не стесняйтесь предлагать), но это моя реализация:

def map_labels(dataset):

    def convert_labels_to_categorical(image, labels):
        labels = [1.0, 0., 0.] if labels == 13 else [0., 1.0, 0.] if labels == 17 else [0., 0., 1.0]

        return image, labels

        categorical_dataset = dataset.map(convert_labels_to_categorical)

    return categorical_dataset

Основное проблема в том, что я получаю сообщение об ошибке ниже:

OperatorNotAllowedInGraphError: using a `tf.Tensor` as a Python `bool` is not allowed: AutoGraph is disabled in this function. Try decorating it directly with @tf.function.

Я действительно понятия не имею, что означает эта ошибка, и в inte rnet не так много других источников, документирующих ту же ошибку. Есть идеи?

EDIT (новая нерабочая реализация):

def map_labels(dataset):

    def convert_labels_to_categorical(image, labels):
        labels = tf.Variable([1.0, 0., 0.]) if tf.reduce_any(tf.math.equal(labels, tf.constant(0,dtype=tf.int64))) \
        else tf.Variable([0., 1.0, 0.]) if tf.reduce_any(tf.math.equal(labels, tf.constant(90,dtype=tf.int64))) \
        else tf.Variable([0., 0., 1.0])

        return image, labels

    categorical_dataset = dataset.map(convert_labels_to_categorical)

    return categorical_dataset

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Я нашел рабочее решение. Сначала я создал словарь, а затем набор данных:

dictionary = {"data":data, "labels":labels.astype('int32')}
dataset = tf.data.Dataset.from_tensor_slices(dict(dictionary))

Это позволяет мне легко получить доступ к данным и меткам внутри набора данных. Могут быть и другие способы, которые не требуют использования словаря, но этот работает для меня. Для отображения я использовал:

def map_labels(dataset):

    def convert_labels_to_categorical(dataset):
        if dataset['labels'] ==  tf.constant(13):
            dataset['labels'] = tf.constant([1, 0, 0]) 

        elif dataset['labels'] == tf.constant(17):
            dataset['labels'] =  tf.constant([0, 1, 0])

        elif dataset['labels'] == tf.constant(34):
            dataset['labels'] = tf.constant([0, 0, 1])

        return dataset

    categorical_dataset = dataset.map(convert_labels_to_categorical)

    return categorical_dataset

После отображения набора данных, если я проверяю его с помощью categorical_dataset.element_spec, я получаю:

{'data': TensorSpec(shape=(32, 32, 3), dtype=tf.uint8, name=None), 'labels': TensorSpec(shape=(None,), dtype=tf.int32, name=None)}

, и если я печатаю элементы, новый категориальные метки правильно назначены соответствующему изображению. Таким образом, == и = все еще работают для переменных tf.

0 голосов
/ 17 апреля 2020

Ваша проблема связана с тем, что вы смешиваете Python код с кодом TensorFlow.

Практически, в вашей функции map вы используете произвольный код Python, и не только оптимизированный TensorFlow. код .

В функции map вы можете использовать только функции, относящиеся к категории tf *. Если вы все еще хотите использовать произвольный код Python, вам нужно использовать библиотеку tf.py_function().

Возможно, вы захотите обратиться к этой теме, чтобы получить лучший обзор:

Есть ли альтернатива tf.py_function () для пользовательского Python кода?

Чтобы решить вашу проблему, вам нужно исключительно использовать функции из модуля tf , такие как tf.strings, tf.bool et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...