Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Keras BERT语句嵌入:如何获取语句嵌入向量_Keras_Nlp_Embedding_Word Embedding_Sentence - Fatal编程技术网

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]作为句子表示时应该小心: