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?