属性错误:'Node'对象没有'output_masks'属性。

15

我使用Keras预训练模型VGG16。问题在于当我将tensorflow配置为使用GPU后,出现了一个之前在使用CPU时没有过的错误。

错误如下:

    Traceback (most recent call last):
  File "/home/guillaume/Documents/Allianz/ConstatOrNotConstatv3/train_network.py",      line 109, in <module>
    model = LeNet.build(width=100, height=100, depth=3, classes=5)
  File "/home/guillaume/Documents/Allianz/ConstatOrNotConstatv3/lenet.py", line 39,    in build
    output = model(pretrainedOutput)
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py", line 443, in __call__
    previous_mask = _collect_previous_mask(inputs)
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py", line 1311, in _collect_previous_mask
mask = node.output_masks[tensor_index]
  AttributeError: 'Node' object has no attribute 'output_masks'

我在执行这段代码后明白了:

    pretrained_model = VGG16(
        include_top=False,
        input_shape=(height, width, depth),
        weights='imagenet'
    )
    for layer in pretrained_model.layers:
        layer.trainable = False

    model = Sequential()
    # first (and only) set of FC => RELU layers
    model.add(Flatten())
    model.add(Dense(200, activation='relu'))
    model.add(Dropout(0.5))
    model.add(BatchNormalization())
    model.add(Dense(400, activation='relu'))
    model.add(Dropout(0.5))
    model.add(BatchNormalization())

    # softmax classifier
    model.add(Dense(classes,activation='softmax'))

    pretrainedInput = pretrained_model.input
    pretrainedOutput = pretrained_model.output
    output = model(pretrainedOutput)
    model = Model(pretrainedInput, output)

编辑1:我已经获得了Keras(2.2.2)和TensorFlow(1.10.0rc1)。我也尝试过Keras 2.2.0,但仍然出现相同的错误。问题是我使用的Python环境可以在其他非预训练神经网络上正常工作。

编辑2:我能够连接两个自制模型。只有在预训练模型中存在问题,而不仅仅是VGG16。


我已经成功运行了这段代码,没有出现任何错误。使用的是keras版本2.2.0和tensorflow版本1.8.0。同时,我也在使用GPU。 - Mitiku
我已经安装了keras(2.2.2)和tensorflow(1.10.0rc1)。我也尝试过在keras 2.2.0上运行,但是出现了相同的错误。问题在于我使用的Python环境可以在其他非预训练神经网络上工作。 - Saroten
4个回答

47

您可能正在从tensorflow.keras导入tf.keras.layerstf.keras.applications或其他keras模块,并将这些对象与来自“纯”keras软件包的对象混合使用,这是不兼容的,基于版本等原因。

我建议看看是否可以从“纯”keras模块中导入并运行所有内容。在调试时不要使用tf.keras,因为它们不一定兼容。我曾遇到同样的问题,而这个解决方案对我有用。


9

当我同时导入keras和tensorflow.keras时,遇到了相同的错误:

from tensorflow.keras.optimizers import Adam from keras.utils import multi_gpu_model

将代码更改为以下内容后,我解决了这个问题:

from tensorflow.keras.optimizers import Adam from tensorflow.keras.utils import multi_gpu_model

5

我遇到了类似的问题,但是使用了不同的架构。正如人们所建议的那样,重要的是不要将 keras 和 tensorflow.keras 混淆在一起,因此请尝试交换以下代码:

from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K

to:

from tensorflow.keras.preprocessing import image 
from tensorflow.keras.models import Model 
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D 
from tensorflow.keras import backend as K

另外,请确保您的代码中没有使用keras.something(不仅是导入),希望这有所帮助:)

我使用的是Keras 2.2.4与tensorflow 1.10.0


1
如果您正在从 tensorflow.keras.applications.vgg16 导入 VGG16,则应该从 tensorflow 导入所有模型。
from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten

如果你从keras导入,可以用下面的方式:

from keras.applications.vgg16 import VGG16

然后使用从keras导入的模型

from keras.models import Sequential
from keras.layers import Dense

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接