99

After Training, I saved Both Keras whole Model and Only Weights using

model.save_weights(MODEL_WEIGHTS) and model.save(MODEL_NAME)

Models and Weights were saved successfully and there was no error. I can successfully load the weights simply using model.load_weights and they are good to go, but when i try to load the save model via load_model, i am getting an error.

File "C:/Users/Rizwan/model_testing/model_performance.py", line 46, in <module>
Model2 = load_model('nasnet_RS2.h5',custom_objects={'euc_dist_keras': euc_dist_keras})
File "C:\Users\Rizwan\AppData\Roaming\Python\Python36\site-packages\keras\engine\saving.py", line 419, in load_model
model = _deserialize_model(f, custom_objects, compile)
File "C:\Users\Rizwan\AppData\Roaming\Python\Python36\site-packages\keras\engine\saving.py", line 321, in _deserialize_model
optimizer_weights_group['weight_names']]
File "C:\Users\Rizwan\AppData\Roaming\Python\Python36\site-packages\keras\engine\saving.py", line 320, in <listcomp>
n.decode('utf8') for n in
AttributeError: 'str' object has no attribute 'decode'

I never received this error and i used to load any models successfully. I am using Keras 2.2.4 with tensorflow backend. Python 3.6. My Code for training is :

from keras_preprocessing.image import ImageDataGenerator
from keras import backend as K
from keras.models import load_model
from keras.callbacks import ReduceLROnPlateau, TensorBoard, 
ModelCheckpoint,EarlyStopping
import pandas as pd

MODEL_NAME = "nasnet_RS2.h5"
MODEL_WEIGHTS = "nasnet_RS2_weights.h5"
def euc_dist_keras(y_true, y_pred):
return K.sqrt(K.sum(K.square(y_true - y_pred), axis=-1, keepdims=True))
def main():

# Here, we initialize the "NASNetMobile" model type and customize the final 
#feature regressor layer.
# NASNet is a neural network architecture developed by Google.
# This architecture is specialized for transfer learning, and was discovered via Neural Architecture Search.
# NASNetMobile is a smaller version of NASNet.
model = NASNetMobile()
model = Model(model.input, Dense(1, activation='linear', kernel_initializer='normal')(model.layers[-2].output))

#    model = load_model('current_best.hdf5', custom_objects={'euc_dist_keras': euc_dist_keras})

# This model will use the "Adam" optimizer.
model.compile("adam", euc_dist_keras)
lr_callback = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=0.003)
# This callback will log model stats to Tensorboard.
tb_callback = TensorBoard()
# This callback will checkpoint the best model at every epoch.
mc_callback = ModelCheckpoint(filepath='current_best_mem3.h5', verbose=1, save_best_only=True)
es_callback=EarlyStopping(monitor='val_loss', min_delta=0, patience=4, verbose=0, mode='auto', baseline=None, restore_best_weights=True)

# This is the train DataSequence.
# These are the callbacks.
#callbacks = [lr_callback, tb_callback,mc_callback]
callbacks = [lr_callback, tb_callback,es_callback]

train_pd = pd.read_csv("./train3.txt", delimiter=" ", names=["id", "label"], index_col=None)
test_pd = pd.read_csv("./val3.txt", delimiter=" ", names=["id", "label"], index_col=None)

 #    train_pd = pd.read_csv("./train2.txt",delimiter=" ",header=None,index_col=None)
 #    test_pd = pd.read_csv("./val2.txt",delimiter=" ",header=None,index_col=None)
#model.summary()
batch_size=32
datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = datagen.flow_from_dataframe(dataframe=train_pd, 
directory="./images", x_col="id", y_col="label",
                                              has_ext=True, 
class_mode="other", target_size=(224, 224),
                                              batch_size=batch_size)
valid_generator = datagen.flow_from_dataframe(dataframe=test_pd, directory="./images", x_col="id", y_col="label",
                                              has_ext=True, class_mode="other", target_size=(224, 224),
                                              batch_size=batch_size)

STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size
STEP_SIZE_VALID = valid_generator.n // valid_generator.batch_size
model.fit_generator(generator=train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    validation_data=valid_generator,
                    validation_steps=STEP_SIZE_VALID,
                    callbacks=callbacks,
                    epochs=20)

# we save the model.
model.save_weights(MODEL_WEIGHTS)
model.save(MODEL_NAME)
if __name__ == '__main__':
   # freeze_support() here if program needs to be frozen
    main()
Rizwan
  • 1,210
  • 2
  • 9
  • 21

10 Answers10

182

For me the solution was downgrading the h5py package (in my case to 2.10.0), apparently putting back only Keras and Tensorflow to the correct versions was not enough.

arno_v
  • 18,410
  • 3
  • 29
  • 34
  • 5
    More on this issue: https://github.com/tensorflow/tensorflow/issues/44467 – alexhg Nov 03 '20 at 14:46
  • 3
    From the link by alexhg, `We will have people working on making TF work with h5py >= 3 in the future, but this will only land in TF 2.5 or later.` This issue arises because TensorFlow can't work with h5py v3 and newer. 2.10.0 is the newest version-2.x.y. – Ben Butterworth Nov 26 '20 at 18:04
  • 1
    It worked! I was trying to load a keras model in format .h5 to then save it as a tflite model. – Freddy Daniel Jan 26 '21 at 21:10
  • unfortunately, there is no cp95 wheel with version 2.10.0 for Processor 2 GHz Quad-Core Intel Core i5, getting not supported error, while 3..1.0 is having the issue. – Arpan Saini Feb 24 '21 at 08:37
  • This worked for me thanks a lot! The general rule of thumb is that check Tensorflow, Keras, or any other major library and relate with other dependencies like numpy, h5py, opencv, etc. adjust version using common sense and intuition. – Mahmood Hussain Nov 12 '21 at 03:23
  • Which version of Tensorflow and Keras do you need to make it work? – Niels Hoogeveen Feb 08 '22 at 10:45
122

I downgraded my h5py package with the following command,

pip install 'h5py==2.10.0' --force-reinstall

Restarted my ipython kernel and it worked.

22

For me it was the version of h5py that was superior to my previous build.
Fixed it by setting to 2.10.0.

Ibra
  • 480
  • 6
  • 10
12

Downgrade h5py package with the following command to resolve the issue,

pip install h5py==2.10.0 --force-reinstall
Codemaker2015
  • 12,190
  • 6
  • 97
  • 81
6

saved using TF format file and not h5py: save_format='tf'. In my case:

model.save_weights("NMT_model_weight.tf",save_format='tf')
5

I had the same problem, solved putting compile=False in load_model:

model_ = load_model('path to your model.h5',custom_objects={'Scale': Scale()}, compile=False)
sgd = SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True)
model_.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
desertnaut
  • 57,590
  • 26
  • 140
  • 166
  • Why do we need `custom_objects={'Scale': Scale()}`? – hola Dec 12 '20 at 04:20
  • 2
    Anyway, `compile = False` gives me this error, `File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/saving.py", line 229, in load_model model_config = json.loads(model_config.decode('utf-8')) AttributeError: 'str' object has no attribute 'decode'` – hola Dec 12 '20 at 04:21
  • 1
    I have the same problem but compile=False is irrelevant :( – Marco Pestrin Jan 10 '21 at 20:59
  • 2
    It does not help. – MichalSzczep Jan 13 '21 at 11:04
3

This is probably due to a model saved from a different version of keras. I got the same problem when loading a model generated by tensorflow.keras (which is similar to keras 2.1.6 for tf 1.12 I think) from keras 2.2.6.

You can load the weights with model.load_weights and resave the complete model from the keras version you want to use.

Eric Fournie
  • 1,362
  • 8
  • 10
  • 4
    But its also happening on the same machine i used to train the model. Same error... – Rizwan Dec 12 '18 at 12:58
  • 1
    and yes, you are right, with `model.load_weights` i can do that, but i was wondering why i can not load the whole model architecture – Rizwan Dec 12 '18 at 13:00
2

The solution than works for me was:

pip3 uninstall keras
pip3 uninstall tensorflow
pip3 install --upgrade pip3
pip3 install tensorflow
pip3 install keras
pcampana
  • 2,413
  • 2
  • 21
  • 39
1

I still kept having this error after having tensorflow==2.4.1, h5py==2.1.0, and python 3.8 in my environment. what fixed it was downgrading the python version to 3.6.9

0

Downgrading python, tensorflow, keras and h5py resolved the issue.

python -> 3.6.2

pip install tensorflow==1.3.0
pip install keras==2.1.2
pip install 'h5py==2.10.0' --force-reinstall
Akhilesh
  • 525
  • 1
  • 9
  • 16