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?
la source
Réponses:
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 utilisantnumBatches=numItems/batchSize
.la source