我正在尝试在暹罗LSTM网络(https://github.com/eliorc/Medium/blob/master/MaLSTM.ipynb)中用BERT的句子嵌入替换Word2Vec词的嵌入。但是,我的BERT嵌入是(1,768)形状的矩阵,而不是可馈送到keras层的张量。我想知道是否可以进行转换。
我找到了一种用通用句子嵌入(http://hunterheidenreich.com/blog/google-universal-sentence-encoder-in-keras/)替换单词嵌入的方法,我试图修改LSTM的代码以使用来自以下服务(https://github.com/hanxiao/bert-as-service#what-is-it)的BERT句子嵌入。 / p>
# Model variables for LSTM
n_hidden = 50
gradient_clipping_norm = 1.25
batch_size = 64
n_epoch = 25
def BERTEmbedding(x):
#x is an input tensor
encoded= bc.encode(tf.squeeze(tf.cast(x, tf.string)))
return encoded
def exponent_neg_manhattan_distance(left, right):
''' Helper function for the similarity estimate of the LSTMs outputs'''
return K.exp(-K.sum(K.abs(left-right), axis=1, keepdims=True))
left_input_text = Input(shape=(1,), dtype=tf.string)
right_input_text = Input(shape=(1,), dtype=tf.string)
encoded_left = Lambda(BERTEmbedding, output_shape=(768, ))(left_input_text)
encoded_right = Lambda(BERTEmbedding, output_shape=(768, ))(right_input_text)
# Since this is a siamese network, both sides share the same LSTM
shared_lstm = LSTM(n_hidden)
left_output = shared_lstm(encoded_left)
right_output = shared_lstm(encoded_right)
我收到以下错误消息TypeError:“ Tensor(“ lambda_3 / Squeeze:0”,dtype = string)“必须为,但收到了类'tensorflow.python.framework.ops.Tensor'
答案 0 :(得分:1)
LSTM接受三维输入[ Batch_size, sequence_length, feature_dim ]
您可以从bert获得两种类型的嵌入:
如果采用令牌“ CLS”表示,则为[1,768]
,但如果
您将所有序列输出作为[ len of sequence, 768 ]
现在,如果您批量训练模型,它将变为
[ Batch_size,len_of_sentence, 768]
是LSTM编码器所采用的。
另一种方法,您可以添加一个额外的暗淡[batch_size, 768, 1]
并将其输入LSTM。
在序列长度中添加额外的暗淡没有意义,因为LSTM 根据序列的长度展开。