我有一个巨大的网络(keras-bert),它适用于分类。由于我的数据有两个不同的列,我想为每一列微调一个 BERT 模型并将它们连接到最后一层。但我收到以下错误:
---> 20 模型 = keras.models.Model(输入=[输入1,输入2],输出=输出)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py 在 _validate_graph_inputs_and_outputs(self)
1620 """验证图网络的输入和输出。"""
1621 # 检查输入的冗余。
-> 1622 如果 len(set(self.inputs)) != len(self.inputs):
1623 raise ValueError('传递给模型的输入列表'
1624'是多余的。'
类型错误:不可散列的类型:“列表”
在我的代码中,我有两个 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)
Run Code Online (Sandbox Code Playgroud)
我在监督什么?我是否必须以某种方式包装输入?
编辑: 我怀疑问题与我的输入是列表列表有关: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>]
Run Code Online (Sandbox Code Playgroud)
我能否以某种方式重塑或连接我的输入以克服此错误?
编辑:
模型 1 的摘要看起来像这样,模型 2 看起来相同,但每个层名称都有 LAYER_2:
层(类型)输出形状参数#连接到
输入令牌(InputLayer)(无,256)0
输入段(InputLayer)(无,256)0
Embedding-Token (TokenEmbedding [(None, 256, 768), ( 23440896 Input-Token[0][0])
Embedding-Segment (Embedding) (None, 256, 768) 1536 Input-Segment[0][0]
...(中间有很多层)
NSP-Dense (Dense) (None, 768) 590592 Extract[0][0]
这可能听起来有点复制+粘贴,但我认为当您注意到输入是列表列表时,您解决了自己的问题。
而不是使用[inputs1, inputs2],使用inputs1 + inputs2。
测试它们是否是带有isinstance(inputs1, list).