J'utilise Keras avec un backend Tensorflow en Python. Pour être plus précis tensorflow 1.2.1 et sa version intégrée contrib.keras lib.
Je veux utiliser le fit_generator-Method
d'un objet de modèle séquentiel, mais je suis confus avec ce que je devrais passer en tant que paramètres de méthode.
En lisant la doc ici j'ai eu l'information suivante:
number of training batches = uniqueTrainingData / batchSize
???
; = uniqueValidationData/taille du lot ???Comme indiqué ci-dessus avec ??? Je ne sais pas vraiment ce que signifie validation_steps. Je connais la définition du document lié ci-dessus (Number of steps to yield from validation generator at the end of every Epoch
) mais cela ne confond que my dans le contexte donné. D'après le document, je sais que le générateur validation_data doit générer des données, étiquetez des nuplets de la forme (inputs, targets)
. Contrairement à cela, la déclaration ci-dessus indique qu'il doit y avoir plusieurs "étapes à générer du générateur de validation à la fin de chaque époque", ce qui signifierait, dans ce contexte, que plusieurs lots de validation seraient générés après chaque époque de formation.
Questions sur validation_steps
:
uniqueValidationData / batches
et pas uniqueValidationData / epochs
? N'est-il pas préférable d'avoir par exemple 100 lots de validation pour 100 époques au lieu de x lots de validation où x pourrait être inférieur ou supérieur au nombre spécifié d'époques? Autre solution: si le nombre de lots de validation est bien inférieur à celui du nombre d'époches, le modèle est-il formé sans validation pour le reste des périodes ou les ensembles de validation sont-ils réutilisés/redistribués +?Question supplémentaire sur use_multiprocessing
:
Le générateur de validation fonctionne exactement comme le générateur de formation. Vous définissez le nombre de lots qu’il utilisera par époque.
steps_per_Epoch
lots.validation_steps
lots.Mais les données de validation n'ont absolument aucun rapport avec les données d'apprentissage. Il n'est pas nécessaire de séparer les lots de validation en fonction des lots de formation (je dirais même que cela ne sert à rien de le faire, à moins que vous n'ayez une intention très précise). De plus, le nombre total d'échantillons dans les données d'apprentissage n'est pas lié au nombre total d'échantillons dans les données de test.
L’intérêt de disposer de nombreux lots est simplement d’épargner la mémoire de votre ordinateur. Vous devez donc tester les petits packs les uns après les autres. Probablement, vous trouvez une taille de lot qui convient à votre mémoire ou à la durée d’entraînement prévue et utilisez cette taille.
Cela dit, Keras vous offre une méthode totalement gratuite, vous permettant ainsi de déterminer les lots de formation et de validation à votre guise.
Idéalement, vous utilisez toutes vos données de validation à la fois. Si vous n'utilisez qu'une partie de vos données de validation, vous obtiendrez des mesures différentes pour chaque lot. Ce qui peut vous faire penser que votre modèle s'est dégradé ou qu'il a été amélioré alors qu'il ne l'a pas été, vous venez de mesurer différents ensembles de validation.
C'est pourquoi ils suggèrent validation_steps = total_validation_samples // validation_batch_size
.
Théoriquement, vous testez l’ensemble de vos données à chaque époque, de la même façon que vous devriez normalement former l’ensemble de vos données à chaque époque.
Donc, théoriquement, chaque époque donne:
steps_per_Epoch = TotalTrainingSamples / TrainingBatchSize
validation_steps = TotalvalidationSamples / ValidationBatchSize
En gros, les deux vars sont: combien de lots par époque vous allez céder.
Cela garantit que, à chaque époque:
Néanmoins, la manière dont vous séparez vos données de formation et de validation dépend entièrement de vous.
Si vous voulez avoir un lot différent par époque (les époques utilisant moins que la totalité de vos données), c'est bon, passez simplement steps_per_Epoch=1
ou validation_steps=1
, par exemple. Le générateur n'étant pas réinitialisé après chaque époque, la deuxième époque prend le second lot, et ainsi de suite, jusqu'à ce qu'il se répète en boucle vers le premier lot.
Je préfère former toutes les données par époque, et si le temps est trop long, j'utilise un callback
qui affiche les journaux à la fin de chaque lot:
from keras.callbacks import LambdaCallback
callbacks = callbacks=[LambdaCallback(on_batch_end=lambda batch,logs:print(logs))]
Je n'ai jamais pu utiliser use_multiprocessing=True
, il gèle au début de la première époque.
J'ai remarqué que les workers
sont liés au nombre de lots préchargés à partir du générateur. Si vous définissez max_queue_size=1
, vous aurez exactement workers
quantité de lots préchargés.
Ils vous suggèrent d'utiliser keras Sequences lors du multitraitement. Les séquences fonctionnent plutôt comme un générateur, mais elles gardent une trace de l'ordre/de la position de chaque lot.