【发布时间】:2020-03-13 19:02:35
【问题描述】:
我有一个巨大的网络 (keras-bert),可以很好地进行分类。由于我的数据有两个不同的列,我想为每一列微调一个 BERT 模型,并将它们连接到最后一层。但我收到以下错误:
---> 20 模型 = keras.models.Model(inputs=[inputs1, inputs2], outputs=outputs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py in _validate_graph_inputs_and_outputs(self)
1620 """验证图网络的输入和输出。"""
1621 # 检查输入中的冗余。
-> 1622 如果 len(set(self.inputs)) != len(self.inputs):
1623 raise ValueError('传递给模型的输入列表'
1624 ' 是多余的。 '
TypeError: unhashable type: 'list'
在我的代码中,我有两个 bert 模型,model1和model2。只有一个模型它工作得很好。我唯一添加的是从检查点和第二个输入层加载了 2 个模型而不是一个模型,以及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)
我在监督什么?我是否必须以某种方式包装输入?
编辑: 我怀疑这个问题与我的输入是列表列表有关:输入 1 和输入 2 看起来像这样:
[<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:
层(类型)输出形状参数#连接到
Input-Token (InputLayer) (None, 256) 0
输入段(InputLayer)(无,256)0
Embedding-Token(TokenEmbedding[(None, 256, 768), (23440896 Input-Token[0][0])
Embedding-Segment(嵌入)(None, 256, 768) 1536 Input-Segment[0][0]
...(中间有很多层)
NSP-Dense (Dense) (None, 768) 590592 Extract[0][0]
【问题讨论】:
-
model1和model2是从同一个原始模型创建的吗?他们使用相同的original_model.input吗? -
我相应地编辑了我的帖子,两个模型都是从配置构建的,并从检查点加载了预训练的权重。
-
能否展示一下model1和model2的概要?它们似乎是相同的(相同的配置路径,相同的张量)
-
@DanielMöller 我在我的问题中添加了模型摘要的一部分