I referred to this, I guess, If we only save the weights, then model architecture need always need to be known or documented properly. So, I wanted to save the model with lambda function in Keras.
I tried two approaches:
Approach-1: I did not try to change the vgg_mean function
# Mean of each channel as provided by VGG researchers
vgg_mean = np.array([123.68, 116.779, 103.939]).reshape((3,1,1))
def vgg_preprocess(x):
x = x - vgg_mean # subtract mean
return x[:, ::-1] # reverse axis bgr->rgb
And, then I was able to save the model. But, when I reload the saved model
new_model = load_model('my_model_copy2.h5',custom_objects={'vgg_mean': vgg_mean})
I get error mentioning 'global name vgg_mean is not defined". Gist file for this working is located here.
Approach 2:
I referred to this: and changed vgg_preprocess function as below:
def vgg_preprocess(x, vgg_mean):
x = x - vgg_mean # subtract mean
return x[:, ::-1]
def VGG_16():
model = Sequential()
model.add(Lambda(vgg_preprocess, arguments={'vgg_mean':vgg_mean},input_shape=(3,224,224)))
ConvBlock(2, model, 64)
ConvBlock(2, model, 128)
ConvBlock(3, model, 256)
ConvBlock(3, model, 512)
ConvBlock(3, model, 512)
model.add(Flatten())
FCBlock(model)
FCBlock(model)
model.add(Dense(1000, activation='softmax'))
return model
I get below error, when I try to save the model:
ValueError: can only convert an array of size 1 to a Python scalar
Gist file for this working is here.
How to save the model both architecture and weights with lambda function? Please let me know, if you succeed.