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

tf.data API无法打印所有批次

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

    tf.data 应用程序编程接口。我正在使用 MNIST batch() 数据集方法。数据的批处理大小为30。由于我的训练集大小为11623,批处理大小为128,因此我将有91个批。最后一批的尺寸为103,这很好,因为这是LSTM。此外,我正在使用辍学。当我计算批次精度时,我关闭了退出。

    完整代码如下所示:

    #Ignore the warnings
    import warnings
    warnings.filterwarnings("ignore")
    
    import pandas as pd
    import tensorflow as tf
    import numpy as np
    
    import matplotlib.pyplot as plt
    plt.rcParams['figure.figsize'] = (8,7)
    
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("MNIST_data/")
    
    Xtrain = mnist.train.images[mnist.train.labels < 2]
    ytrain = mnist.train.labels[mnist.train.labels < 2]
    
    print(Xtrain.shape)
    print(ytrain.shape)
    
    #Data parameters
    num_inputs = 28
    num_classes = 2
    num_steps=28
    
    # create the training dataset
    Xtrain = tf.data.Dataset.from_tensor_slices(Xtrain).map(lambda x: tf.reshape(x,(num_steps, num_inputs)))
    # apply a one-hot transformation to each label for use in the neural network
    ytrain = tf.data.Dataset.from_tensor_slices(ytrain).map(lambda z: tf.one_hot(z, num_classes))
    # zip the x and y training data together and batch and Prefetch data for faster consumption
    train_dataset = tf.data.Dataset.zip((Xtrain, ytrain)).batch(128).prefetch(128)
    
    iterator = tf.data.Iterator.from_structure(train_dataset.output_types,train_dataset.output_shapes)
    X, y = iterator.get_next()
    
    training_init_op = iterator.make_initializer(train_dataset)
    
    
    #### model is here ####
    
    #Network parameters
    num_epochs = 2
    batch_size = 128
    output_keep_var = 0.5
    
    with tf.Session() as sess:
        init.run()
    
        print("Initialized")
        # Training cycle
        for epoch in range(0, num_epochs):
            num_batch = 0
            print ("Epoch: ", epoch)
            avg_cost = 0.
            avg_accuracy =0
            total_batch = int(11623 / batch_size + 1)
            sess.run(training_init_op)
           while True:
                try:
                    _, miniBatchCost = sess.run([trainer, loss], feed_dict={output_keep_prob: output_keep_var})
                    miniBatchAccuracy = sess.run(accuracy, feed_dict={output_keep_prob: 1.0})
                   print('Batch %d: loss = %.2f, acc = %.2f' % (num_batch, miniBatchCost, miniBatchAccuracy * 100))
                    num_batch +=1
                except tf.errors.OutOfRangeError:
                    break
    

    当我运行此代码时,它似乎正在运行和打印:

    Batch 0: loss = 0.67276, acc = 0.94531
    Batch 1: loss = 0.65672, acc = 0.92969
    Batch 2: loss = 0.65927, acc = 0.89062
    Batch 3: loss = 0.63996, acc = 0.99219
    Batch 4: loss = 0.63693, acc = 0.99219
    Batch 5: loss = 0.62714, acc = 0.9765
    ......
    ......
    Batch 39: loss = 0.16812, acc = 0.98438
    Batch 40: loss = 0.10677, acc = 0.96875
    Batch 41: loss = 0.11704, acc = 0.99219
    Batch 42: loss = 0.10592, acc = 0.98438
    Batch 43: loss = 0.09682, acc = 0.97656
    Batch 44: loss = 0.16449, acc = 1.00000
    

    我可以用 repeat() 函数,但我不希望这样,因为我对最后一批有多余的观察,我希望LSTM来处理它。

    1 回复  |  直到 7 年前
        1
  •  3
  •   xdurch0    7 年前

    当直接基于模型定义模型时,这是一个恼人的陷阱 get_next() tf.data 迭代器。在你的循环中,你有两个 sess.run 这将使迭代器前进一步。这意味着每个循环迭代实际上会消耗两个批次(并且在不同批次上计算损耗和精度)。

    不完全确定是否有一种“规范”的方法来解决这个问题,但是你可以

    • 以相同的方式计算精度 run 呼叫作为成本/培训步骤。这意味着精度计算也会受到辍学遮罩的影响,但由于这是一个仅基于一批的近似值,因此这不应该是一个大问题。
    • 这个 get_next
    推荐文章