Buscar..


Contar ejemplos en archivo 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 hace que la cola string_input_producer cierre una vez que se haya procesado cada archivo en la lista. Esto lleva a que se OutOfRangeError que se OutOfRangeError en try: Por defecto, string_input_producer produce los nombres de archivo infinitamente.

tf.initialize_local_variables() es un Op tensorflow, que, al ejecutarse, inicializa num_epoch variable local dentro string_input_producer .

tf.train.start_queue_runners() inicia pasos adicionales que manejan agregar datos a las colas de forma asíncrona.

Lea y analice el archivo TFRecord

Los archivos TFRecord son el formato binario tensorflow nativo para almacenar datos (tensores). Para leer el archivo puede usar un código similar al del ejemplo 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)

Luego, debe analizar los ejemplos de la cola serialized_example . Puede hacerlo usando tf.parse_example , que requiere lotes previos, pero es más rápido o 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 une valores consecutivos de determinados tensores de forma [x, y, z] a tensores de forma [batch_size, x, y, z] . features dict mapas nombres de las características a las definiciones de tensorflow de características . parse_single_example de una manera similar:

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 y tf.parse_single_example devuelven los nombres de las características de mapeo de un diccionario al tensor con los valores.

Para los ejemplos por lotes que vienen de parse_single_example , debe extraer los tensores del dict y usar tf.train.batch como antes:

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

Leyó los datos como antes, pasando la lista de todos los tensores para evaluar a 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 azar barajando los ejemplos.

Para mezclar aleatoriamente los ejemplos, puede usar la función tf.train.shuffle_batch lugar de tf.train.batch , de la siguiente manera:

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

tf.train.shuffle_batch (así como tf.train.batch ) crea una tf.Queue y continúa agregándole tf.Queue serialized_examples .

capacity mide cuántos elementos se pueden almacenar en la cola de una vez. Una mayor capacidad lleva a un mayor uso de la memoria, pero una menor latencia causada por subprocesos que esperan llenarlo.

min_after_dequeue es el número mínimo de elementos presentes en la cola después de obtener elementos de ella. La cola shuffle_batch no está barajando los elementos de manera perfectamente uniforme, sino que está diseñada teniendo en cuenta una gran cantidad de datos, que no encajan en la memoria. En su lugar, lee entre los elementos min_after_dequeue y capacity , los almacena en la memoria y elige aleatoriamente un lote de ellos. Después de eso, pone en cola algunos elementos más, para mantener su número entre min_after_dequeue y capacity . Por lo tanto, cuanto mayor sea el valor de min_after_dequeue , más elementos aleatorios se garantiza que la elección de los elementos batch_size se tomará de al menos min_after_dequeue elementos consecutivos, pero la mayor capacity debe ser y cuanto más tiempo se tarda en llenar la cola inicialmente.

Lectura de datos para n épocas con lotes

Supongamos que sus ejemplos de datos ya están leídos en una variable de python y desea leerlos n veces, en lotes de un tamaño determinado:

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

Para combinar datos en lotes, posiblemente con barajado aleatorio, puede usar tf.train.batch o tf.train.batch_shuffle , pero necesita pasarle el tensor que produciría datos completos n veces:

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

El limit_epochs convierte la matriz numpy a tensor debajo del capó y devuelve un tensor produciéndolo n veces y lanzando un OutOfRangeError después. El enqueue_many=True argumento enqueue_many=True pasado a shuffle_batch denota que cada tensor en la lista de tensor [limited_tensor] debe interpretarse como que contiene una cantidad de ejemplos. Tenga en cuenta que la capacidad de la cola de procesamiento por lotes puede ser menor que la cantidad de ejemplos en el tensor.

Uno puede procesar los datos como de costumbre:

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

Cómo cargar imágenes y etiquetas desde un archivo TXT

No se ha explicado en la documentación de Tensorflow cómo cargar imágenes y etiquetas directamente desde un archivo TXT. El siguiente código ilustra cómo lo logré. Sin embargo, no significa que sea la mejor manera de hacerlo y que de esta manera ayudará en pasos adicionales.

Por ejemplo, estoy cargando las etiquetas en un solo valor entero {0,1}, mientras que la documentación utiliza un vector de un solo calor [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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow