Entraînez-vous par lots dans Tensorflow

11

J'essaie actuellement de former un modèle sur un gros fichier csv (> 70 Go avec plus de 60 millions de lignes). Pour ce faire, j'utilise tf.contrib.learn.read_batch_examples. J'ai du mal à comprendre comment cette fonction lit réellement les données. Si j'utilise par exemple une taille de lot de 50 000, lit-il les 50 000 premières lignes du fichier? Si je veux parcourir le fichier entier (1 époque), dois-je utiliser num_rows / batch_size = 1.200 nombre d'étapes pour la méthode estimator.fit?

Voici la fonction d'entrée que j'utilise actuellement:

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

Voici le code que j'utilise pour former le modèle:

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)

Que se passerait-il si j'appelais à nouveau la fonction fit avec le même input_fn. Est-ce qu'il recommence au début du fichier ou se souviendra-t-il de la ligne où il s'est arrêté la dernière fois?

Nico
la source
J'ai trouvé medium.com/@ilblackdragon/… utile sur le traitement par lots dans tensorflow input_fn
fistynuts
Avez-vous déjà vérifié celui-là? stackoverflow.com/questions/37091899/…
Frankstr

Réponses:

1

Comme il n'y a pas encore de réponse, je veux essayer de donner une réponse au moins quelque peu utile. L'inclusion des définitions de constantes aiderait un peu à comprendre le code fourni.

De manière générale, un lot utilise n fois un enregistrement ou un élément. La façon dont vous définissez un élément dépend de votre problème. Dans tensorflow, le lot est codé dans la première dimension d'un tenseur. Dans votre cas avec le fichier csv, il peut s'agir ligne par ligne ( reader=tf.TextLineReader). Il pourrait apprendre par colonne mais je ne pense pas que cela se produise dans votre code. Si vous voulez vous entraîner avec l'ensemble de vos données (= une époque ), vous pouvez le faire en utilisant numBatches=numItems/batchSize.

Benedikt S. Vogler
la source