Recherche…


Compter les exemples dans un fichier CSV

import tensorflow as tf
filename_queue = tf.train.string_input_producer(["file.csv"], num_epochs=1)
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
col1, col2 = tf.decode_csv(value, record_defaults=[[0], [0]])

with tf.Session() as sess:
  sess.run(tf.initialize_local_variables())
  tf.train.start_queue_runners()
  num_examples = 0
  try:
    while True:
      c1, c2 = sess.run([col1, col2])
      num_examples += 1
  except tf.errors.OutOfRangeError:
    print "There are", num_examples, "examples"

num_epochs=1 string_input_producer file d'attente string_input_producer après avoir traité chaque fichier de la liste une fois. Elle conduit à élever OutOfRangeError qui est pris dans try: . Par défaut, string_input_producer produit les noms de fichiers à l'infini.

tf.initialize_local_variables() est une op tensorflow, qui, lorsqu'il est exécuté, initialise num_epoch variable locale à l' intérieur de string_input_producer .

tf.train.start_queue_runners() démarre des pistes supplémentaires qui gèrent l'ajout de données aux files d'attente de manière asynchrone.

Lire et analyser le fichier TFRecord

Les fichiers TFRecord sont le format binaire de tensorflow natif pour stocker des données (tenseurs). Pour lire le fichier, vous pouvez utiliser un code similaire à l'exemple CSV:

import tensorflow as tf
filename_queue = tf.train.string_input_producer(["file.tfrecord"], num_epochs=1)
reader = tf.TFRecordReader()
key, serialized_example = reader.read(filename_queue)

Ensuite, vous devez analyser les exemples de la file d'attente serialized_example . Vous pouvez le faire soit en utilisant tf.parse_example , qui nécessite un traitement par lot précédent, mais qui est plus rapide ou tf.parse_single_example :

batch = tf.train.batch([serialized_example], batch_size=100)
parsed_batch = tf.parse_example(batch, features={
  "feature_name_1": tf.FixedLenFeature(shape=[1], tf.int64),
  "feature_name_2": tf.FixedLenFeature(shape=[1], tf.float32)
})

tf.train.batch relie des valeurs consécutives de tenseurs donnés de forme [x, y, z] à des tenseurs de forme [batch_size, x, y, z] . features mappe les noms des entités aux définitions de entités de tensorflow. Vous utilisez parse_single_example de la même manière:

parsed_example = tf.parse_single_example(serialized_example, {
  "feature_name_1": tf.FixedLenFeature(shape=[1], tf.int64),
  "feature_name_2": tf.FixedLenFeature(shape=[1], tf.float32)
})

tf.parse_example et tf.parse_single_example renvoient un dictionnaire mappant des noms d' tf.parse_single_example au tenseur avec les valeurs.

Pour parse_single_example exemples provenant de parse_single_example vous devez extraire les tenseurs du dict et utiliser tf.train.batch comme précédemment:

parsed_batch = dict(zip(parsed_example.keys(),
    tf.train.batch(parsed_example.values(), batch_size=100)

Vous lisez les données comme avant, en passant la liste de tous les tenseurs à évaluer à sess.run :

with tf.Session() as sess:
  sess.run(tf.initialize_local_variables())
  tf.train.start_queue_runners()
  try:
    while True:
      data_batch = sess.run(parsed_batch.values())
      # process data
  except tf.errors.OutOfRangeError:
    pass

Aléatoire battant les exemples

Pour mélanger aléatoirement les exemples, vous pouvez utiliser la fonction tf.train.shuffle_batch au lieu de tf.train.batch , comme suit:

parsed_batch = tf.train.shuffle_batch([serialized_example],
    batch_size=100, capacity=1000,
    min_after_dequeue=200)

tf.train.shuffle_batch (ainsi que tf.train.batch ) crée un tf.Queue et y ajoute des tf.Queue serialized_examples .

capacity mesure le nombre d'éléments pouvant être stockés dans la file d'attente en une fois. Une plus grande capacité entraîne une plus grande utilisation de la mémoire, mais une latence plus faible causée par les threads en attente de le remplir.

min_after_dequeue est le nombre minimal d'éléments présents dans la file d'attente après en avoir extrait des éléments. La file d'attente shuffle_batch ne mélange pas les éléments de manière parfaitement uniforme - elle est conçue avec des données shuffle_batch ne shuffle_batch pas à la mémoire. Au lieu de cela, il lit entre les éléments min_after_dequeue et capacity , les stocke en mémoire et en choisit un lot au hasard. Après cela, il met en file d'attente d'autres éléments, pour conserver son numéro entre min_after_dequeue et capacity . Ainsi, plus la valeur de min_after_dequeue , plus les éléments aléatoires sont nombreux - le choix des éléments batch_size est garanti pour au moins les éléments consécutifs min_after_dequeue , mais la plus grande capacity doit être min_after_dequeue pour remplir la file d'attente.

Lecture des données pour n époques avec traitement par lots

Supposons que vos exemples de données soient déjà lus dans la variable d'un python et que vous souhaitez le lire n fois, par lots de taille donnée:

import numpy as np
import tensorflow as tf
data = np.array([1, 2, 3, 4, 5])
n = 4

Pour fusionner des données par lots, éventuellement avec un mélange aléatoire, vous pouvez utiliser tf.train.batch ou tf.train.batch_shuffle , mais vous devez lui transmettre le tenseur qui produirait des données entières n fois:

limited_tensor = tf.train.limit_epochs(data, n)
batch = tf.train.shuffle_batch([limited_tensor], batch_size=3, enqueue_many=True, capacity=4)

Le limit_epochs convertit le tableau numpy en tenseur sous le capot et retourne un tenseur le produisant n fois, puis en lançant une erreur OutOfRangeError. L'argument enqueue_many=True passé à shuffle_batch indique que chaque tenseur de la liste des tenseurs [limited_tensor] doit être interprété comme contenant un certain nombre d'exemples. Notez que la capacité de la file d'attente de traitement par lots peut être inférieure au nombre d'exemples du tenseur.

On peut traiter les données comme d'habitude:

with tf.Session() as sess:
  sess.run(tf.initialize_local_variables())
  tf.train.start_queue_runners()
  try:
    while True:
      data_batch = sess.run(batch)
      # process data
  except tf.errors.OutOfRangeError:
    pass

Comment charger des images et des étiquettes à partir d'un fichier TXT

La documentation de Tensorflow n'a pas expliqué comment charger des images et des étiquettes directement à partir d'un fichier TXT. Le code ci-dessous illustre comment je l'ai réalisé. Cependant, cela ne signifie pas que c'est la meilleure façon de le faire et que cette façon aidera dans les étapes suivantes.

Par exemple, je charge les étiquettes dans une seule valeur entière {0,1}, tandis que la documentation utilise un vecteur à un seul point [0,1].

# Learning how to import images and labels from a TXT file
#
# TXT file format
#
# path/to/imagefile_1 label_1
# path/to/imagefile_2 label_2
# ...                 ...
#
# where label_X is either {0,1}

#Importing Libraries
import os
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.python.framework import ops
from tensorflow.python.framework import dtypes

#File containing the path to images and the labels [path/to/images label]
filename = '/path/to/List.txt'

#Lists where to store the paths and labels
filenames = []
labels = []

#Reading file and extracting paths and labels
with open(filename, 'r') as File:
    infoFile = File.readlines() #Reading all the lines from File
    for line in infoFile: #Reading line-by-line
        words = line.split() #Splitting lines in words using space character as separator
        filenames.append(words[0])
        labels.append(int(words[1]))

NumFiles = len(filenames)

#Converting filenames and labels into tensors
tfilenames = ops.convert_to_tensor(filenames, dtype=dtypes.string)
tlabels = ops.convert_to_tensor(labels, dtype=dtypes.int32)

#Creating a queue which contains the list of files to read and the value of the labels
filename_queue = tf.train.slice_input_producer([tfilenames, tlabels], num_epochs=10, shuffle=True, capacity=NumFiles)

#Reading the image files and decoding them
rawIm= tf.read_file(filename_queue[0])
decodedIm = tf.image.decode_png(rawIm) # png or jpg decoder

#Extracting the labels queue
label_queue = filename_queue[1]

#Initializing Global and Local Variables so we avoid warnings and errors
init_op = tf.group(tf.local_variables_initializer() ,tf.global_variables_initializer())

#Creating an InteractiveSession so we can run in iPython
sess = tf.InteractiveSession()

with sess.as_default():
    sess.run(init_op)
    
    # Start populating the filename queue.
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)

    for i in range(NumFiles): #length of your filenames list
        nm, image, lb = sess.run([filename_queue[0], decodedIm, label_queue])
        
        print image.shape
        print nm
        print lb
        
        #Showing the current image
        plt.imshow(image)
        plt.show()

    coord.request_stop()
    coord.join(threads)


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow