如何在keras中使用多个输入,令牌和预先计算的BERT嵌入?

时间:2019-06-06 22:56:38

标签: python tensorflow multidimensional-array keras deep-learning

我正在尝试为序列标记任务构建具有多个输入的keras模型。特别是,我要输入不同长度的句子,并为句子中的每个标记预先计算BERT嵌入。

BERT嵌入(句子中的每个标记由1024个float数组表示)在预处理步骤中进行计算,然后与每个句子一起保存为以下格式的字典:

{'tokens':['The', 'dog', 'barked'],
'BERT_embedding':[[float1,float2,...,float1024],
                  [float1,float2,...,float1024],
                  [float1,float2,...,float1024]]}

{'tokens':['A', 'cat', 'purred', 'softly'],
 'BERT_embedding':[[float1,float2,...,float1024],
                   [float1,float2,...,float1024],   
                   [float1,float2,...,float1024],
                   [float1,float2,...,float1024]]}

对于keras模型,我将令牌作为输入发送,并将连接的输入发送到Word2Vec嵌入层,该层将每个令牌转换为其300维的word2vec表示形式。因此,在我打印的模型摘要中,我有:

Layer (type)               Output Shape        Param #    Connected to
token_input (InputLayer)   (None, None)        0          
token_embed (Embedding)    (None, None, 300)   59268000   token_input[0][0]

我需要的建议/帮助是为我预先计算的BERT嵌入定义一个输入层,这样我就可以将两个输入合并到一个连接层中,就像这样:

Layer (type)                 Output Shape        Param #    Connected to
token_input (InputLayer)     (None, None)        0          
token_embed (Embedding)      (None, None, 300)   59268000   token_input[0][0]
BERT_input (InputLayer)      (None, None, 1024)     0
merged_input (Concatenate)   (None, None, 1324)  0          token_embed[0][0]
                                                            BERT_input[0][0]

对于keras功能API的某些复杂性,我还是很陌生,尤其是在定义具有多个输入的模型时,我将不胜感激。

我的主要困惑来自与BERT_embedding列表对象关联的每个输入标记。

如何构造BERT嵌入输入层,以使对于每个输入令牌,我传递与其关联的1024个浮点数,而不是列表对象本身(因为keras显然不接受列表类型对象本身)输入)?

我希望得到有关正确配置模型输入形状的答案,而不是例如建议将BERT嵌入计算为模型本身中的一层的建议(即更改输入数据的性质)。我希望将BERT嵌入计算并存储为预处理步骤,因为我希望其他人可以使用我的输入数据,即使它们的硬件限制可能会阻止他们自己快速计算BERT嵌入。

0 个答案:

没有答案