When I try to load my trained tf.keras
model, I get the error: JSONDecodeError: Expecting value
.
The issue is not reproducible, i.e., I get the error when I try to load a model that I have trained on a cluster and downloaded to my computer. When I tried to just compile, save, and load the same model, the error doesn't appear.
Any ideas what the issue could be?
The following code works (as opposed to loading the trained model):
import tensorflow as tf
from tensorflow import keras as ks
import numpy as np
import os
def UNet(n_classes, input_shape = (256, 256, 3), dropout = 0.05,
ops = {"activation" : "relu",
"padding" : "same",
"kernel_initializer" : "he_normal"
}):
# input layer
inputz = ks.layers.Input(shape = input_shape)
# encoder part
## 1st convolution
c1 = ks.layers.Conv2D(64, (3, 3), **ops)(inputz)
c1 = ks.layers.Conv2D(64, (3, 3), **ops)(c1)
## 1st max pooling
p1 = ks.layers.MaxPooling2D(pool_size = (2, 2))(c1)
## 2nd convolution
c2 = ks.layers.Conv2D(128, (3, 3), **ops)(p1)
c2 = ks.layers.Conv2D(128, (3, 3), **ops)(c2)
## 2nd max pooling
p2 = ks.layers.MaxPooling2D(pool_size = (2, 2))(c2)
## 3rd convolution
c3 = ks.layers.Conv2D(256, (3, 3), **ops)(p2)
c3 = ks.layers.Conv2D(256, (3, 3), **ops)(c3)
## 3rd max pooling
p3 = ks.layers.MaxPooling2D(pool_size = (2, 2))(c3)
## 4th convolution
c4 = ks.layers.Conv2D(512, (3, 3), **ops)(p3)
c4 = ks.layers.Conv2D(512, (3, 3), **ops)(c4)
## Drop
d4 = ks.layers.Dropout(dropout)(c4)
## 4th max pooling
p4 = ks.layers.MaxPooling2D(pool_size = (2, 2))(d4)
## 5th convolution
c5 = ks.layers.Conv2D(1024, (3, 3), **ops)(p4)
c5 = ks.layers.Conv2D(1024, (3, 3), **ops)(c5)
## Drop
d5 = ks.layers.Dropout(dropout)(c5)
# decoder part
## 1st up convolution
us6 = ks.layers.UpSampling2D(size = (2, 2))(d5)
up6 = ks.layers.Conv2D(512, (2, 2), **ops)(us6)
## merge
ct6 = ks.layers.concatenate([d4, up6], axis = 3)
uc6 = ks.layers.Conv2D(512, (3, 3), **ops)(ct6)
uc6 = ks.layers.Conv2D(512, (3, 3), **ops)(uc6)
## 2nd up convolution
us7 = ks.layers.UpSampling2D(size = (2, 2))(uc6)
up7 = ks.layers.Conv2D(256, (2, 2), **ops)(us7)
## merge
ct7 = ks.layers.concatenate([c3, up7], axis = 3)
uc7 = ks.layers.Conv2D(256, (3, 3), **ops)(ct7)
uc7 = ks.layers.Conv2D(256, (2, 2), **ops)(uc7)
## 3rd up convolution
us8 = ks.layers.UpSampling2D(size = (2, 2))(uc7)
up8 = ks.layers.Conv2D(128, (2, 2), **ops)(us8)
## merge
ct8 = ks.layers.concatenate([c2, up8], axis = 3)
uc8 = ks.layers.Conv2D(128, (3, 3), **ops)(ct8)
uc8 = ks.layers.Conv2D(128, (3, 3), **ops)(uc8)
## 4th up convolution
us9 = ks.layers.UpSampling2D(size = (2, 2))(uc8)
up9 = ks.layers.Conv2D(64, (2, 2), **ops)(us9)
## merge
ct9 = ks.layers.concatenate([c1, up9], axis = 3)
uc9 = ks.layers.Conv2D(64, (3, 3), **ops)(ct9)
uc9 = ks.layers.Conv2D(64, (3, 3), **ops)(uc9)
uc9 = ks.layers.Conv2D(2, (3, 3), **ops)(uc9)
# output layer
if n_classes > 2:
activ = "softmax"
else:
activ = "sigmoid"
outputz = ks.layers.Conv2D(n_classes, 1, activation = activ)(uc9)
model = ks.Model(inputs = [inputz], outputs = [outputz])
print(model.summary())
print(f'Total number of layers: {len(model.layers)}')
return model
# get model
model = UNet(n_classes = 5)
class UpdatedMeanIoU(tf.keras.metrics.MeanIoU):
def __init__(self,
y_true = None,
y_pred = None,
num_classes = None,
name = None,
dtype = None):
super(UpdatedMeanIoU, self).__init__(num_classes = num_classes,
name = name, dtype = dtype)
def update_state(self, y_true, y_pred, sample_weight = None):
y_pred = tf.math.argmax(y_pred, axis = -1)
return super().update_state(y_true, y_pred, sample_weight)
mIoU = UpdatedMeanIoU(num_classes = 5)
lr_sched = ks.optimizers.schedules.ExponentialDecay(
initial_learning_rate = 1e-3,
decay_steps = np.floor(50),
decay_rate = 0.995)
optimizer = ks.optimizers.RMSprop(learning_rate = lr_sched, clipnorm = 1)
lozz = ks.losses.SparseCategoricalCrossentropy()
model.compile(optimizer = optimizer, loss = lozz,
metrics = [mIoU])
model.save("G:\\mot", save_format = "tf")
os.chdir("G:\\mot")
trained_model = ks.models.load_model("G:\\mot", custom_objects = {"UpdatedMeanIoU": mIoU})
The part code that does not work just includes a model.fit
between model.compile
and model.save
.
The corrupt model can be found here.
This is the full error message:
trained_model = ks.models.load_model(moddir,\
custom_objects = {"UpdatedMeanIoU": mIoU})
Traceback (most recent call last):
File "<ipython-input-140-4d44f44a3739>", line 1, in <module>
trained_model = ks.models.load_model(moddir,\
File "c:\users\manuel\python\lib\site-packages\tensorflow\python\keras\saving\save.py", line 206, in load_model
return saved_model_load.load(filepath, compile, options)
File "c:\users\manuel\python\lib\site-packages\tensorflow\python\keras\saving\saved_model\load.py", line 155, in load
keras_loader.finalize_objects()
File "c:\users\manuel\python\lib\site-packages\tensorflow\python\keras\saving\saved_model\load.py", line 626, in finalize_objects
self._reconstruct_all_models()
File "c:\users\manuel\python\lib\site-packages\tensorflow\python\keras\saving\saved_model\load.py", line 645, in _reconstruct_all_models
self._reconstruct_model(model_id, model, layers)
File "c:\users\manuel\python\lib\site-packages\tensorflow\python\keras\saving\saved_model\load.py", line 661, in _reconstruct_model
config = json_utils.decode(
File "c:\users\manuel\python\lib\site-packages\tensorflow\python\keras\saving\saved_model\json_utils.py", line 62, in decode
return json.loads(json_string, object_hook=_decode_helper)
File "c:\users\manuel\python\lib\json\__init__.py", line 359, in loads
return cls(**kw).decode(s)
File "c:\users\manuel\python\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:\users\manuel\python\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
JSONDecodeError: Expecting value
Edit:
I can load the model on the server where I trained it (in a separate Python session). However, I cannot do the same on my computer after downloading the files. Are there some hidden files the model depends on? Or can there be problems with different OS or different module versions?