代码之家  ›  专栏  ›  技术社区  ›  John

使用softmax\u cross\u entropy\u with\u logits保存/恢复Tensorflow模型

  •  2
  • John  · 技术社区  · 7 年前

    我在恢复和执行使用 tf.layers tf.nn.softmax_cross_entropy_with_logits

    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    import os
    import numpy as np
    os.environ["CUDA_VISIBLE_DEVICES"] = "0" # Set GPU device
    
    mnist = input_data.read_data_sets('/tmp/data/', one_hot=True) # Download MNIST data and class
    
    
    saver_model = './tmp/saved_model'
    
    
    n_classes = 10      # Number of classifiers (0-9)
    num_input = 784     # Image size (28x28)
    n_train = 20000     # number of images in data set
    n_epoch = 10        # number of time to itterate over the data set
    batch_size = 128    # Number of images to average for each training calculation
    n_test = 6000        # Number of images to perform inference on
    display_step = 200  # How often to show progress
    
    # Create placeholders for input and classifier data (like maloc)
    x = tf.placeholder('float', [None, num_input], name='inputdata')
    y = tf.placeholder('float')
    
    
    # Define the neural network structure:
    # Input Data -> Conv -> Conv -> Fully Connected -> Fully Connected -> Output Data
    def network(x_in):
        inputl = tf.reshape(x_in, shape=[-1, 28, 28, 1], name='inputl')  #[Batch Size, Height, Width, Channel]
        layer0 = tf.layers.conv2d(inputl, 32, [5, 5], activation=tf.nn.relu, name='layer0')
        layer1 = tf.layers.max_pooling2d(layer0, 2, 2, name='layer1')
        layer2 = tf.layers.conv2d(layer1, 64, [3, 3], activation=tf.nn.relu, name='layer2')
        layer3 = tf.layers.max_pooling2d(layer2, 2, 2, name='layer3')
        layer4 = tf.contrib.layers.flatten(layer3)
        layer5 = tf.layers.dense(layer4, 1024, activation=tf.nn.relu, name='layer5')
        output = tf.layers.dense(layer5, n_classes, name='output')
        return output
    
    prediction = network(x)
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y, name='softmax'))
    optimizer = tf.train.AdamOptimizer().minimize(cost)
    init = tf.global_variables_initializer()
    
    sess = tf.Session()
    sess.run(init)
    saver = tf.train.Saver()
    
    n_itter = n_epoch*(n_train/batch_size)
    for i in range(n_itter):
        batch_x, batch_y = mnist.train.next_batch(batch_size)
        _, l = sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y})
        if i % display_step == 0:
            print '%d / %d' % (i, n_itter)
    saver.save(sess, saver_model)
    
    # Infer
    success_ctr = 0.0
    for i in range(n_test):
        batch_x, batch_y = mnist.test.next_batch(1)
        g = sess.run(prediction, feed_dict={x: batch_x})
        success_ctr += float(np.argmax(g) == np.argmax(batch_y))
    print('PCC = %1.3e' % (success_ctr/n_test))
    

    这成功地进行了培训,PCC为98%。

    现在我想恢复保存的模型并对其进行推断,但我在定义预测函数时遇到了问题。我的还原/推断代码是:

    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    import numpy as np
    import os
    import pprint
    
    os.environ["CUDA_VISIBLE_DEVICES"] = "0" # Set GPU device
    n_test = 6000        # Number of images to perform inference on
    mnist = input_data.read_data_sets('/tmp/data/', one_hot=True) # Download MNIST data and class
    
    saver_dir = './tmp'
    saver_model = os.path.join(saver_dir, 'saved_model')
    
    saver = tf.train.import_meta_graph(saver_model + '.meta')
    graph = tf.get_default_graph()
    sess = tf.Session()
    saver.restore(sess, tf.train.latest_checkpoint(saver_dir))
    
    pprint.pprint([v.name for v in tf.global_variables()])
    
    x = graph.get_tensor_by_name('inputdata:0')
    prediction = graph.get_tensor_by_name('output/bias:0')
    
    # Infer
    success_ctr = 0.0
    for i in range(n_test):
        batch_x, batch_y = mnist.test.next_batch(1)
        g = sess.run(prediction, feed_dict={x: batch_x})
        success_ctr += float(np.argmax(g) == np.argmax(batch_y))
    print('PCC = %1.3e' % (success_ctr/n_test))
    

    其输出:

    [u'layer0/kernel:0',
     u'layer0/bias:0',
     u'layer2/kernel:0',
     u'layer2/bias:0',
     u'layer5/kernel:0',
     u'layer5/bias:0',
     u'output/kernel:0',
     u'output/bias:0',
     u'beta1_power:0',
     u'beta2_power:0',
     u'layer0/kernel/Adam:0',
     u'layer0/kernel/Adam_1:0',
     u'layer0/bias/Adam:0',
     u'layer0/bias/Adam_1:0',
     u'layer2/kernel/Adam:0',
     u'layer2/kernel/Adam_1:0',
     u'layer2/bias/Adam:0',
     u'layer2/bias/Adam_1:0',
     u'layer5/kernel/Adam:0',
     u'layer5/kernel/Adam_1:0',
     u'layer5/bias/Adam:0',
     u'layer5/bias/Adam_1:0',
     u'output/kernel/Adam:0',
     u'output/kernel/Adam_1:0',
     u'output/bias/Adam:0',
     u'output/bias/Adam_1:0']
    PCC = 9.567e-02
    

    我在想我应该定义为预测的张量是“输出/偏差:0”,但这不起作用。我怀疑我的问题在于 tf。nn。softmax\u cross\u entropy\u with\u logits 函数,该函数在my network(x_in) 作用也许我完全不知道如何修复这件事,但如果有任何帮助,我将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Maxim    7 年前

    首先,您提供的列表是 变量 . 您感兴趣的是 占位符 inputdata 以及 op公司 对应于 output tf.layers.dense ,在您的情况下添加)。这不是偏差变量。

    请注意,如果您只是想 argmax 根据推断,没有必要这样做 softmax . 因此,您可以拨打:

    # Another option:
    # prediction = graph.get_operation_by_name('output/BiasAdd')
    prediction = graph.get_tensor_by_name('output/BiasAdd:0')
    

    但由于推断概率分布通常很有用,因此最好在图中为其创建另一个op:

    result = tf.nn.softmax(prediction, name='softmax')
    

    ... 然后:

    prediction = graph.get_operation_by_name('softmax')
    

    请注意,此op不会用于培训,仅用于测试。