2017-02-12 10 views
0

Ich verwende den TFrecord, um mit Sequenzen Datenmenge umzugehen. Wenn ein Beispiel in den Speicher geladen wird, erhalte ich zwei Kontextmerkmale und ein Sequenzmerkmal. Die Kontextmerkmale sind die Länge der Sequenzen und die Bezeichnung der Sequenzen. Das Sequenzmerkmal ist eine Liste von Bytes, die das Merkmal jedes Zeitschrittes repräsentieren. So habe ich drei Tensor für jedes Beispiel:Funktion tf.slice_input_producer Fehler mit Tensorflow

length TensorShape([]) 
label TensorShape([]) 
frames TensorShape([Dimension(None)]) 

Ich mag jede Sequenz-Funktion verwenden, um das Etikett zu prognostizieren, also muß ich das Etikett die gleiche Länge wie der Rahmen sein machen.

length=tf.expand_dims(length, 0, name='expand_length') 
label=tf.expand_dims(label, 0, name='expand_label') 
labels=tf.tile(label, length, name='multi_label') 

Dieses Mal habe ich die folgenden res erhalten:

labels TensorShape([Dimension(None)]) 
frames TensorShape([Dimension(None)]) 

Und ich habe sie in eine Warteschlange zu drücken, so dass ich einen einzigen Frame und Label zu bekommen.

frame, label=tf.train.slice_input_producer([frames, labels]) 

Ant dann Batch sie dann tun die net Training Routine.

frames, labels = tf.train.shuffle_batch([frame, label], 4, 16, 8) 

Es sollte jedoch arbeiten, geschehen Fehler in der Funktion tf.train.slice_input_producer Hier ist der Fehler Info:

W d:\build\tensorflow\tensorflow_gpu-r0.12\tensorflow\core\framework\op_kernel.cc:975] Invalid argument: indices = 119 is not in [0, 117) 
     [[Node: slice_timestep/Gather = Gather[Tindices=DT_INT32, Tparams=DT_STRING, validate_indices=true, _device="/job:localhost/replica:0/task:0/cpu:0"](parse_one_ex/parse_one_ex:2, slice_timestep/fraction_of_32_full_Dequeue)]] 
W d:\build\tensorflow\tensorflow_gpu-r0.12\tensorflow\core\framework\op_kernel.cc:975] Invalid argument: indices = 119 is not in [0, 117) 
     [[Node: slice_timestep/Gather = Gather[Tindices=DT_INT32, Tparams=DT_STRING, validate_indices=true, _device="/job:localhost/replica:0/task:0/cpu:0"](parse_one_ex/parse_one_ex:2, slice_timestep/fraction_of_32_full_Dequeue)]] 
I d:\build\tensorflow\tensorflow_gpu-r0.12\tensorflow\stream_executor\dso_loader.cc:128] successfully opened CUDA library cupti64_80.dll locally 
W d:\build\tensorflow\tensorflow_gpu-r0.12\tensorflow\core\framework\op_kernel.cc:975] Out of range: RandomShuffleQueue '_3_batch_ex/random_shuffle_queue' is closed and has insufficient elements (requested 4, current size 0) 
     [[Node: batch_ex = QueueDequeueMany[_class=["loc:@batch_ex/random_shuffle_queue"], component_types=[DT_FLOAT, DT_INT32], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](batch_ex/random_shuffle_queue, batch_ex/n)]] 
W d:\build\tensorflow\tensorflow_gpu-r0.12\tensorflow\core\framework\op_kernel.cc:975] Out of range: RandomShuffleQueue '_3_batch_ex/random_shuffle_queue' is closed and has insufficient elements (requested 4, current size 0) 
     [[Node: batch_ex = QueueDequeueMany[_class=["loc:@batch_ex/random_shuffle_queue"], component_types=[DT_FLOAT, DT_INT32], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](batch_ex/random_shuffle_queue, batch_ex/n)]] 
W d:\build\tensorflow\tensorflow_gpu-r0.12\tensorflow\core\framework\op_kernel.cc:975] Out of range: RandomShuffleQueue '_3_batch_ex/random_shuffle_queue' is closed and has insufficient elements (requested 4, current size 0) 
     [[Node: batch_ex = QueueDequeueMany[_class=["loc:@batch_ex/random_shuffle_queue"], component_types=[DT_FLOAT, DT_INT32], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](batch_ex/random_shuffle_queue, batch_ex/n)]] 

der Name des slice_input_producer ist slice_timestep

der Name des shuffle_batch ist batch_ex

Hier ist die Grafik in meinem Tensorboard.

the whole graph

local zoomed graph

Unten ist der vereinfachte Code, der den Fehler zu reproduzieren:

import tensorflow as tf 

context_features = { 
    "length": tf.FixedLenFeature([], dtype=tf.int64), 
    "label": tf.FixedLenFeature([], dtype=tf.int64) 
} 
sequence_features = { 
    "imgs_list": tf.FixedLenSequenceFeature([], dtype=tf.string), 
} 


file=tf.train.string_input_producer(['./train.tfrecord']) 
reader=tf.TFRecordReader() 
_, ex=reader.read(file) 

context_parsed, sequence_parsed = tf.parse_single_sequence_example(
    serialized=ex, 
    context_features=context_features, 
    sequence_features=sequence_features 
) 
length=tf.cast(context_parsed['length'], tf.int32) 
label=tf.cast(context_parsed['label'], tf.int32) 
length=tf.expand_dims(length, 0, name='expand_length') 
label=tf.expand_dims(label, 0, name='expand_label') 
label=tf.tile(label, length) 
imcontent, label=tf.train.slice_input_producer([sequence_parsed['imgs_list'], label]) 
im=tf.image.decode_jpeg(imcontent, 3) 
im=tf.image.resize_images(im, [224, 224]) 
im, label = tf.train.shuffle_batch([im, label], 4, 16, 8, name='batch_ex') 
with tf.Session() as sess: 
    tf.train.start_queue_runners(sess) 
    fig=plt.figure() 
    while(True): 
     [res, res2]=sess.run([im, label]) 
     print(res2) 
+0

Ihre Fehlerstatus '_3_batch_ex/random_shuffle_queue ist geschlossen und hat nicht genügend Elemente (angefordert 4, aktuelle Größe 0)' Meiner Erfahrung nach ist das normalerweise nur der Hinweis, dass es nichts aus Ihrer Eingabedatei lesen kann. Bist du sicher, dass du es richtig findest und da ist genug Zeug drin? Es sagt, dass es versucht, einen Satz von 4 Aufzeichnungen zu lesen und Null zu bekommen ... –

+0

Danke für Ihre Hilfe. Ich habe es gelöst. – mxmxlwlw

Antwort

0

ich gelöst habe. Es scheint, dass der slice_input_producer statisch ist. Ich benutze