在本教程(训练和微调 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”
有什么想法如何正确添加致密层吗?
根据文档,替换这一行:
dense_layer = torch.nn.Linear(pooling_model.get_sentence_embedding_dimension(), 128)
具有以下内容:
dense_layer = models.Dense(pooling_model.get_sentence_embedding_dimension(), 128)