我有一个巨大的networt(keras-bert),可以很好地进行分类。由于我的数据有两个不同的列,因此我想为每个列微调一个BERT模型,并将它们连接到最后一层。但我收到以下错误:
---> 20个模型= keras.models.Model(输入= [输入1,输入2],输出=输出)
_validate_graph_inputs_and_outputs中的/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py
1620“”“验证图网络的输入和输出。”“”
1621#检查输入是否冗余。
-> 1622如果len(set(self.inputs))!= len(self.inputs):
1623引发ValueError('传递给模型的输入列表'
1624'是多余的。 '
TypeError:无法散列的类型:“列表”
在我的代码中,我有两个bert模型,分别是model1
和model2
。仅使用一种模型,效果很好。我添加的唯一内容是,从检查点和第二个输入层加载了2个模型,而不是一个模型,并且将密集模型1和稠密模型2串联在一起:
#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>]
我可以以某种方式重塑或连接我的输入以克服此错误吗?
编辑:
model1的摘要看起来像这样,model2看起来一样,但是每个图层名称都带有LAYER_2:
图层(类型)输出形状参数#连接到
输入令牌(InputLayer)(无,256)0
输入段(InputLayer)(无,256)0
嵌入令牌(TokenEmbedding [(None,256,768),(23440896 Input-Token [0] [0]
嵌入段(嵌入)(无,256,768)1536输入段[0] [0]
...(介于两者之间的许多层)
NSP密集(密集)(无768)590592提取[0] [0]
最佳答案
这听起来可能有点复制+粘贴,但是当您注意到输入是列表列表时,我想您已经解决了自己的问题。
代替使用[inputs1, inputs2]
,而是使用inputs1 + inputs2
。
使用isinstance(inputs1, list)
测试它们是否为列表。