Je suis nouveau à Keras et j'ai besoin de votre aide.
J'entraîne un réseau neuronal à Keras et ma fonction de perte est la sortie et la valeur cible de la différence nette au noir et blanc.
Je veux optimiser cela en utilisant Gradient Descent. Après avoir parcouru quelques liens sur le net, j'ai appris qu'il existe 3 types de descentes dégradées généralement utilisées:
- Descente de gradient à échantillon unique : Ici, le gradient est calculé à partir d'un seul échantillon à chaque itération -> Le gradient peut être bruyant.
- Descente de gradient par lots : Ici, le gradient est la moyenne des gradients calculés à partir de TOUS les échantillons du jeu de données -> Le gradient est plus général, mais intraitable pour les jeux de données énormes.
- Descente de gradient en mini-lot : similaire au lot GD. Au lieu d'utiliser l'ensemble de données entier, seuls quelques échantillons (déterminés par batch_size) sont utilisés pour calculer le gradient à chaque itération -> Pas très bruyant et traitable par calcul -> Le meilleur des deux mondes.
Des questions:
- Je voudrais effectuer une descente de gradient en mini-lot à Keras. Comment puis-je faire ceci? Dois-je utiliser l'optimiseur SGD?
Si SGD doit être utilisé, comment définir la taille du lot? Il ne semble pas y avoir de paramètre à la fonction SGD pour définir batch_size.
optimizer = keras.optimizers.SGD(lr=0.01, decay=0.1, momentum=0.1, nesterov=False)
Il existe un paramètre batch_size dans model.fit () dans Keras.
history = model.fit(x, y, nb_epoch=num_epochs, batch_size=20, verbose=0, validation_split=0.1)
Est-ce la même que la taille du lot dans Mini-batch Gradient Descent? Sinon, qu'est-ce que cela signifie exactement de s'entraîner sur un lot d'entrées? Cela signifie-t-il que «batch_size» non. de threads s'exécutent en parallèle et mettent à jour les pondérations du modèle en parallèle?
Si cela peut vous aider, voici l'extrait de code python que j'ai écrit jusqu'à présent .
la source
Si l'on met de côté les considérations théoriques, étant donné l'ensemble de données réelles et la taille d'un réseau neuronal moderne typique, il faudrait généralement un temps excessivement long pour s'entraîner sur des lots de taille un, et vous n'aurez pas assez de mémoire RAM et / ou GPU pour vous entraîner sur l'ensemble de données immediatement. Ce n'est donc généralement pas la question «si» le mini-lot doit être utilisé, mais «quelle taille» de lots devez-vous utiliser. L'
batch_size
argument est le nombre d'observations sur lesquelles s'entraîner en une seule étape, les tailles généralement plus petites fonctionnent mieux car elles ont un effet de régularisation. De plus, les gens utilisent souvent des optimiseurs plus compliqués (par exemple Adam, RMSprop) et d'autres astuces de régularisation, ce qui rend la relation entre les performances du modèle, la taille du lot, le taux d'apprentissage et le temps de calcul plus compliquée.la source