如何在tensorflow中使用保存的模型[重复]

Posted

技术标签:

【中文标题】如何在tensorflow中使用保存的模型[重复]【英文标题】:How to use the saved model in tensorflow [duplicate] 【发布时间】:2019-08-30 00:57:51 【问题描述】:

首先,我按照人们的指示尝试恢复模型,但我还没有找到任何线索。 以下是我保存模型的代码,模型已成功保存。

import tensorflow as tf
from sklearn.utils import shuffle
EPOCHS = 10
BATCH_SIZE = 128

x = tf.placeholder(tf.float32, (None, 32, 32, 3),name='x')
y = tf.placeholder(tf.int32, (None),name='y')
one_hot_y = tf.one_hot(y, 43)

rate = 0.001

logits = LeNet(x)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=one_hot_y, logits=logits)
loss_operation = tf.reduce_mean(cross_entropy)
optimizer = tf.train.AdamOptimizer(learning_rate = rate)
training_operation = optimizer.minimize(loss_operation)

correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(one_hot_y, 1))
accuracy_operation = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
saver = tf.train.Saver()

def evaluate(TrainX, trainLabels):
    num_examples = len(TrainX)
    total_accuracy = 0
    sess = tf.get_default_session()
    for offset in range(0, num_examples, BATCH_SIZE):
        batch_x, batch_y = TrainX[offset:offset+BATCH_SIZE], trainLabels[offset:offset+BATCH_SIZE]
        accuracy = sess.run(accuracy_operation, feed_dict=x: batch_x, y: batch_y)
        total_accuracy += (accuracy * len(batch_x))
    return total_accuracy / num_examples

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    num_examples = len(trainImages)

    print("Training...")
    print()
    for i in range(EPOCHS):
        TrainX, trainLabels = shuffle(TrainX, trainLabels)
        for offset in range(0, num_examples, BATCH_SIZE):
            end = offset + BATCH_SIZE
            batch_x, batch_y = TrainX[offset:end], trainLabels[offset:end]
            sess.run(training_operation, feed_dict=x: batch_x, y: batch_y)

        validation_accuracy = evaluate(TrainX, trainLabels)
        print("EPOCH  ...".format(i+1))
        print("Validation Accuracy = :.3f".format(validation_accuracy))
        print()

    saver.save(sess, './lenet')
    print("Model saved")

培训...

时代 1 ... 验证准确度 = 0.765

时代 2 ... 验证准确度 = 0.911

第三纪元 ... 验证准确度 = 0.933

纪元 4 ... 验证准确度 = 0.958

纪元 5 ... 验证准确度 = 0.965

第 6 纪元 ... 验证准确度 = 0.973

纪元 7 ... 验证准确度 = 0.978

第 8 纪元 ... 验证准确度 = 0.986

纪元 9 ... 验证准确度 = 0.985

纪元 10 ... 验证准确度 = 0.980

模型已保存

我的问题是当我放置新的测试数据时如何使用此模型,假设我放置了 5 个测试数据以查看它们在经过训练模型时的准确度。我想看看正确适合训练模型的测试数据和标签的准确性。感谢您抽出宝贵时间,如果您有不明白的地方,我愿意为您提供更多详细信息。

【问题讨论】:

您可以查看这个问题:***.com/questions/33759623/…。他们已经清楚地解释了这一点。 【参考方案1】:

简而言之,我建议使用tf.datatf.saved_model API。有 2 种机制:tf.train.Saver() 或基于前一种机制的更高级别的 API tf.saved_model。您可以在其他帖子中找到差异link1link2。我试图为您编写后者的伪代码,但我最终想出了所有以下 sn-ps。希望对你有帮助:

培训部分:

# create list of file names: ['0.csv', '1.csv', ...]
totrain_features = [os.path.join('./TrainX/', f) for f in os.listdir('./TrainX/') if f.endswith('.csv')]
totrain_img = [os.path.join('./TrainLabels/', f) for f in os.listdir('./TrainLabels/') if f.endswith('.csv')]
epoch_length = len(totrain_features)

# model starts here
file_names_ph = tf.placeholder(tf.string, shape=(None), name='file_name_ph') #create a ph to put list of file paths
in_pipeline = input_pipeline(file_names_ph) # check standalone code below
nodes = model(in_pipeline['img_next_op'], in_pipeline['label_next_op'])


with tf.Session() as sess:
    sess.run([tf.global_variables_initializer(), in_pipeline['iter_init_op']], feed_dict=file_names_ph: totrain_files)
    for step in tqdm(range(epoch_length)):
        # run train_op
        _ = sess.run(nodes['train_op'])
        # use saver to save weights
        if step % epoch_length == epoch_length - 1: #save last step
            # prepare args for simple_save
            in_dict = 
                'file_names': file_names_ph,
            
            out_dict = 
                'predict': nodes['predict_op'],
                'diff_op': nodes['diff_op']
            
            tf.saved_model.simple_save(sess, './savedmodel', in_dict, out_dict) # This is what you need, the pb file of the graph and variables are saved in savedmodel folder

预测部分:

# input pipeline for predict
# create list of file names: ['0.csv', '1.csv', ...]
topredict_files = [os.path.join('./predict/', f) for f in os.listdir('./predict/') if f.endswith('.csv')]
epoch_length = len(topredict_files)

# save prediction images to /results folder
if not os.path.exists('./results'):
    os.makedirs('./results')

# reset another graph as the default graph
graph2 = tf.Graph()
with graph2.as_default():
    with tf.Session() as sess:
        tf.saved_model.loader.load(
            sess,
            [tf.saved_model.tag_constants.SERVING], './savedmodel'
        ) # here's what you need
        # get operation and so on
        file_names_ph = graph2.get_tensor_by_name('file_name_ph:0')
        predict_tensor = graph2.get_tensor_by_name('Conv1/prediction:0')
        diff_tensor = graph2.get_tensor_by_name('Operations/difference:0')
        iter_init_op = graph2.get_operation_by_name('iter_init_op')

        sess.run(iter_init_op, feed_dict=file_names_ph: topredict_files)
        for step in tqdm(range(epoch_length)):
            predict, difference = sess.run([predict_tensor, diff_tensor])
            # then save your prediction and comparison
            ...

看看我是如何定义管道和模型的:

def input_pipeline(file_names_ph):
    # create new dataset for predict
    dataset = tf.data.Dataset.from_tensor_slices(file_names_ph)

    # apply list of file names to the py function wrapper for reading files
    dataset = dataset.map(_pyfn_wrapper, num_parallel_calls=mp.cpu_count()) # use the tf built-in csv reader or take a look how to use py_func:https://***.com/questions/55363728/how-to-feed-h5-files-in-tf-data-pipeline-in-tensorflow-model

    # construct batch size
    dataset = dataset.batch(1).prefetch(mp.cpu_count())

    # initialize iterator
    iterator = tf.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes)
    iterator_initialize_op = iterator.make_initializer(dataset, name='iter_init_op')

    # get image and labels
    image_getnext_op, label_getnext_op = iterator.get_next()
    return 'img_next_op': image_getnext_op, 'label_next_op': label_getnext_op, 'iter_init_op': iterator_initialize_op


def model(in_ds, out_ds):
    # a simple model
    with tf.name_scope("Conv1"):
        W = tf.get_variable("W", shape=[3, 3, 1, 1],
                             initializer=tf.contrib.layers.xavier_initializer())
        b = tf.get_variable("b", shape=[1], initializer=tf.contrib.layers.xavier_initializer())
        layer1 = tf.nn.conv2d(in_ds, W, strides=[1, 1, 1, 1], padding='SAME') + b
        prediction = tf.nn.relu(layer1, name='prediction')

    with tf.name_scope("Operations"):
        global_step = tf.Variable(0, name='global_step', trainable=False)
        loss = tf.reduce_mean(tf.losses.mean_squared_error(labels=out_ds, predictions=prediction), name='loss')
        train_op = tf.train.AdamOptimizer(learning_rate=0.0001).minimize(loss, name='train_op', global_step=global_step)
        difference_op = tf.cast(tf.equal(prediction, out_ds), dtype=tf.int32, name='difference')
    # I really like dictionary, it's easy to handle
    return 'global_step': global_step, 'loss': loss, 'train_op': train_op, 'diff_op': difference_op, 'predict_op': prediction

【讨论】:

嗨,我试过你的代码,但上面写着name 'accuracy_operation' is not defined,这意味着我必须再次实现该代码?? 我想知道我必须在 main 函数中实现所有代码才能使用保存的模型,例如 accuracy_operation 或 correct_prediction ..

以上是关于如何在tensorflow中使用保存的模型[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c++ 在 tensorflow 中保存模型

将训练有素的 Tensorflow 模型保存到另一台机器上进行推理 [重复]

tensorflow训练好的模型,怎么调用?

转载:tensorflow保存训练后的模型

如何保存使用Tensorflow 1.xx中的.meta检查点模型作为部分的Tensorflow 2.0模型?

如何在 tensorflow 2.0 w/keras 中保存/恢复大型模型?