keras 保存自定义TableNet模型(基于VGG 19)以进行表提取- Azure数据块

42fyovps  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(283)

我有一个基于TableNetVGG19的模型,用于训练和保存路径的数据(Marmoot)Map到数据库存储(使用Azure)。
我尝试用以下方法保存它,但在Databricks上出现以下错误:
1.* * 第一种方法:**

import pickle
pickle.dump(model, open(filepath, 'wb'))

这将保存模型并提供以下输出:

WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op while saving (showing 5 of 31). These functions will not be directly callable after loading.

现在,当我尝试使用以下命令重新加载模式时:

loaded_model = pickle.load(open(filepath, 'rb'))

我得到了以下错误(Databricks除了以下错误外还显示了整个stderr和stdout,但这是要点):

ValueError: Unable to restore custom object of type _tf_keras_metric. Please make sure that any 
custom layers are included in the `custom_objects` arg when calling `load_model()` and make 
sure that all layers implement `get_config` and `from_config`.

1.* * 第二种方法:**

model.save(filepath)

而对于,我得到了以下错误:

Fatal error: The Python kernel is unresponsive.
The Python process exited with exit code 139 (SIGSEGV: Segmentation fault).

The last 10 KB of the process's stderr and stdout can be found below. See driver logs for full logs.
---------------------------------------------------------------------------
Last messages on stderr:
Mon Jan  9 08:04:31 2023 Connection to spark from PID  1285
Mon Jan  9 08:04:31 2023 Initialized gateway on port 36597
Mon Jan  9 08:04:31 2023 Connected to spark.
2023-01-09 08:05:53.221618: I tensorflow/core/platform/cpu_feature_guard.cc:193] This 
TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the 
following CPU 
instructions in performance-critical operations:  AVX2 FMA

更重要的是,很难从所有的stderr和stdout中找到正确的错误位置。它显示了整个stderr和stdout,这使得很难找到解决方案(它显示了所有的stderr和stdout,包括训练和所有内容)
1.* * 第三种办法(部分):**
我也试过:

model.save_weights(weights_path)

但是我又一次无法重新加载它们(这种方法尝试得最少)
此外,我尝试通过添加以下内容来保存检查点:

model_checkpoint = tf.keras.callbacks.ModelCheckpoint(filepath, monitor = "val_table_mask_loss", verbose = 1, save_weights_only=True)

作为fit方法(callbacks=[model_checkpoint])中的回调,但在第一个时期结束时,它将生成以下错误(我显示了Traceback的结束):

h5py/_objects.pyx in h5py._objects.with_phil.wrapper()
h5py/_objects.pyx in h5py._objects.with_phil.wrapper()
h5py/h5f.pyx in h5py.h5f.create()
OSError: Unable to create file (file signature not found)

当我在非Databricks平台上使用第二种方法时,它工作正常,但是当我尝试加载模型时,我得到了一个类似于第一种方法加载的错误。

更新1

我尝试保存到的变量filepathdbfs引用,而dbfsMap到数据标记存储

更新2

当按照评论中的建议尝试使用以下answer时,我得到了以下错误:

----> 3 model2 = keras.models.load_model("/tmp/model-full2.h5")
...
ValueError: Unknown layer: table_mask. Please ensure this object is passed to the `custom_objects` argument. See https://www.tensorflow.org/guide/keras/save_and_serialize#registering_the_custom_object for details.

更新3:

因此,我尝试按照错误加上这个answer

model2 = keras.models.load_model("/tmp/model-full2.h5", custom_objects={'table_mask': table_mask})

但是我得到了以下错误:

TypeError: 'KerasTensor' object is not callable
gorkyyrv

gorkyyrv1#

请尝试对自定义对象进行以下更改,以便可以正确地序列化和反序列化这些对象:
将关键字参数添加到构造函数中:

def __init__(self, **kwargs):
super(TableMask, self).__init__(**kwargs)

table_mask重命名为TableMask以避免命名冲突。因此,当您加载模型时,它将如下所示:

model = keras.models.load_model("/tmp/path", custom_objects={'TableMask': TableMask, 'CustomObj2': CustomObj2, 'CustomMetric': CustomMetric})

问题作者更新:

我们在代码中发现了一些错误:

  • 我有2个自定义层与变量同名(初学者错误)
  • 我需要将定制对象添加到custom_objects关键字中的load方法中,正如答案所建议的那样
  • 我还需要按照答案的建议更改__init__函数
  • 我有一个自定义评分类,也需要将其添加到custom_objects中

我还使用了@AloneTogether在评论中建议的answer(这个答案是我选择的保存和加载模型的方式,加上我们在上面列表中写入的额外数据)
在这一切之后,保存、加载、预测都非常有效

相关问题