Loading a model returns either an untrained model or broken model
Closed this issue · 1 comments
When trying to save a trained model and reload it in a separate python file using
model.save(filepath, save_format='tf')
then model = tf.keras.models.load_model(filepath)
I see that the model type has changed, before saving I had a
<tensorflow_decision_forests.keras.GradientBoostedTreesModel object at ... >
after loading I have a
<keras.src.saving.legacy.saved_model.load.GradientBoostedTreesModel object at... >
This model evaluated correctly but if I call model.make_inspector()
on the loaded model I have this error
AttributeError: 'GradientBoostedTreesModel' object has no attribute 'make_inspector'
This command runs normally for the model that is trained and saved.
My alternative approach was to just save the model weights with model.save_weights(filepath)
then load the model weights with model.load_weights(filepath)
followed by model.compile(metrics=["binary_crossentropy"])
However, when evaluated this model gives 0s and the following error when I call model.make_inspector()
Traceback (most recent call last):
File "/home/cb719/Documents/L1Trigger/Tracker/TrackQuality/TrackQuality_package/test.py", line 43, in <module>
NoDegredation.model.make_inspector()
File "/home/cb719/miniconda3/envs/tq/lib/python3.11/site-packages/tensorflow_decision_forests/keras/core_inference.py", line 411, in make_inspector
path = self.yggdrasil_model_path_tensor().numpy().decode("utf-8")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cb719/miniconda3/envs/tq/lib/python3.11/site-packages/tensorflow/python/util/traceback_utils.py", line 153, in error_handler
raise e.with_traceback(filtered_tb) from None
File "/tmp/__autograph_generated_filegdj2nxzc.py", line 39, in tf__yggdrasil_model_path_tensor
ag__.if_stmt(ag__.ld(multitask_model_index) >= ag__.converted_call(ag__.ld(len), (ag__.ld(self)._models,), None, fscope), if_body, else_body, get_state, set_state, (), 0)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: in user code:
File "/home/cb719/miniconda3/envs/tq/lib/python3.11/site-packages/tensorflow_decision_forests/keras/core_inference.py", line 436, in yggdrasil_model_path_tensor *
if multitask_model_index >= len(self._models):
TypeError: object of type 'NoneType' has no len()
I see from #169 that pickling a model is not supported though if it were maybe that would also fix my issues.
Any advice on best practices for saving and loading models would be welcome, I would like to avoid having to retrain a model every time I want to inspect it.
Tensorflow decision forests version: 1.6.0
Python version: Python 3.11.6 | packaged by conda-forge | (main, Oct 3 2023, 10:40:35) [GCC 12.3.0] on linux
Hi,
this is a known issue, but there is a workaround for most cases.
If your model does not use keras-specifics (e.g. it's not using neural networks preprocessing or model composition), you can create the inspector from the saved model on disk:
# Let's save the model first:
path_to_model = "/tmp/mymodel"
model.save(path_to_model)
# Now create an inspector from the raw YDF model inside our model
insp = tfdf.inspector.make_inspector(os.path.join(path_to_model, "assets"))