AttributeError:“节点”对象没有属性“ output_masks”

时间:2018-08-13 11:41:19

标签: python tensorflow keras pre-trained-model

我使用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)

EDIT1:我有keras(2.2.2)和tensorflow(1.10.0rc1)。我也尝试过keras 2.2.0和同样的错误。事实是,我使用的python环境可以在其他非预训练的NN上工作。

EDIT2:我可以连接两个自制模型。只有受过训练的人才有问题,而不仅仅是VGG16。

4 个答案:

答案 0 :(得分:11)

您可能会从tensorflow.keras导入tf.keras.layers或tf.keras.applications或其他keras模块,并将这些对象与“ pure” keras包中的对象混合,该包基于版本不兼容等等。我建议您查看是否可以从“纯” keras模块中导入和运行所有内容;调试时不要使用tf.keras,因为它们不一定兼容。我遇到了同样的问题,并且此解决方案对我有用。

答案 1 :(得分:1)

如果要从VGG16导入tensorflow.keras.applications.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

答案 2 :(得分:0)

同时导入keras和tenerflow.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

答案 3 :(得分:0)

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

Lead

收件人:

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

还要确保,您也不要在代码中使用keras.something(不仅是导入),希望对您有所帮助:) 另外,我使用了带有tensorflow 1.10.0的Keras 2.2.4