Keras BERT语句嵌入:如何获取语句嵌入向量
我使用模块Keras BERT语句嵌入:如何获取语句嵌入向量,keras,nlp,embedding,word-embedding,sentence,Keras,Nlp,Embedding,Word Embedding,Sentence,我使用模块bert-for-tf2将bert模型包装为Tensorflow 2.0中的Keras层。我遵循了您的指南,将bert模型实现为Keras层。 我试图从一个句子中提取嵌入词;就我而言,这句话是“你好” 我对模型预测的输出有疑问;我写了这个模型: model_word_embedding = tf.keras.Sequential([ tf.keras.layers.Input(shape=(4,), dtype='int32', name='input_
bert-for-tf2
将bert模型包装为Tensorflow 2.0中的Keras层。我遵循了您的指南,将bert模型实现为Keras层。
我试图从一个句子中提取嵌入词;就我而言,这句话是“你好”
我对模型预测的输出有疑问;我写了这个模型:
model_word_embedding = tf.keras.Sequential([
tf.keras.layers.Input(shape=(4,), dtype='int32', name='input_ids'),
bert_layer
])
model_word_embedding .build(input_shape=(None, 4))
然后我想提取上面写的句子的嵌入:
sentences = ["Hello"]
predict = model_word_embedding .predict(sentences)
对象predict包含4个数组,每个数组包含768个元素:
print(predict)
print(len(predict))
print(len(predict[0][0]))
...
[[[-0.02768866 -0.7341324 1.9084396 ... -0.65953904 0.26496622
1.1610721 ]
[-0.19322394 -1.3134469 0.10383344 ... 1.1250225 -0.2988368
-0.2323082 ]
[-1.4576151 -1.4579685 0.78580517 ... -0.8898649 -1.1016986
0.6008501 ]
[ 1.41647 -0.92478925 -1.3651332 ... -0.9197768 -1.5469263
0.03305872]]]
4
768
我知道这4个数组中的每一个都代表我的原始句子,但我想得到一个数组作为我原始句子的嵌入。
所以,我的问题是:如何获得一个句子的嵌入
在源代码中,我读到:
对于分类任务,第一个向量(对应于[CLS])被用作“句子向量”。请注意,这只有在对整个模型进行微调的情况下才有意义
所以我必须从预测输出中取第一个数组,因为它代表我的句子向量
感谢您的支持我们应该使用上次隐藏状态中的[CLS]作为BERT的句子嵌入。根据伯特的论文[CLS]表示768维的编码句子。下图更详细地介绍了[CLS]的使用。考虑到你有2000句话
#input_ids consist of all sentences padded to max_len.
last_hidden_states = model(input_ids)
features = last_hidden_states[0][:,0,:].numpy() # considering o only the [CLS] for each sentences
features.shape
# (2000, 768) dimension
非常感谢,非常有用。您知道为什么在模型中运行一行数据总是导致相同的CLS令牌,而不管我传递给它的是哪一行吗?运行多个函数可以很好地工作,但是一个函数总是给出精确的数组
[0.35013607,-0.5340336,0.28577858,…-0.03405955,-0.0165604,-0.36481357]
我认为使用[CLS]作为句子表示时应该小心: