Python Keras功能api多输入:传递给模型的输入列表是冗余的

Python Keras功能api多输入:传递给模型的输入列表是冗余的,python,keras,Python,Keras,我有一个巨大的networt(),可以很好地进行分类。因为我的数据有两个不同的列,所以我想为每个列微调一个伯特模型,并在最后一层连接它们。但我得到了以下错误: --->20模型=keras.models.model(输入=[inputs1,inputs2],输出=输出) /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py in_validate_graph_input_和_output(

我有一个巨大的networt(),可以很好地进行分类。因为我的数据有两个不同的列,所以我想为每个列微调一个伯特模型,并在最后一层连接它们。但我得到了以下错误:

--->20模型=keras.models.model(输入=[inputs1,inputs2],输出=输出)

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py in_validate_graph_input_和_output(self)

1620“验证图形网络的输入和输出。”“”

1621#检查输入是否冗余

->1622如果len(设置(自输入))!=len(自输入):

1623 raise VALUERROR('传递到模型的输入列表'

1624“是多余的。”

TypeError:不可损坏的类型:“列表”

在我的代码中,我有两个bert模型,
model1
model2
。只有一个模型运行良好。我添加的只是从检查点和第二个输入层加载了两个模型,而不是一个,并且连接了dense1和dense2:

#load_trained_model_from_checkpoint is defined here:
# https://github.com/CyberZHG/keras-bert/blob/master/keras_bert/loader.py
model1 = load_trained_model_from_checkpoint(
    config_path,
    checkpoint_path,
    training=True,
    trainable=True,
    seq_len=SEQ_LEN,
    )
model2 = load_trained_model_from_checkpoint(
    config_path,
    checkpoint_path,
    training=True,
    trainable=True,
    seq_len=SEQ_LEN,
)

inputs1 = model1.inputs[:2] #model 1 for titles
inputs2 = model2.inputs[:2] #model 2 for texts
dense1 = model1.get_layer('NSP-Dense').output
dense2 = model2.get_layer('NSP-Dense').output
outputs = keras.layers.Dense(len(test_title_y[0]), activation='sigmoid')(keras.layers.concatenate([dense1, dense2]))


model = keras.models.Model(inputs=[inputs1, inputs2], outputs=outputs)
我在监督什么?我是否必须以某种方式包装输入

编辑: 我怀疑问题与我的输入是列表列表有关:inputs1和inputs2如下所示:

[<tf.Tensor 'Input-Token:0' shape=(?, 256) dtype=float32>, <tf.Tensor 'Input-Segment:0' shape=(?, 256) dtype=float32>]
[<tf.Tensor 'Input-Token_1:0' shape=(?, 256) dtype=float32>, <tf.Tensor 'Input-Segment_1:0' shape=(?, 256) dtype=float32>]
[,]
[, ]
我能否以某种方式重新塑造或连接输入以克服此错误

编辑:

模型1的摘要如下所示,模型2看起来相同,但每个层名称都有层2:

层(类型)输出形状参数#连接到


输入令牌(InputLayer)(无,256)0


输入段(InputLayer)(无,256)0


嵌入令牌(令牌嵌入[(无,256,768),(23440896输入令牌[0][0]


嵌入段(嵌入)(无,256,768)1536输入段[0][0]


…(中间有很多层)


NSP致密(致密)(无,768)590592提取物[0][0]


该错误意味着函数试图在某个地方使用列表作为散列参数,即使用列表作为字典中的键

模型(输入=[input1,input2])不能接受列表

试用

np.reshape

首先在input1和input2上。此外,将列表转换为元组。

看起来有一个内部检查,用于查找模型的长度相等的输入。在这种情况下,两个输入都是
[batchSize,256]
。您可以做的一件事是尝试将两个输入打包为一个具有三维的输入(即
[batchSize,inputs,256]
)。您需要在模型中处理一些切片,以确保向层传递正确的输入

以下是一个例子:

#load_trained_model_from_checkpoint is defined here:
# https://github.com/CyberZHG/keras-bert/blob/master/keras_bert/loader.py

model1 = load_trained_model_from_checkpoint(
    config_path,
    checkpoint_path,
    training=True,
    trainable=True,
    seq_len=SEQ_LEN,
    )
model2 = load_trained_model_from_checkpoint(
    config_path,
    checkpoint_path,
    training=True,
    trainable=True,
    seq_len=SEQ_LEN,
)

inputs1 = model1.inputs[:2] #model 1 for titles
inputs2 = model2.inputs[:2] #model 2 for texts
# concatenate the inputs into one tensor
concatInputs = keras.backend.concatenate([inputs1, inputs2],axis=0)

dense1 = model1.get_layer('NSP-Dense').output
dense2 = model2.get_layer('NSP-Dense').output

def getModel():
    inputs=keras.layers.Input([2,256])
    # slice inputs into individual tensors
    in1 = keras.layers.Lambda(lambda x: tf.slice(inputs,[0,0],[1,inputs.get_shape()[1]])
    in2 = keras.layers.Lambda(lambda x: tf.slice(inputs,[1,0],[2,inputs.get_shape()[1]])
    d1 = dense1(in1)
    d2 = dense2(in2)
    outputs = keras.layers.Dense(len(test_title_y[0]), activation='sigmoid')(keras.layers.concatenate([d1, d2]))

    return inputs,outputs

ins,outs = getModel()

model = keras.models.Model(inputs=[ins], outputs=[outs])

我没有机会进行测试,因此语法可能不准确,但想法应该可行。

这听起来可能有点“复制+粘贴”,但当您注意到输入是列表列表时,我认为您解决了自己的问题

不要使用
[inputs1,inputs2]
,而是使用
inputs1+inputs2


测试它们是否是带有
isinstance(输入1,列表)的列表

是从同一原始模型创建的
model1
model2
吗?它们是否使用相同的
原始模型。输入
?我相应地编辑了我的文章,这两个模型都是从配置构建的,并从检查点加载了预训练权重。你能显示model1和model2的摘要吗?它们似乎是相同的(相同的配置路径,相同的张量)@DanielMöller我在我的问题中添加了模型摘要的一部分是的,它们都是列表,但我仍然不知道如何解决这个问题。用
+
加入列表,就像在回答中一样。如果它们不是列表怎么办?@DanielMöller我得到了同样的错误,但我的输入不是列表,而是tensorflow.python.keras.engine.keras_tensor。KerasTensor,有什么线索可以解决这个错误吗?@the_learning_child,不可能知道你的问题,它说这是一个列表,然后是一个列表。你必须找到你的位置。