如何在SentenceTransformer之上添加密集层?

问题描述 投票:0回答:1

在本教程(训练和微调 Sentence Transformers 模型)中,他们通过将词嵌入模块与池化层相结合来创建 SentenceTransformer:

from sentence_transformers import SentenceTransformer, models

## Step 1: use an existing language model
word_embedding_model = models.Transformer('distilroberta-base')

## Step 2: use a pool function over the token embeddings
pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension())

## Join steps 1 and 2 using the modules argument
model = SentenceTransformer(modules=[word_embedding_model, pooling_model])

# model.encode("Hi there")  # => works fine

然后他们说:

如有必要,可以添加额外的层,例如密集层、词袋层和卷积层。

我尝试在模型顶部添加致密层,但出现错误:

from sentence_transformers import SentenceTransformer, models

## Step 1: use an existing language model
word_embedding_model = models.Transformer('distilroberta-base')

## Step 2: use a pool function over the token embeddings
pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension())

##  My Dense Layer
dense_layer = torch.nn.Linear(pooling_model.get_sentence_embedding_dimension(), 128)

## Join steps 1 and 2 using the modules argument
model = SentenceTransformer(modules=[word_embedding_model, pooling_model, dense_layer])

当我跑步时

model.encode("hi there")
我得到:

类型错误:线性():参数“输入”(位置1)必须是张量,而不是字典

我在here发现了同样的错误,但使用的是

BertModel.from_pretrained
,而不是
models.Transformer
。建议的答案(传递参数
return_dict=False
)不起作用:

word_embedding_model = models.Transformer('distilroberta-base', return_dict=False)

TypeError:Transformer。init()得到了意外的关键字参数“return_dict”

有什么想法如何正确添加致密层吗?

python nlp huggingface-transformers sentence-transformers
1个回答
0
投票

根据文档,替换这一行:

dense_layer = torch.nn.Linear(pooling_model.get_sentence_embedding_dimension(), 128)

具有以下内容:

dense_layer = models.Dense(pooling_model.get_sentence_embedding_dimension(), 128)
© www.soinside.com 2019 - 2024. All rights reserved.