Trainiere auf Chargen in Tensorflow

11

Ich versuche derzeit, ein Modell auf einer großen CSV-Datei (> 70 GB mit mehr als 60 Millionen Zeilen) zu trainieren. Dazu verwende ich tf.contrib.learn.read_batch_examples. Ich habe Probleme zu verstehen, wie diese Funktion die Daten tatsächlich liest. Wenn ich eine Stapelgröße von z. B. 50.000 verwende, werden dann die ersten 50.000 Zeilen der Datei gelesen? Wenn ich die gesamte Datei (1 Epoche) durchlaufen möchte, muss ich num_rows / batch_size = 1.200 Anzahl der Schritte für die Estimator.fit-Methode verwenden?

Hier ist die Eingabefunktion, die ich derzeit verwende:

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

Hier ist der Code, mit dem ich das Modell trainiere:

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)

Was würde passieren, wenn ich die Fit-Funktion mit demselben input_fn erneut aufrufen würde? Beginnt es wieder am Anfang der Datei oder erinnert es sich an die Zeile, in der es das letzte Mal angehalten hat?

Nico
quelle
Ich fand medium.com/@ilblackdragon/… hilfreich beim Batching innerhalb von tensorflow input_fn
fistynuts
Hast du das schon überprüft? stackoverflow.com/questions/37091899/...
Frankstr

Antworten:

1

Da es noch keine Antwort gibt, möchte ich versuchen, eine zumindest irgendwie nützliche Antwort zu geben. Das Einbeziehen der Konstantendefinitionen würde ein wenig helfen, den bereitgestellten Code zu verstehen.

Im Allgemeinen verwendet eine Charge n-mal einen Datensatz oder Artikel. Wie Sie einen Artikel definieren, hängt von Ihrem Problem ab. Im Tensorflow wird die Charge in der ersten Dimension eines Tensors codiert. In Ihrem Fall mit der CSV-Datei kann es Zeile für Zeile ( reader=tf.TextLineReader) sein. Es könnte nach Spalten lernen, aber ich glaube nicht, dass dies in Ihrem Code geschieht. Wenn Sie mit Ihrem gesamten Datensatz (= einer Epoche ) trainieren möchten , können Sie dies mit verwenden numBatches=numItems/batchSize.

Benedikt S. Vogler
quelle