当前位置: 首页 > 知识库问答 >
问题:

如何使用tensorflow中保存的模型[副本]

阎啸
2023-03-14
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")

历元3...验证精度=0.933

历元4...验证精度=0.958

历元5...验证精度=0.965

共有1个答案

郎鹤龄
2023-03-14

简而言之,我建议使用tf.datatf.saved_modelAPI。有两种机制:tf.train.saver()或基于前一种机制的更高级别的APItf.saved_model。你可以在其他帖子link1和Link2中找到不同之处。我试图为您编写后一个代码的伪代码,但我最终得到了以下所有代码片段。希望有帮助:

培训部分:

# 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://stackoverflow.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}
 类似资料:
  • 我有训练DNN网络的代码。我不想每次都训练这个网络,因为它占用了太多的时间。如何保存模型? 运行此函数后,我得到一个,我想保存它。

  • 在tenstorflow 2.0中,一旦模型被训练,我们如何保存模型以防止从一开始就重新训练它?

  • 在TensorFlow中训练模型后: 如何保存已训练的模型? 以后如何还原此保存的模型?

  • 问题内容: 在中训练模型后: 你如何保存经过训练的模型? 以后如何恢复此保存的模型? 问题答案: 从文档: 保存 这仍然是测试版,因此我建议不要使用。如果你仍然想走那条路,这里是tf.saved_model使用指南 Tensorflow <2 simple_save 为了完整起见,我给出了很多好答案,我将加2美分:。也是使用 的独立代码示例。 恢复: 独立示例 为了演示,以下代码生成随机数据。 我

  • 本文向大家介绍TensorFlow入门使用 tf.train.Saver()保存模型,包括了TensorFlow入门使用 tf.train.Saver()保存模型的使用技巧和注意事项,需要的朋友参考一下 关于模型保存的一点心得 在定义 saver 的时候一般会定义最多保存模型的数量,一般来说,如果模型本身很大,我们需要考虑到硬盘大小。如果你需要在当前训练好的模型的基础上进行 fine-tune,那

  • 我将Deeplearning4j(Ver.1.0.0-M1.1)用于构建神经网络。 我以Deeplearning4j中的IrisClassifier为例。 我怎么能得到预测? 萨克斯!