AttributeError:在keras中创建模型时,“ Tensor”对象没有属性“ _keras_shape”

时间:2018-07-25 09:52:27

标签: python tensorflow keras

当我在keras中定义模型时,错误显示如下 AttributeError:“ Tensor”对象没有属性“ _keras_shape”

产生错误的代码是

vocab_size = 10000
MAX_SEQUENCE_LENGTH = 256
sequence_input = keras.layers.Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedding=keras.layers.Embedding(vocab_size, 16, input_length  = MAX_SEQUENCE_LENGTH)(sequence_input)
x=keras.layers.GlobalAveragePooling1D()(embedding)
x=keras.layers.Dense(16, activation=tf.nn.relu)(x)

preds = keras.layers.Dense(1, activation=tf.nn.sigmoid)(x)

model = Model(inputs=sequence_input, outputs=preds)
model.compile(optimizer=tf.train.AdamOptimizer(),
          loss='binary_crossentropy',
          metrics=['accuracy'])

完整的错误消息如下所示

AttributeError                            Traceback (most recent call last)
<ipython-input-5-1c6ea41c38e1> in <module>()
      1 from keras.models import Model
----> 2 model = Model(inputs=sequence_input, outputs=preds)
      3 model.compile(optimizer=tf.train.AdamOptimizer(),
      4               loss='binary_crossentropy',
      5               metrics=['accuracy'])

~/Datacube/datacube_env/lib/python3.5/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
     89                 warnings.warn('Update your `' + object_name +
     90                               '` call to the Keras 2 API: ' + signature, stacklevel=2)
---> 91             return func(*args, **kwargs)
     92         wrapper._original_function = func
     93         return wrapper

~/Datacube/datacube_env/lib/python3.5/site-packages/keras/engine/network.py in __init__(self, *args, **kwargs)
     89                 'inputs' in kwargs and 'outputs' in kwargs):
     90             # Graph network
---> 91             self._init_graph_network(*args, **kwargs)
     92         else:
     93             # Subclassed network

~/Datacube/datacube_env/lib/python3.5/site-packages/keras/engine/network.py in _init_graph_network(self, inputs, outputs, name)
    249              input_masks=[None for _ in self.inputs],
    250              output_masks=[None for _ in self.outputs],
--> 251              input_shapes=[x._keras_shape for x in self.inputs],
    252              output_shapes=[x._keras_shape for x in self.outputs])
    253 

~/Datacube/datacube_env/lib/python3.5/site-packages/keras/engine/network.py in <listcomp>(.0)
    249              input_masks=[None for _ in self.inputs],
    250              output_masks=[None for _ in self.outputs],
--> 251              input_shapes=[x._keras_shape for x in self.inputs],
    252              output_shapes=[x._keras_shape for x in self.outputs])
    253 

AttributeError: 'Tensor' object has no attribute '_keras_shape'

谁能告诉我如何解决这个问题

1 个答案:

答案 0 :(得分:1)

我已经注意到,如果将常规的keras导入和tensorflow导入混合使用,可能会发生这种情况。 避免像这样混入进口商品:

# Mixed imports, one is regular keras, other is TF's keras
import keras
from tensorflow.keras.model import Model

sequence_input = keras.layers.Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
...
model = Model(inputs=sequence_input, outputs=preds)

例如,从TF导入所有内容:

from tensorflow import keras
from tensorflow.keras.model import Model

sequence_input = keras.layers.Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
...
model = Model(inputs=sequence_input, outputs=preds)

或仅使用Keras:

import keras
from keras.model import Model

sequence_input = keras.layers.Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
...
model = Model(inputs=sequence_input, outputs=preds)

不能确定这是问题的根本原因,但这可能对某些人有帮助