AttributeError:“顺序”对象没有属性“输出名称”。不是toco问题

Posted

技术标签:

【中文标题】AttributeError:“顺序”对象没有属性“输出名称”。不是toco问题【英文标题】:AttributeError: 'Sequential' object has no attribute 'output_names'. Not toco problem 【发布时间】:2019-05-24 07:48:11 【问题描述】:

我做错了什么?

https://repl.it/@zbitname/outputnamesproblem


    import tensorflow as tf
    import numpy as np

    def random_generator():
        while True:
            yield ("input_1": np.random.randint(1, 10000), "input_2": np.random.randint(1, 10000), "output": np.random.randint(0, 1))

    model = tf.keras.models.Sequential()

    model.add(tf.keras.layers.Dense(16, activation=tf.nn.tanh))
    model.add(tf.keras.layers.Dense(4, activation=tf.nn.relu))
    model.add(tf.keras.layers.Dense(1, activation=tf.nn.sigmoid))

    model.build((1000, 2))

    categories_train = random_generator()

    model.compile(
        optimizer='sgd',
        loss='categorical_crossentropy',
        metrics=['accuracy']
    )

    model.fit_generator(
        generator=categories_train,
        use_multiprocessing=True,
        workers=6,
        steps_per_epoch=10000
    )

实际结果

操作系统:Windows 10

python.exe --版本 > Python 3.6.7 python.exe -c '将张量流导入为 tf;打印(tf.VERSION)' > 1.12.0 python.exe错误.py 回溯(最近一次通话最后): 文件“bug.py”,第 21 行,在 指标=['准确性'] _method_wrapper 中的文件“C:\Users\***\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\training\checkpointable\base.py”,第 474 行 方法(自我,*args,**kwargs) 编译中的文件“C:\Users\***\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\keras\engine\training.py”,第 600 行 skip_target_weighing_indices) _set_sample_weight_attributes 中的文件“C:\Users\***\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\keras\engine\training.py”,第 134 行 self.output_names、sample_weight_mode、skip_target_weighing_indices) AttributeError: 'Sequential' 对象没有属性 'output_names'

操作系统:Ubuntu

$ cat /etc/lsb-release
> DISTRIB_ID=Ubuntu
> DISTRIB_RELEASE=16.04
> DISTRIB_CODENAME=xenial
> DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

$ python3.6 --版本
> Python 3.6.8
$ python -c '将张量流导入为 tf;打印(tf.VERSION)'
> 1.12.0

$ python3.6 bug.py
回溯(最近一次通话最后):
  文件“bug.py”,第 21 行,在
    指标=['准确性']
  _method_wrapper 中的文件“/home/***/.local/lib/python3.6/site-packages/tensorflow/python/training/checkpointable/base.py”,第 474 行
    方法(自我,*args,**kwargs)
  编译中的文件“/home/***/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py”,第 600 行
    skip_target_weighing_indices)
  _set_sample_weight_attributes 中的文件“/home/***/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py”,第 134 行
    self.output_names、sample_weight_mode、skip_target_weighing_indices)
AttributeError: 'Sequential' 对象没有属性 'output_names'

【问题讨论】:

【参考方案1】:

将此与@Matias Valdenegro 的回答结合起来。您不能使用具有多个输入的 Sequential 模型。

问题是您正在传递带有名称的数据,这些名称没有为您的模型定义。

只需以正确的顺序传递数据(对于支持多个输出的模型)就足够了:

def random_generator():
    while True:
        yield ([np.random.randint(1, 10000), np.random.randint(1, 10000)], 
                np.random.randint(0, 1))

对于顺序模型,只有一个输入和一个输出是有效的:

yield np.random.randint(1, 10000), np.random.randint(0, 1)

【讨论】:

这不起作用,因为顺序模型不能有多个输入。 我将 ("input_1": np.random.randint(1, 10000), "input_2": np.random.randint(1, 10000), "output": np.random.randint(0, 1)) 更改为 yield np.random.randint(1, 10000), np.random.randint(0, 1) repl.it/@zbitname/outputnamesproblem 并得到了同样的错误... 问题可能出在model.build((1000, 2))(对我来说没有意义)或using_multiprocessing=True,这与yield generators不兼容,仅与keras.utils.Sequence对象兼容。跨度> 我将model.build((1000, 2)) 更改为model.build((1000, 1)) 并得到了同样的错误......我删除了using_multiprocessing=True 的行并得到了同样的错误......为什么发生在我身上? :) 你为什么要调用model.build?这与我所知道的完全不同......【参考方案2】:

你有一个顺序模型,它只能有一个输入和一个输出,具有线性结构(顺序)。您的生成器为两个输入和一个输出生成数据。这当然是不兼容的,Keras 尝试从您的模型中获取输入/输出的名称,但顺序不支持多个输入或输出。

所以解决方案是使用函数式 API 制作一个合适的模型,或者重写您的生成器,使其具有一个没有名称的输入/输出。

【讨论】:

我更改了代码,现在有 1 个输入。错误是一样的。在 tensorflow 文档示例(Sequential.fit_generator)中有 2 个输入和 1 个输出。 tensorflow.org/api_docs/python/tf/keras/models/… @AlexKheben 您对代码做了哪些更改?此外,TF Keras 文档是错误的,Sequential 不支持多个输入/输出,而且您的模型也不支持。 我把("input_1": np.random.randint(1, 10000), "input_2": np.random.randint(1, 10000), "output": np.random.randint(0, 1))改成了("input_1": np.random.randint(1, 10000), "output": np.random.randint(0, 1)) 我了解 Sequential 不支持多个输入/输出,但我不明白如何编写正确的代码...

以上是关于AttributeError:“顺序”对象没有属性“输出名称”。不是toco问题的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:“顺序”对象没有属性“输出名称”。不是toco问题

AttributeError:“顺序”对象在 Keras Theano 中没有属性“_feed_input_names”

AttributeError: 'RDD' 对象没有属性 'show'

AttributeError:“NumpyArrayIterator”对象没有属性“类”

AttributeError:'list' 对象没有属性 'size'

AttributeError:“模块”对象没有属性“WebSocketApp”