Entrena en lotes en Tensorflow

11

Actualmente estoy tratando de entrenar un modelo en un archivo csv grande (> 70 GB con más de 60 millones de filas). Para hacerlo, estoy usando tf.contrib.learn.read_batch_examples. Me cuesta entender cómo esta función realmente lee los datos. Si estoy usando un tamaño de lote de, por ejemplo, 50,000, ¿lee las primeras 50,000 líneas del archivo? Si deseo recorrer todo el archivo (1 época), ¿debo usar num_rows / batch_size = 1.200 número de pasos para el método estimator.fit?

Aquí está la función de entrada que estoy usando actualmente:

def input_fn(file_names, batch_size):
    # Read csv files and create examples dict
    examples_dict = read_csv_examples(file_names, batch_size)

    # Continuous features
    feature_cols = {k: tf.string_to_number(examples_dict[k],
                                           out_type=tf.float32) for k in CONTINUOUS_COLUMNS}

    # Categorical features
    feature_cols.update({
                            k: tf.SparseTensor(
                                indices=[[i, 0] for i in range(examples_dict[k].get_shape()[0])],
                                values=examples_dict[k],
                                shape=[int(examples_dict[k].get_shape()[0]), 1])
                            for k in CATEGORICAL_COLUMNS})

    label = tf.string_to_number(examples_dict[LABEL_COLUMN], out_type=tf.int32)

    return feature_cols, label


def read_csv_examples(file_names, batch_size):
    def parse_fn(record):
        record_defaults = [tf.constant([''], dtype=tf.string)] * len(COLUMNS)

        return tf.decode_csv(record, record_defaults)

    examples_op = tf.contrib.learn.read_batch_examples(
        file_names,
        batch_size=batch_size,
        queue_capacity=batch_size*2.5,
        reader=tf.TextLineReader,
        parse_fn=parse_fn,
        #read_batch_size= batch_size,
        #randomize_input=True,
        num_threads=8
    )

    # Important: convert examples to dict for ease of use in `input_fn`
    # Map each header to its respective column (COLUMNS order
    # matters!
    examples_dict_op = {}
    for i, header in enumerate(COLUMNS):
        examples_dict_op[header] = examples_op[:, i]

    return examples_dict_op

Aquí está el código que estoy usando para entrenar el modelo:

def train_and_eval():
"""Train and evaluate the model."""

m = build_estimator(model_dir)
m.fit(input_fn=lambda: input_fn(train_file_name, batch_size), steps=steps)

¿Qué pasaría si volviera a llamar a la función de ajuste con el mismo input_fn? ¿Comienza de nuevo al principio del archivo o recordará la línea donde se detuvo la última vez?

Nico
fuente
Encontré medium.com/@ilblackdragon/... útil en el procesamiento por lotes dentro de tensorflow input_fn
fistynuts
¿Ya comprobaste esa? stackoverflow.com/questions/37091899/…
Frankstr

Respuestas:

1

Como todavía no hay respuesta, quiero intentar dar una respuesta al menos de alguna manera útil. Incluir las definiciones de las constantes ayudaría un poco a comprender el código proporcionado.

En general, un lote usa n veces un registro o artículo. La forma en que define un elemento depende de su problema. En tensorflow, el lote se codifica en la primera dimensión de un tensor. En su caso con el archivo csv, podría ser línea por línea ( reader=tf.TextLineReader). Podría aprender por columna, pero no creo que esto esté sucediendo en su código. Si desea entrenar con todo su conjunto de datos (= una época ), puede hacerlo utilizando numBatches=numItems/batchSize.

Benedikt S. Vogler
fuente