For a project that I'm working on, I have created a simple model in TensorFlow that consists of a dense features layer followed by three dense layers.

def build_model(arguments):
model = tf.keras.Sequential([
tf.keras.layers.DenseFeatures(arguments),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(5, activation='sigmoid')
])

return model


I am unable to go into more detail about the parameter arguments, but the above model function works perfectly fine and can train and save a .h5 file perfectly fine using the code below.

    # Create a path for the saving location of the model
model_dir = log_dir + "\model.h5"

# Save the model
model.save(model_dir)


However, when I try to load the model back from the .h5 file,

model = tf.keras.models.load_model(model_path)


I get the following error message.

  File "sampleModel.py", line 342, in <module>
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\saving\save.py", line 1
ompile)
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\saving\hdf5_format.py",
custom_objects=custom_objects)
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\saving\model_config.py"
, line 55, in model_from_config
return deserialize(config, custom_objects=custom_objects)
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\layers\serialization.py
", line 175, in deserialize
printable_module_name='layer')
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\utils\generic_utils.py"
, line 358, in deserialize_keras_object
list(custom_objects.items())))
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\engine\sequential.py",
line 487, in from_config
custom_objects=custom_objects)
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\layers\serialization.py
", line 175, in deserialize
printable_module_name='layer')
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\utils\generic_utils.py"
, line 358, in deserialize_keras_object
list(custom_objects.items())))
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\feature_column\base_fea
ture_layer.py", line 141, in from_config
config['feature_columns'], custom_objects=custom_objects)
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 186, in deserialize_feature_columns
for c in configs
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 186, in <listcomp>
for c in configs
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 138, in deserialize_feature_column
columns_by_name=columns_by_name)
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\feature_column
_v2.py", line 2622, in from_config
config['normalizer_fn'], custom_objects=custom_objects)
File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 273, in _deserialize_keras_object
obj = module_objects.get(object_name)
AttributeError: 'NoneType' object has no attribute 'get'


Looking around, I suspect it has something to do with the custom_objects tag for the load_model function, but I am not 100% sure of how to implement it.

There is an answer by ethanfowler who seems to solve the issue by using custom_objects

• Thanks for your answer, but I've already looked through that github post and cant seem to get it working for me. The only custom objects that I can think of that I might be using are loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) and when I compile the model, I use accuracy as my metric. Aug 21 '20 at 18:51

After looking around some more and digging through some Github issues, I believe I've figured out away around the issue. For my specific situation, I didn't need to save the entire model, rather than just the weights. For my configuration I'm using Tensorflow 2.3.0 and Keras 2.4.3.

Fit your model for at least one epoch, then load in the weights.

To save the weights, I use the following function appended with my model file path above it.

# Create a path for the saving location of the model
model_dir = dir_path + '/model.h5'

# Save the model
model.save_weights(model_dir)


I first build my model from my question above and store it in a model object

model = build_model(arguments)


I add my loss function and optimizer, then compile my model to make sure it has all relevant features before loading in the weights.

loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

#Declare and set the parametors of the optimizer

#Compile the model
model.compile(loss=loss_object, optimizer=optimizer, metrics=['accuracy'])


I found my answer from this line here, but at the very bottom it says to fit the model for 1 epoch before loading in the weights.

history = model.fit(test_data, batch_size=1, epochs=1)


Afterwards, you should be able to load in the weights just fine using the function below.

model.load_weights(model_path)