5

I am trying to convert my model in Tensorflow (.pb) format to Keras (.h5) format to view post hoc attention visualisation. I have tried below code.

file_pb = "/test.pb" file_h5 = "/test.h5" loaded_model = tf.keras.models.load_model(file_pb) tf.keras.models.save_keras_model(loaded_model, file_h5) loaded_model_from_h5 = tf.keras.models.load_model(file_h5) 

Can anyone help me with this? Is this even possible?

0

1 Answer 1

17

In the Latest Tensorflow Version (2.2), when we Save the Model using tf.keras.models.save_model, the Model will be Saved in not just a pb file but it will be Saved in a Folder, which comprises Variables Folder and Assets Folder, in addition to the saved_model.pb file, as shown in the screenshot below:

Saved Model Folder

For example, if the Model is Saved with the Name, "Model", we have to Load using the Name of the Folder, "Model", instead of saved_model.pb, as shown below:

loaded_model = tf.keras.models.load_model('Model') 

instead of

loaded_model = tf.keras.models.load_model('saved_model.pb') 

One more change you can do is to replace

tf.keras.models.save_keras_model 

with

tf.keras.models.save_model 

Complete working Code to convert a Model from Tensorflow Saved Model Format (pb) to Keras Saved Model Format (h5) is shown below:

import os import tensorflow as tf from tensorflow.keras.preprocessing import image New_Model = tf.keras.models.load_model('Dogs_Vs_Cats_Model') # Loading the Tensorflow Saved Model (PB) print(New_Model.summary()) 

Output of the New_Model.summary command is:

Layer (type) Output Shape Param # ================================================================= conv2d (Conv2D) (None, 148, 148, 32) 896 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 74, 74, 32) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 72, 72, 64) 18496 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 36, 36, 64) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 34, 34, 128) 73856 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 17, 17, 128) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 15, 15, 128) 147584 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (None, 7, 7, 128) 0 _________________________________________________________________ flatten (Flatten) (None, 6272) 0 _________________________________________________________________ dense (Dense) (None, 512) 3211776 _________________________________________________________________ dense_1 (Dense) (None, 1) 513 ================================================================= Total params: 3,453,121 Trainable params: 3,453,121 Non-trainable params: 0 _________________________________________________________________ None 

Continuing the code:

# Saving the Model in H5 Format and Loading it (to check if it is same as PB Format) tf.keras.models.save_model(New_Model, 'New_Model.h5') # Saving the Model in H5 Format loaded_model_from_h5 = tf.keras.models.load_model('New_Model.h5') # Loading the H5 Saved Model print(loaded_model_from_h5.summary()) 

Output of the command, print(loaded_model_from_h5.summary()) is shown below:

Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d (Conv2D) (None, 148, 148, 32) 896 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 74, 74, 32) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 72, 72, 64) 18496 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 36, 36, 64) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 34, 34, 128) 73856 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 17, 17, 128) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 15, 15, 128) 147584 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (None, 7, 7, 128) 0 _________________________________________________________________ flatten (Flatten) (None, 6272) 0 _________________________________________________________________ dense (Dense) (None, 512) 3211776 _________________________________________________________________ dense_1 (Dense) (None, 1) 513 ================================================================= Total params: 3,453,121 Trainable params: 3,453,121 Non-trainable params: 0 _________________________________________________________________ 

​ As can be seen from the Summary of both the Models above, both the Models are same.

Sign up to request clarification or add additional context in comments.

5 Comments

I got this error in saving the model AttributeError: '_UserObject' object has no attribute '_is_graph_network'
This is like a dream-come-true convention but I got this error: '_UserObject' object has no attribute 'summary'. I am running on Tensorflow Version (2.3).
I got this AttributeError: 'AutoTrackable' object has no attribute '_is_graph_network'
I am getting this error: AttributeError: 'AutoTrackable' object has no attribute 'Summary'?
I got : if (not model._is_graph_network and # pylint:disable=protected-access AttributeError: '_UserObject' object has no attribute '_is_graph_network'

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.