2016-07-26 89 views
1

我正在加載cifar-10數據集,這些方法將數據添加到張量數組中,所以要訪問我使用的.eval()會話中的數據,在一個正常的tf常量上它返回值,但在標籤和列車組,其不會是TF陣列它tensorflow:.eval()永不結束

1-我使用搬運工tensorflow-jupyter

2-它使用Python 3

3-批處理文件必須添加到數據文件夾中

我正在使用第一批[data_batch_1.bin]從該文件

http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz

作爲筆記本:

https://drive.google.com/open?id=0B_AFMME1kY1obkk1YmJHcjV0ODA

代碼[如tensorflow網站,但修改爲1個貼片] [檢查最後7行的數據加載]:

from __future__ import absolute_import 
from __future__ import division 
from __future__ import print_function 

import os 
import urllib 
import tensorflow as tf 
from six.moves import xrange # pylint: disable=redefined-builtin 

# Global constants describing the CIFAR-10 data set. 
NUM_CLASSES = 10 
NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN = 5000 
NUM_EXAMPLES_PER_EPOCH_FOR_EVAL = 1000 
IMAGE_SIZE = 32 

def _generate_image_and_label_batch(image, label, min_queue_examples, 
            batch_size, shuffle): 
    """Construct a queued batch of images and labels. 
    Args: 
    image: 3-D Tensor of [height, width, 3] of type.float32. 
    label: 1-D Tensor of type.int32 
    min_queue_examples: int32, minimum number of samples to retain 
     in the queue that provides of batches of examples. 
    batch_size: Number of images per batch. 
    shuffle: boolean indicating whether to use a shuffling queue. 
    Returns: 
    images: Images. 4D tensor of [batch_size, height, width, 3] size. 
    labels: Labels. 1D tensor of [batch_size] size. 
    """ 
    # Create a queue that shuffles the examples, and then 
    # read 'batch_size' images + labels from the example queue. 
    num_preprocess_threads = 2 
    if shuffle: 
    images, label_batch = tf.train.shuffle_batch(
     [image, label], 
     batch_size=batch_size, 
     num_threads=num_preprocess_threads, 
     capacity=min_queue_examples + 3 * batch_size, 
     min_after_dequeue=min_queue_examples) 
    else: 
    images, label_batch = tf.train.batch(
     [image, label], 
     batch_size=batch_size, 
     num_threads=num_preprocess_threads, 
     capacity=min_queue_examples + 3 * batch_size) 

    # Display the training images in the visualizer. 
    tf.image_summary('images', images) 

    return images, tf.reshape(label_batch, [batch_size]) 

def read_cifar10(filename_queue): 
    """Reads and parses examples from CIFAR10 data files. 
    Recommendation: if you want N-way read parallelism, call this function 
    N times. This will give you N independent Readers reading different 
    files & positions within those files, which will give better mixing of 
    examples. 
    Args: 
    filename_queue: A queue of strings with the filenames to read from. 
    Returns: 
    An object representing a single example, with the following fields: 
     height: number of rows in the result (32) 
     width: number of columns in the result (32) 
     depth: number of color channels in the result (3) 
     key: a scalar string Tensor describing the filename & record number 
     for this example. 
     label: an int32 Tensor with the label in the range 0..9. 
     uint8image: a [height, width, depth] uint8 Tensor with the image data 
    """ 

    class CIFAR10Record(object): 
    pass 
    result = CIFAR10Record() 

    # Dimensions of the images in the CIFAR-10 dataset. 
    # See http://www.cs.toronto.edu/~kriz/cifar.html for a description of the 
    # input format. 
    label_bytes = 1 # 2 for CIFAR-100 
    result.height = 32 
    result.width = 32 
    result.depth = 3 
    image_bytes = result.height * result.width * result.depth 
    # Every record consists of a label followed by the image, with a 
    # fixed number of bytes for each. 
    record_bytes = label_bytes + image_bytes 

    # Read a record, getting filenames from the filename_queue. No 
    # header or footer in the CIFAR-10 format, so we leave header_bytes 
    # and footer_bytes at their default of 0. 
    reader = tf.FixedLengthRecordReader(record_bytes=record_bytes) 
    result.key, value = reader.read(filename_queue) 

    # Convert from a string to a vector of uint8 that is record_bytes long. 
    record_bytes = tf.decode_raw(value, tf.uint8) 

    # The first bytes represent the label, which we convert from uint8->int32. 
    result.label = tf.cast(
     tf.slice(record_bytes, [0], [label_bytes]), tf.int32) 

    # The remaining bytes after the label represent the image, which we reshape 
    # from [depth * height * width] to [depth, height, width]. 
    depth_major = tf.reshape(tf.slice(record_bytes, [label_bytes], [image_bytes]), 
          [result.depth, result.height, result.width]) 
    # Convert from [depth, height, width] to [height, width, depth]. 
    result.uint8image = tf.transpose(depth_major, [1, 2, 0]) 

    return result 

def inputs(eval_data, data_dir, batch_size): 
    """Construct input for CIFAR evaluation using the Reader ops. 
    Args: 
    eval_data: bool, indicating if one should use the train or eval data set. 
    data_dir: Path to the CIFAR-10 data directory. 
    batch_size: Number of images per batch. 
    Returns: 
    images: Images. 4D tensor of [batch_size, IMAGE_SIZE, IMAGE_SIZE, 3] size. 
    labels: Labels. 1D tensor of [batch_size] size. 
    """ 
    filenames=[]; 
    filenames.append(os.path.join(data_dir, 'data_batch_1.bin') ) 
    num_examples_per_epoch = NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN 


    print(filenames) 


    # Create a queue that produces the filenames to read. 
    filename_queue = tf.train.string_input_producer(filenames) 

    # Read examples from files in the filename queue. 
    read_input = read_cifar10(filename_queue) 
    reshaped_image = tf.cast(read_input.uint8image, tf.float32) 

    height = IMAGE_SIZE 
    width = IMAGE_SIZE 

    # Image processing for evaluation. 
    # Crop the central [height, width] of the image. 
    resized_image = tf.image.resize_image_with_crop_or_pad(reshaped_image, 
                 width, height) 

    # Subtract off the mean and divide by the variance of the pixels. 
    float_image = tf.image.per_image_whitening(resized_image) 

    # Ensure that the random shuffling has good mixing properties. 
    min_fraction_of_examples_in_queue = 0.4 
    min_queue_examples = int(num_examples_per_epoch * 
          min_fraction_of_examples_in_queue) 

    # Generate a batch of images and labels by building up a queue of examples. 
    return _generate_image_and_label_batch(float_image, read_input.label, 
             min_queue_examples, batch_size, 
             shuffle=False) 
sess = tf.InteractiveSession() 
train_data,train_labels = inputs(False,"data",6000) 
print (train_data,train_labels) 
train_data=train_data.eval() 
train_labels=train_labels.eval() 
print(train_data) 
print(train_labels) 
sess.close() 

回答

11

必須調用tf.train.start_queue_runners(sess)你打電話train_data.eval()或前。

這是如何TensorFlow輸入管道被實現第(n不幸)的後果:在tf.train.string_input_producer()tf.train.shuffle_batch(),和tf.train.batch()內部功能在輸入管道創建隊列的不同階段之間的緩衝區的記錄。 tf.train.start_queue_runners()調用告訴TensorFlow開始將記錄提取到這些緩衝區中;如果不調用緩衝區,緩衝區將保持爲空,並且eval()會無限期地掛起。