加载tf.keras模型,值错误:这两个结构没有相同的嵌套结构

0g0grzrc  于 2023-03-02  发布在  其他
关注(0)|答案(2)|浏览(221)

我创建了一个有BERTtf.keras model,我想训练并保存它以备将来使用。加载这个模型是一个大问题,因为我一直得到错误:ValueError: The two structures don't have the same nested structure.
我把模型简化了很多,看看问题到底出在哪里。代码非常简单:

bert = TFBertModel.from_pretrained("bert-base-german-cased")

model_name = "Model"
txt12_input_ids = tf.keras.layers.Input(shape=(max_length,),  name='txt12_input_ids', dtype='int32')
txt12_mask      = tf.keras.layers.Input(shape=(max_length,),  name='txt12_mask', dtype='int32')
txt12_outputs = bert(txt12_input_ids, txt12_mask).pooler_output

model_K = tf.keras.Model(inputs=(txt12_input_ids,  txt12_mask), outputs=txt12_outputs, name=model_name)
model_K.compile(optimizer=Adam(1e-5), loss="binary_crossentropy", metrics="accuracy")

model_K.save(dir_path+'Prob')
model_2 = tf.keras.models.load_model(dir_path+'Prob')
  • 开始回复前的一些注意事项:*

1.我确实指定了dtype
1.不,我不想只保存。
1.我尝试使用tf.keras.models.save_model(model_K, dir_path+'Prob')代替,它给出了相同的错误。
还有最后一件事,我用tf version: 2.6.0工作,有人知道怎么解吗?
完整错误消息:

ValueError: The two structures don't have the same nested structure.

First structure: type=tuple str=(({'input_ids': TensorSpec(shape=(None, 5), dtype=tf.int32, name='input_ids/input_ids')}, None, None, None, None, None, None, None, None, False), {})

Second structure: type=tuple str=((TensorSpec(shape=(None, 120), dtype=tf.int32, name='input_ids'), TensorSpec(shape=(None, 120), dtype=tf.int32, name='attention_mask'), None, None, None, None, None, None, None, False), {})

More specifically: Substructure "type=dict str={'input_ids': TensorSpec(shape=(None, 5), dtype=tf.int32, name='input_ids/input_ids')}" is a sequence, while substructure "type=TensorSpec str=TensorSpec(shape=(None, 120), dtype=tf.int32, name='input_ids')" is not
Entire first structure:
(({'input_ids': .}, ., ., ., ., ., ., ., ., .), {})
Entire second structure:
((., ., ., ., ., ., ., ., ., .), {})
3zwjbxry

3zwjbxry1#

看看GitHub上的issue here,它应该可以帮助你解决形状的问题。

m3eecexj

m3eecexj2#

重建模型并不是每个人都可以选择的,所以我在keras.models.load_model中使用了custom_objects参数。

model = keras.models.load_model(
    path.join(dir_path, EXPERIMENT_NAME),
    custom_objects={"TFBertModel": TFBertModel}
)

有关不同保存格式和加载自定义对象模型的其他文档,请访问网站here

相关问题