我有一个巨大的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模型,分别是model1model2。仅使用一种模型,效果很好。我添加的唯一内容是,从检查点和第二个输入层加载了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)测试它们是否为列表。

07-24 09:53
查看更多