TypeError: Layer input_spec 必须是 InputSpec 的一个实例。得到:InputSpec(shape=(None, 128, 768), ndim=3)
Posted
技术标签:
【中文标题】TypeError: Layer input_spec 必须是 InputSpec 的一个实例。得到:InputSpec(shape=(None, 128, 768), ndim=3)【英文标题】:TypeError: Layer input_spec must be an instance of InputSpec. Got: InputSpec(shape=(None, 128, 768), ndim=3) 【发布时间】:2021-10-20 10:38:19 【问题描述】:我正在尝试使用 BERT 预训练模型进行多类分类(3 类)。这是我使用模型的功能,还添加了一些额外的功能:
def create_model(max_seq_len, bert_ckpt_file):
with tf.io.gfile.GFile(bert_config_file, "r") as reader:
bc = StockBertConfig.from_json_string(reader.read())
bert_params = map_stock_config_to_params(bc)
bert_params.adapter_size = None
bert = BertModelLayer.from_params(bert_params, name="bert")
input_ids = keras.layers.Input(shape=(max_seq_len, ), dtype='int32', name="input_ids")
bert_output = bert(input_ids)
print("bert shape", bert_output.shape)
cls_out = keras.layers.Lambda(lambda seq: seq[:, 0, :])(bert_output)
cls_out = keras.layers.Dropout(0.5)(cls_out)
logits = keras.layers.Dense(units=768, activation="tanh")(cls_out)
logits = keras.layers.Dropout(0.5)(logits)
logits = keras.layers.Dense(units=len(classes), activation="softmax")(logits)
model = keras.Model(inputs=input_ids, outputs=logits)
model.build(input_shape=(None, max_seq_len))
load_stock_weights(bert, bert_ckpt_file)
return model
现在,当我尝试调用该函数时,出现错误。参数值有max_seq_len = 128,bert_ckpt_file = bert checkpoint file。
model = create_model(data.max_seq_len, bert_ckpt_file)
我收到以下错误:
TypeError Traceback (most recent call last)
<ipython-input-41-9609c396a3ce> in <module>()
----> 1 model = create_model(data.max_seq_len, bert_ckpt_file)
5 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/autograph/impl/api.py in wrapper(*args, **kwargs)
693 except Exception as e: # pylint:disable=broad-except
694 if hasattr(e, 'ag_error_metadata'):
--> 695 raise e.ag_error_metadata.to_exception(e)
696 else:
697 raise
TypeError: in user code:
/usr/local/lib/python3.7/dist-packages/bert/model.py:80 call *
output = self.encoders_layer(embedding_output, mask=mask, training=training)
/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py:1030 __call__ **
self._maybe_build(inputs)
/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py:2659 _maybe_build
self.build(input_shapes) # pylint:disable=not-callable
/usr/local/lib/python3.7/dist-packages/bert/transformer.py:209 build
self.input_spec = keras.layers.InputSpec(shape=input_shape)
/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py:2777 __setattr__
super(tf.__internal__.tracking.AutoTrackable, self).__setattr__(name, value) # pylint: disable=bad-super-call
/usr/local/lib/python3.7/dist-packages/tensorflow/python/training/tracking/base.py:530 _method_wrapper
result = method(self, *args, **kwargs)
/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py:1297 input_spec
'Got: '.format(v))
TypeError: Layer input_spec must be an instance of InputSpec. Got: InputSpec(shape=(None, 128, 768), ndim=3)
【问题讨论】:
self.input_spec 的值必须设置为 InputSpec 的实例,如异常所示。为了避免此异常,请确保将 input_spec 设置为等于 InputSpec 对象。假设 tensorflow 被导入为 tf,InputSpec
对象可以通过:tf.keras.layers.InputSpec()
访问。像这样input_spec = tf.keras.layers.InputSpec(ndim=3)
我通过降级到 tensorflow=2.3 解决了同样的问题
这里也一样。自从使用 2.6 版而不是 2.4 版后,我就遇到了这个问题。在我的情况下是:TypeError: Layer input_spec must be an instance of InputSpec. Got: InputSpec(ndim=4)
这已经有点荒谬了。
我解决了我的问题,但我没有在您的问题中清楚地看到它来发布答案。你能提供一个笔记本(例如colab)来测试代码吗?然后我可以看看我的解决方案是否能解决您的问题。
以防万一,我的问题是我正在比较像 from tensorflow.python.keras.engine.input_spec import InputSpec
这样导入的 InputSpec
和像 from tensorflow.keras.layers import InputSpec
这样导入的
【参考方案1】:
为此,您只需将 tensorflow 降级到 2.0.0,如下所示:
【讨论】:
【参考方案2】:首先,检查你拥有的 TensorFlow 版本:
import tensorflow
print(tensorflow.__version__)
如果版本是 2.6 或更高版本,可能会导致该问题
您应该考虑将其降级到 2.0.0 或 2.3
!pip uninstall tensorflow
!pip install tensorflow==2.0.0
【讨论】:
以上是关于TypeError: Layer input_spec 必须是 InputSpec 的一个实例。得到:InputSpec(shape=(None, 128, 768), ndim=3)的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:添加的层必须是类Layer的实例。找到:<tensorflow.python.keras.layers.recurrent.LSTM 对象位于 0x00000272F295E
Uncaught TypeError: renderer.incDisplayOrder is not a function
Uncaught TypeError: renderer.incDisplayOrder is not a function