2016-06-16 9 views
3

Ich habe einige fehlerhafte Daten in meinem Trainingssatz gefunden (falsch beschriftete Beispiele) und während ich die Quelle korrigiert habe, möchte ich weiterhin mit dem gleichen Datensatz experimentieren, den ich brauche um diese Aufzeichnungen zu überspringen.Löschen/Überspringen von Datensätzen beim Laden von Daten

Ich benutze einen TFRecordReader und lade mit parse_single_example & shuffle_batch. Kann ich irgendwo einen Filter bereitstellen?

Antwort

3

Es gibt einen kurzen Verweis darauf, wie es in docs mit tf.train.shuffle_batch() und enqueue_many=True zu tun ist. Wenn Sie feststellen können, ob ein Beispiel falsch beschriftet ist Graph Operationen verwendet wird, dann können Sie das Ergebnis filtern wie so (von another SO answer angepasst):

X, y = tf.parse_single_example(...) 
is_correctly_labelled = correctly_labelled(X, y) 
X = tf.expand_dims(X, 0) 
y = tf.expand_dims(y, 0) 
empty = tf.constant([], tf.int32) 
X, y = tf.cond(is_correctly_labelled, 
       lambda: [X, y], 
       lambda: [tf.gather(X, empty), tf.gather(y, empty)]) 
Xs, ys = tf.train.shuffle_batch(
    [X, y], batch_size, capacity, min_after_dequeue, 
    enqueue_many=True) 

Die tf.gather ist nur ein Weg, um eine Null-Größe Scheibe zu bekommen. In numpy wäre es nur X[[], ...].

+0

Danke - das scheint großartig zu funktionieren. Können Sie erklären, wie der Teil expand_dims funktioniert? Für mich scheint es, eine zusätzliche 1-dimensionale Dimension hinzuzufügen, aber ich kann nicht ganz verstehen, wie es verwendet wird. –

+0

Die zusätzliche 1-dimensionale Dimension wird von 'shuffle_batch()' mit 'enqueue_many = True' verwendet. Die Größe der ersten Dimension gibt an, wie viele Elemente in die Warteschlange eingereiht werden sollen, also eins, wenn 'is_correctly_marked == True 'ist, andernfalls null. Ist das sinnvoll? – Boris

+0

Sure tut, danke –

Verwandte Themen