Ошибка типа: Слой input_spec должен быть экземпляром InputSpec. Получено: InputSpec(форма=(Нет, 128, 768), ndim=3)

#python #tensorflow #keras #deep-learning #bert-language-model

Вопрос:

Я пытаюсь использовать предварительно обученную модель БЕРТА для многоклассовой классификации (из 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.

 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)
 

Комментарии:

1. Значение self.input_spec должно быть установлено в экземпляр InputSpec, как следует из исключения. Чтобы избежать этого исключения, убедитесь, что вы устанавливаете значение input_spec равным объекту InputSpec. Предполагая, что tensorflow импортирован как tf, доступ к InputSpec объекту можно получить через: tf.keras.layers.InputSpec() . Что-то вроде этого input_spec = tf.keras.layers.InputSpec(ndim=3)

2. У меня была та же проблема, решенная путем понижения до tensorflow=2,3

3. Тоже самое. У меня проблема с использованием версии 2.6, а не с версией 2.4. В моем случае это: TypeError: Layer input_spec must be an instance of InputSpec. Got: InputSpec(ndim=4) что уже немного смешно.

4. Я решил свою проблему, но я не вижу ее ясно в вашем вопросе, чтобы опубликовать ответ. Можете ли вы предоставить записную книжку (например, colab) для тестирования кода? Затем я смогу посмотреть, решит ли мое решение вашу проблему.

5. На всякий случай, моя проблема заключалась в том, что я сравнивал InputSpec импортированное подобное from tensorflow.python.keras.engine.input_spec import 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