简体   繁体   中英

Loading the saved models from tf.keras in different versions (From tf 2.3.0 to tf 1.12)

Question: I have created and trained a keras model in tf 2.3.0 and I need to load this model in tf 1.12.0 in order to be used with a library that requires an older version of tf. Is there any way to either convert the models from the format of the new version of tf to an older version so I can load the model with tf 1.12.0?

What I have tried so far: A similar discussion showed how to convert models from tf 1.15 - 2.1 to tf.10, but when I tried this solution I got an error "Unknown layer: functional". Link: Loading the saved models from tf.keras in different versions

I tried to fix this by using the following line suggested by another question:

new_model = tf.keras.models.model_from_json(json_config, custom_objects {'Functional':tf.keras.models.Model})

Link: ValueError: Unknown layer: Functional

However, if I use this the I get an error: ('Unrecognized keyword arguments:', dict_keys(['ragged'])) , which is the same error discussed in the first discussion I linked above.

Another method I tried was using the Onnx library to convert the keras model to an Onnx model and then back to a keras model of a different version. However, I soon realized that the keras2onnx library required tf 2.x.

Links: https://github.com/onnx/tensorflow-onnx and https://github.com/gmalivenko/onnx2keras

Any suggestions about how to get around this without having to retrain my models in a older version of tensorflow would be greatly appreciated! Thanks

Here is the simple code that I tried to implement to load my model:

Save in tf 2.3.0

import tensorflow as tf

CNN_model=tf.keras.models.load_model('Real_Image_XAI_Models/Test_10_DC_R_Image.h5')

CNN_model.save_weights("Real_Image_XAI_Models/weights_only.h5")

json_config = CNN_model.to_json()

with open('Real_Image_XAI_Models/model_config.json', 'w') as json_file:
    json_file.write(json_config)

Load in tf 1.12.0

with open('Real_Image_XAI_Models/model_config.json') as json_file:
    json_config = json_file.read()

new_model = tf.keras.models.model_from_json(json_config)

#or implement the line to acount for the functional class

#new_model = tf.keras.models.model_from_json(json_config, custom_objects={'Functional':tf.keras.models.Model})

new_model.load_weights('Real_Image_XAI_Models/weights_only.h5')

There are mainly two breaking changes in the model config from tf-1.12.0 to tf-2.3.0:

  1. The root class Model is now Functional
  2. The support for Ragged tensors was added in tf-1.15

You can try to edit the model config json file once saved from tf-2.3.0 to reverse the effects of these changes as follows:

  1. Replace the root class definition "class_name": "Functional" by "class_name": "Model" . This will reverse the effect of change #1 above.
  2. Delete all occurrences of "ragged": false, (and of "ragged": true, if present). This will reverse the effect of change #2 above.

You may try to find a way to make these changes programmatically in the json dictionary or at the model load time, but I find it easier to make these one-time changes to the json file itself.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM