使用tf.saved_model.simple_save选择要保存在模型中的变量

我正在从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格式。

lqlqtotti 回答:使用tf.saved_model.simple_save选择要保存在模型中的变量

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3158206.html

大家都在问