我正在从tf-hub加载保存的模型,然后对其进行微调并保存以备将来使用。
在此步骤中,模块的大小从800Mb增加到2.3Gb。由于Adam优化器的变量。
所以-问题是我能以某种方式保存与导入时相同的变量列表的微调模型吗?
保存模型:
export_dir = "../model/1"
with tf.Session(graph=tf.Graph()) as sess:
module = hub.Module("https://tfhub.dev/google/universal-sentence-encoder-large/3",trainable=True)
text_input = tf.placeholder(dtype=tf.string,shape=[None])
embeddings = module(text_input)
sess.run([tf.global_variables_initializer(),tf.tables_initializer()])
tf.saved_model.simple_save(sess,export_dir=export_dir,inputs={'text': text_input},outputs={'embeddings': embeddings},legacy_init_op=tf.tables_initializer())
微调:
raph=tf.Graph()
with tf.Session(graph=graph) as sess:
model = tf.saved_model.loader.load(export_dir=export_dir,sess=sess,tags=[tag_constants.SERVING])
# universal sentence encoder input/output
input_tensor_name = model.signature_def[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY].inputs['text'].name
in_tensor = tf.get_default_graph().get_tensor_by_name(input_tensor_name)
embedd_tensor_name = model.signature_def[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY].outputs[
'embeddings'].name
out_tensor = tf.get_default_graph().get_tensor_by_name(embedd_tensor_name)
# classification on top of universal sentence encoder
input_y = tf.placeholder(tf.int32,shape=(None))
labels = tf.one_hot(input_y,len(set(label)))
logits = tf.layers.dense(out_tensor,len(set(label)))
loss = tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels)
optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
#init optimizer variables
uninitialized_vars = []
for var in tf.all_variables():
try:
sess.run(var)
except tf.errors.FailedPreconditionError:
uninitialized_vars.append(var)
sess.run(tf.initialize_variables(uninitialized_vars))
#train
for epoch in range(2):
feed_dict = {
in_tensor: text,input_y: label
}
sess.run(optimizer,feed_dict)
#Save tuned model
save_path = export_dir+'_mod'
tf.saved_model.simple_save(sess,save_path,inputs={'text':in_tensor},outputs={'embeddings':out_tensor})
我想到的是-我可以过滤出变量列表,而无需其他优化程序的变量。但是,如何仅使用此变量将模型保存在.pb中?
#Exclude optimizer vars from save
all_vars = tf.global_variables()
exclude_vars = tf.contrib.framework.get_variables_by_suffix('Adam')
vars = [item for item in all_vars if item not in exclude_vars]
似乎tf.train.Saver(tf.trainable_variables())
没问题
但是我需要.pb格式。