Tensorflow 2-OperatorNotAllowedInGraphError:不允许将`tf.Tensor`用作Python`bool`:此功能禁用了AutoGraph

时间:2020-04-17 15:34:21

标签: tensorflow2.0 tensorflow-datasets tensorflow2.x

我正在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.

我真的不知道此错误的含义,并且互联网上没有太多其他文献记录相同的错误。有想法吗?

编辑(新的无效实施):

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 个答案:

答案 0 :(得分:1)

我找到了可行的解决方案。首先,我创建了一个字典,然后创建了数据集:

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变量。

答案 1 :(得分:0)

您的问题来自将Python代码与TensorFlow代码混合在一起的事实。

实际上,在您的map函数中,您使用任意的Python代码,而不是专门优化的TensorFlow代码

地图功能中,您只能使用属于 tf * 类别的功能。如果您仍然想使用任意的Python代码,则需要使用tf.py_function()库。

您可能想参考此主题以获得更好的概述:

Is there an alternative to tf.py_function() for custom Python code?

要解决您的问题,您需要专门使用 tf 模块中的功能,例如tf.stringstf.bool等。