Объект BertEmbeddings не имеет атрибута bias при преобразовании контрольной точки tf

При попытке преобразовать контрольную точку самообученной модели BERT тензорного потока (с использованием create-pretraining.py из Google) в модель pytorch с помощью convert_bert_original_tf_checkpoint_to_pytorch.py ​​ из Huggingface.

Я всегда получаю следующую ошибку: AttributeError: объект BertEmbeddings не имеет атрибута bias

Имена init_vars (только первые) выглядят так:

['bert/embeddings/layer_normalization/beta', 'bert/embeddings/layer_normalization/beta/adam_m', 'bert/embeddings/layer_normalization/beta/adam_v', 'bert/embeddings/layer_normalization/gamma', 'bert/embeddings/layer_normalization/gamma/adam_m', 'bert/embeddings/layer_normalization/gamma/adam_v']

Код, вызывающий ошибку, выглядит так:

for m_name in name:                                                     
            if re.fullmatch(r"[A-Za-z]+_\d+", m_name):                          
                scope_names = re.split(r"_(\d+)", m_name)                       
            else:                                                               
                scope_names = [m_name]                                          
            if scope_names[0] == "kernel" or scope_names[0] == "gamma":         
                pointer = getattr(pointer, "weight")                            
            elif scope_names[0] == "output_bias" or scope_names[0] == "beta":   
                print(scope_names)                                              
                pointer = getattr(pointer, "bias")                              
            elif scope_names[0] == "output_weights":                            
                pointer = getattr(pointer, "weight")                            
            elif scope_names[0] == "squad":                                     
                pointer = getattr(pointer, "classifier")                        
            else:                                                               
                try:                                                            
                    pointer = getattr(pointer, scope_names[0])                  
                except AttributeError:                                          
                    logger.info("Skipping {}".format("/".join(name)))

Перебираем все имена и получаем правильные атрибуты из модели. Когда дело доходит до нормализации уровня в BertEmbeddings, скрипт выдает ошибку. Кто-нибудь еще сталкивался с этой ошибкой раньше? Как ты это исправил?

Здесь снова вся трассировка стека:

Traceback (most recent call last):
  File "convert_bert_original_tf_checkpoint_to_pytorch.py", line 62, in <module>
    convert_tf_checkpoint_to_pytorch(args.tf_checkpoint_path, args.bert_config_file, args.pytorch_dump_path)
  File "convert_bert_original_tf_checkpoint_to_pytorch.py", line 37, in convert_tf_checkpoint_to_pytorch
    load_tf_weights_in_bert(model, config, tf_checkpoint_path)
  File "/modeling_bert.py", line 136, in load_tf_weights_in_bert
    pointer = getattr(pointer, "bias")
  File "module.py", line 594, in __getattr__
    type(self).__name__, name))
AttributeError: 'BertEmbeddings' object has no attribute 'bias'

Bert Config выглядит следующим образом:

Building PyTorch model from configuration: BertConfig {
  "attention_probs_dropout_prob": 0.1,
  "gradient_checkpointing": false,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 512,
  "initializer_range": 0.02,
  "intermediate_size": 2048,
  "layer_norm_eps": 1e-12,
  "max_position_embeddings": 512,
  "model_type": "bert",
  "num_attention_heads": 8,
  "num_hidden_layers": 8,
  "pad_token_id": 0,
  "type_vocab_size": 2,
  "vocab_size": 30522
}

person blueberry-cake666    schedule 01.09.2020    source источник


Ответы (2)


Оказывается, это просто название layer_normalization вместо LayerNorm. Я просто изменил сценарий, и теперь он работает.

person blueberry-cake666    schedule 02.09.2020

Чтобы добавить к @ blueberry-cake666, переименование переменных tf в контрольной точке с layer_normalization на LayerNorm работало. Вы можете переименовать переменные tf с помощью этого скрипта (https://gist.github.com/fvisin/578089ae098424590d6f255 а>)

person sundaze    schedule 16.12.2020