Trenuj na partiach w Tensorflow


11

Obecnie próbuję trenować model na dużym pliku csv (> 70 GB z ponad 60 milionami wierszy). Aby to zrobić, używam tf.contrib.learn.read_batch_examples. Mam problem ze zrozumieniem, w jaki sposób ta funkcja faktycznie odczytuje dane. Jeśli używam wielkości partii np. 50 000, czy odczytuje pierwsze 50 000 wierszy pliku? Jeśli chcę zapętlić cały plik (1 epoka), czy muszę użyć num_rows / batch_size = 1.200 liczby kroków dla metody estymatora.fit?

Oto funkcja wprowadzania, której obecnie używam:

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

Oto kod, którego używam do szkolenia modelu:

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)

Co by się stało, gdybym ponownie wywołał funkcję dopasowania z tym samym argumentem input_fn. Czy zaczyna się ponownie na początku pliku, czy też pamięta linię, w której ostatnio się zatrzymał?


Uznałem, że medium.com/@ilblackdragon/… jest pomocne w grupowaniu w tensorflow input_fn
fistynuts

Odpowiedzi:


1

Ponieważ nie ma jeszcze odpowiedzi, chcę spróbować udzielić przynajmniej przydatnej odpowiedzi. Dołączenie definicji stałych pomoże trochę zrozumieć dostarczony kod.

Ogólnie rzecz biorąc, partia wykorzystuje n razy rekord lub element. Sposób zdefiniowania elementu zależy od problemu. W przepływie tensorowym partia jest kodowana w pierwszym wymiarze tensora. W twoim przypadku z plikiem csv może to być wiersz po wierszu ( reader=tf.TextLineReader). Może się uczyć według kolumny, ale nie sądzę, że dzieje się tak w twoim kodzie. Jeśli chcesz trenować z całym zestawem danych (= jedna epoka ), możesz to zrobić, używając numBatches=numItems/batchSize.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.