Python 有没有一种不用微调就可以将bert large用作文本分类工具的方法?

Python 有没有一种不用微调就可以将bert large用作文本分类工具的方法?,python,tensorflow,keras,nlp,bert-language-model,Python,Tensorflow,Keras,Nlp,Bert Language Model,我目前的任务是将任何文本分类问题的基于keras-BERT的模型转换为.pb文件。对于这一点,我已经有了一个函数,它接受了keras模型,但问题是,当我试图下载任何预先训练过的BERT版本时,它们总是没有任何顶层进行分类,因此我应该手动添加tf.keras.layers.Input之前的层和BERT(之后)之上的任何神经网络架构[CLS]的嵌入)。我的目标是最终摆脱微调的需要,并获得一些已经微调过的现成模型。我发现transformer库可能对此很有用,因为他们有一些基于BERT的模型,可以用于

我目前的任务是将任何文本分类问题的基于keras-BERT的模型转换为.pb文件。对于这一点,我已经有了一个函数,它接受了keras模型,但问题是,当我试图下载任何预先训练过的BERT版本时,它们总是没有任何顶层进行分类,因此我应该手动添加
tf.keras.layers.Input
之前的层和BERT(之后)之上的任何神经网络架构[CLS]的嵌入)。我的目标是最终摆脱微调的需要,并获得一些已经微调过的现成模型。我发现transformer库可能对此很有用,因为他们有一些基于BERT的模型,可以用于某些数据集。无论如何,使用他们文档中的以下代码,通过标记数返回形状1的张量通过隐藏的维度

from transformers import BertTokenizer, TFBertModel
tokenizer = BertTokenizer.from_pretrained('bert-large-uncased')
model = TFBertModel.from_pretrained("bert-large-uncased")
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='tf')
output = model(encoded_input)

因此,我最终必须找到一些数据集并进行微调。即使使用distilbert-base-uncased-finetened-sst-2-english这样的模型,也会为每个输入标记生成嵌入。有没有方法准备好模型?

您必须对BERT进行一些额外的文本分类工作,否则它将不知道是什么标签你需要分类才能识别

如果要避免微调,最简单的方法是执行以下操作:

model = TFBertModel.from_pretrained("bert-large-uncased")
model.trainable = False 

input_ids_layer = Input(shape=(<max sequence length here>,))
attn_mask_layer = Input(shape=(<max sequence length here>,))
segment_ids_layer = Input(shape=(<max sequence length here>,))

layer = model([input_ids_layer, attn_mask_layer, segment_ids_layer])[0]
layer = Flatten()(layer)
layer = Dense(<num dense nodes here>, activation='relu')(layer)
output = Dense(<num classes here>, activation=<sigmoid/softmax>)(layer)

model = Model(inputs=[input_ids_layer, attn_mask_layer, segment_ids_layer], outputs=output)

model=TFBertModel.from_pretrained(“bert-large-uncased”)
model.trainable=False
输入\标识\图层=输入(形状=(,))
附件屏蔽层=输入(形状=(,))
段ID层=输入(形状=(,))
层=模型([输入\u ID\u层,附件\u屏蔽层,段\u ID\u层])[0]
层=展平()(层)
层=密集(,激活='relu')(层)
输出=密集(,激活=)(层)
模型=模型(输入=[输入\标识\层,附件\屏蔽\层,段\标识\层],输出=输出)
上面我们使用的是BERT模型,但通过调用
model.trainable=False
冻结了所有内容,然后为使用标记器返回的每个输入添加三个输入层

接下来,我们将添加一个
展平
层来重塑bert层的输出,以便能够通过自定义数量的节点传递到密集层-这是您需要训练的。最后,我们将有另一个密集层,以类的数量作为节点,然后将整个管道合并到一个模型层中,以提供访问拟合/预测方法(等)。

layer=model([input\u ids\u layer,attn\u mask\u layer,segment\u ids\u layer])[0]似乎返回最后一个BERT层中的所有嵌入,我们稍后将其用于稠密。仅使用[CLS]的嵌入传递到稠密中不是更准确吗?