#python #tensorflow #pytorch #bert-language-model #huggingface-transformers
#питон #тензорный поток #pytorch #bert-language-model #huggingface-трансформеры
Вопрос:
При попытке преобразовать контрольную точку самоподготовленной модели tensorflow 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, скрипт выдает ошибку. Кто-нибудь еще сталкивался с этой ошибкой раньше? Как вы это исправили?
Здесь снова весь stacktrace:
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 выглядит следующим образом:
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
}
Ответ №1:
Оказывается, это просто обозначение «layer_normalization» вместо «LayerNorm». Я просто изменил сценарий, и теперь он работает.
Ответ №2:
Чтобы добавить в @blueberry-cake666, переименование переменных tf в контрольной точке с «layer_normalization» на «LayerNorm» сработало. Вы можете переименовать переменные tf с помощью этого скрипта (https://gist.github.com/fvisin/578089ae098424590d3f25567b6ee255 )
Ответ №3:
параметры модели tensorflow»output_bias» и «output_weight» сопоставляются с pytorch BertForSequenceClassification «классификатор / смещение» «классификатор / веса». Итак, измените коды, как показано ниже, чтобы исправить это:
elif l[0] == 'output_bias':
pointer = getattr(pointer, 'classifier')
pointer = getattr(pointer, 'bias')