2017-08-16 2 views
0

Ich benutze this script, um die CIFAR10-Daten in eine TFRECORD-Datei herunterladen und konvertieren ... es endet ohne ein Problem und ich habe eine ordnungsgemäße Binärdatei.
ich dann versuche, meine Datei mit diesem Skript zu importieren:Lesen in einer TFrecord-Datei endet nie

"""Provides data for the Cifar10 dataset. 
The dataset scripts used to create the dataset can be found at: 
tensorflow/models/slim/datasets/download_and_convert_cifar10.py 
""" 

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

import os 
import tensorflow as tf 

import dataset_utils 

slim = tf.contrib.slim 

_FILE_PATTERN = 'cifar10_%s.tfrecord' 

SPLITS_TO_SIZES = {'train': 50000, 'test': 10000} 

_NUM_CLASSES = 10 

_ITEMS_TO_DESCRIPTIONS = { 
    'image': 'A [32 x 32 x 3] color image.', 
    'label': 'A single integer between 0 and 9', 
} 


def get_split(split_name, dataset_dir, file_pattern=None, reader=None): 
    """Gets a dataset tuple with instructions for reading cifar10. 
    Args: 
    split_name: A train/test split name. 
    dataset_dir: The base directory of the dataset sources. 
    file_pattern: The file pattern to use when matching the dataset sources. 
     It is assumed that the pattern contains a '%s' string so that the split 
     name can be inserted. 
    reader: The TensorFlow reader type. 
    Returns: 
    A `Dataset` namedtuple. 
    Raises: 
    ValueError: if `split_name` is not a valid train/test split. 
    """ 
    if split_name not in SPLITS_TO_SIZES: 
     raise ValueError('split name %s was not recognized.' % split_name) 

    if not file_pattern: 
     file_pattern = _FILE_PATTERN 
    file_pattern = os.path.join(dataset_dir, file_pattern % split_name) 

    # Allowing None in the signature so that dataset_factory can use the default. 
    if not reader: 
     reader = tf.TFRecordReader 

    keys_to_features = { 
     'image/encoded': 
     tf.FixedLenFeature((), tf.string, default_value=''), 
     'image/format': 
     tf.FixedLenFeature((), tf.string, default_value='png'), 
     'image/class/label': 
     tf.FixedLenFeature(
      [], tf.int64, default_value=tf.zeros([], dtype=tf.int64)), 
    } 

    items_to_handlers = { 
     'image': slim.tfexample_decoder.Image(shape=[32, 32, 3]), 
     'label': slim.tfexample_decoder.Tensor('image/class/label'), 
    } 

    decoder = slim.tfexample_decoder.TFExampleDecoder(keys_to_features, 
                 items_to_handlers) 

    labels_to_names = None 
    if dataset_utils.has_labels(dataset_dir): 
     labels_to_names = dataset_utils.read_label_file(dataset_dir) 

    return slim.dataset.Dataset(
     data_sources=file_pattern, 
     reader=reader, 
     decoder=decoder, 
     num_samples=SPLITS_TO_SIZES[split_name], 
     items_to_descriptions=_ITEMS_TO_DESCRIPTIONS, 
     num_classes=_NUM_CLASSES, 
     labels_to_names=labels_to_names) 


data = get_split('test', '/path/to/cifar10_dir') 

sess = tf.Session(config=tf.ConfigProto(
    allow_soft_placement=True, log_device_placement=False)) 

coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(coord=coord, sess=sess) 

data_provider = slim.dataset_data_provider.DatasetDataProvider(
    data, num_readers=10, shuffle=True) 
img, lbl = data_provider.get(['image', 'label']) 

es gibt mir auch keinen Fehler, aber wenn ich versuche:

sess.run(img) 

der Prozess hört nie auf. Tensorflow startet die Sitzung, liest aber die Datei nicht, sie gibt die Aufforderung nicht aus und tut im Grunde nichts. Ich werde hier ernsthaft verrückt, weil ich nicht weiß, wo ich anfangen soll. Hat jemand einen Rat?

Antwort

1

sollten Sie beginnen Ihre queue runners nach DatasetDataProvider die auch eine Warteschlange. So ändern Sie es zur folgenden Reihenfolge:

data_provider = slim.dataset_data_provider.DatasetDataProvider(
data, num_readers=10, shuffle=True) 
img, lbl = data_provider.get(['image', 'label']) 

sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)) 

coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(coord=coord, sess=sess) 
+0

du bist ein Held. Danke, dass DatasetDataProvider auch eine Queue ist! –

0

Es scheint, dass Sie die lokalen und globalen Variablen-Initialisierer nicht ausgeführt haben.

sess = tf.Session(config=tf.ConfigProto(
    allow_soft_placement=True, log_device_placement=False)) 
... 
sess.run([tf.global_variables_initializer(), tf.local_variables_initializer()]) 
img_ = sess.run(img) 
+0

danke für Ihre Antwort. Ich habe vergessen, diese hinzuzufügen, das ist wahr. Aber leider habe ich mein Problem nicht behoben, weil es keine Variablen gibt, die eine Initialisierung im Skript benötigen. –

+0

Sie müssen diese init ops ausführen, nachdem Sie data_provider deklariert haben. Es sollte es lösen –

+0

ich habe es nach dem Datenprovider hinzugefügt ... hat nicht funktioniert: -/ –