微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 keras 中使用预训练的 Transformer

如何解决在 keras 中使用预训练的 Transformer

我想使用这个预训练模型:Hate-speech-CNERG/dehatebert-mono-arabic

我使用此代码使用 Keras(我通常使用的库)构建模型:

def build_model(transformer,max_len=512):
    """
    function for training the model
    """
    input_word_ids = Input(shape=(max_len,),dtype=tf.int32,name="input_word_ids")
    sequence_output = transformer(input_word_ids)[0]
    cls_token = sequence_output[:,:]
    out = Dense(1,activation='sigmoid')(cls_token)
        
    model = Model(inputs=input_word_ids,outputs=out)
    model.compile(Adam(lr=3e-5),loss='binary_crossentropy',metrics=[tf.keras.metrics.AUC()])
    # changed from 1e-5 to 3e-5
    return model

with strategy.scope():
    model_name = "Hate-speech-CNERG/dehatebert-mono-arabic"
    transformer_layer = (
        transformers.AutoModel.from_pretrained(model_name)
    )
    model = build_model(transformer_layer,max_len=MAX_LEN)

出现以下错误

AttributeError                            Traceback (most recent call last)
<ipython-input-19-26bbcd63ea51> in <module>()
      5         # .TFAutoModel.from_pretrained('jplu/tf-xlm-roberta-large')
      6     )
----> 7     model = build_model(transformer_layer,max_len=MAX_LEN)

2 frames
/usr/local/lib/python3.7/dist-packages/transformers/models/bert/modeling_bert.py in forward(self,input_ids,attention_mask,token_type_ids,position_ids,head_mask,inputs_embeds,encoder_hidden_states,encoder_attention_mask,past_key_values,use_cache,output_attentions,output_hidden_states,return_dict)
    922             raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")
    923         elif input_ids is not None:
--> 924             input_shape = input_ids.size()
    925             batch_size,seq_length = input_shape
    926         elif inputs_embeds is not None:
AttributeError: 'KerasTensor' object has no attribute 'size'

解决方法

huggingfaces 中的模型可以使用 transformers 库开箱即用。它们可以与不同的后端(tensorflow、pytorch)一起使用。

显示了在 keras 中使用 Huggingface 的转换器 here(在“create_model”函数中)。

一般来说,您可以使用 model card 中的示例代码(“在转换器中使用”按钮)加载拥抱脸的转换器:

from transformers import AutoTokenizer,AutoModelForSequenceClassification
  
tokenizer = AutoTokenizer.from_pretrained("Hate-speech-CNERG/dehatebert-mono-arabic")

model = AutoModelForSequenceClassification.from_pretrained("Hate-speech-CNERG/dehatebert-mono-arabic")

然后进行推理 the doc 展示了一种从加载的变压器模型中获取输出的方法:

inputs = tokenizer("صباح الخير",return_tensors="pt")
# We're not interested in labels here just the model's inference
# labels = torch.tensor([1]).unsqueeze(0)  # Batch size 1
outputs = model(**inputs) #,labels=labels)

# The model returns logits but we want a probability so we use the softmax function
probs = pytorch.softmax(outputs['logits'],1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。