我正在尝试为序列标记任务构建具有多个输入的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嵌入。