我有一个基于TableNet和VGG19的模型,用于训练和保存路径的数据(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
我尝试保存到的变量filepath
是dbfs
引用,而dbfs
Map到数据标记存储
更新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
1条答案
按热度按时间gorkyyrv1#
请尝试对自定义对象进行以下更改,以便可以正确地序列化和反序列化这些对象:
将关键字参数添加到构造函数中:
将
table_mask
重命名为TableMask
以避免命名冲突。因此,当您加载模型时,它将如下所示:问题作者更新:
我们在代码中发现了一些错误:
__init__
函数我还使用了@AloneTogether在评论中建议的answer(这个答案是我选择的保存和加载模型的方式,加上我们在上面列表中写入的额外数据)
在这一切之后,保存、加载、预测都非常有效