from __future__ import print_function
import numpy as np
from keras.applications.vgg16 import VGG16
from keras.layers import *
from keras.models import Model, load_model
from keras.optimizers import SGD
# from keras.optimizers import gradient_descent_v2
from keras.preprocessing.image import load_img, img_to_array
import tensorflow.compat.v1 as tf
from keras import backend as K
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
K.set_session(sess)
def convnet_model_():
vgg_model = VGG16(weights=None, include_top=False)
x = vgg_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.6)(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.6)(x)
x = Lambda(lambda x_: K.l2_normalize(x, axis=1))(x)
convnet_model = Model(inputs=vgg_model.input, outputs=x)
return convnet_model
def deep_rank_model():
convnet_model = convnet_model_()
first_input = Input(shape=(224, 224, 3))
first_conv = Conv2D(96, kernel_size=(8, 8), strides=(16, 16), padding='same')(first_input)
first_max = MaxPool2D(pool_size=(3, 3), strides=(4, 4), padding='same')(first_conv)
first_max = Flatten()(first_max)
first_max = Lambda(lambda x: K.l2_normalize(x, axis=1))(first_max)
second_input = Input(shape=(224, 224, 3))
second_conv = Conv2D(96, kernel_size=(8, 8), strides=(32, 32), padding='same')(second_input)
second_max = MaxPool2D(pool_size=(7, 7), strides=(2, 2), padding='same')(second_conv)
second_max = Flatten()(second_max)
second_max = Lambda(lambda x: K.l2_normalize(x, axis=1))(second_max)
merge_one = concatenate([first_max, second_max])
merge_two = concatenate([merge_one, convnet_model.output])
emb = Dense(4096)(merge_two)
l2_norm_final = Lambda(lambda x: K.l2_normalize(x, axis=1))(emb)
final_model = Model(inputs=[first_input, second_input, convnet_model.input], outputs=l2_norm_final)
return final_model
I am refering to online code to perform a deep ranking model training...I would like to save the model but fail to. I know that the lambda layer is stopping me to save the model. As I got from Checkpointing keras model: TypeError: can't pickle _thread.lock objects knew that the tensorflow object may stop me form saving the model
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-20-bdb0097d23ba> in <module>()
3 deep_rankmodel.save_weights(model_path)
4 f = open('deepranking.json','w')
----> 5 f.write(deep_rankmodel.to_json())
6 f.close()
29 frames
/usr/lib/python3.7/copy.py in deepcopy(x, memo, _nil)
167 reductor = getattr(x, "__reduce_ex__", None)
168 if reductor:
--> 169 rv = reductor(4)
170 else:
171 reductor = getattr(x, "__reduce__", None)
TypeError: can't pickle _thread.RLock objects
Here are some snippet of the debug screen
Debug Btw Is there any way of not using saved json model to load the model in server? Can I reconstruct the model in server using javascript or anything?