2017-06-27 1 views
0

J'ai traversé beaucoup de code de la torche récemment. J'ai remarqué, généralement après le modèle est construit, il est cloné, comme dans le code suivant:Pourquoi clonent-ils le modèle entier avant de s'entraîner au flambeau?

siamese_1=siamese_1:cuda() 
parameters,gradParameters = siamese_1:getParameters() 
siamese_2=siamese_1:clone('weight','bias','gradWeight','gradBias') 
siamese_net:add(siamese_1) 
siamese_net:add(siamese_2) 

siamese_1 étant un modèle construit.

Il est difficile de comprendre pourquoi cela est-il fait?

Ce code sert à effectuer des réglages fins sur les réseaux. Est issu du référentiel this (ligne 122 à 126).

Répondre

1

Lorsque vous clonez un modèle et spécifiez des arguments supplémentaires (par exemple 'weight, etc.), le nouveau modèle partagera ces paramètres avec le paramètre d'origine. Ainsi dans votre cas les modèles siamese_1 et siamese_2 partagent leurs poids, biais et les gradients correspondants.

Dans le code que vous regardez les auteurs veulent créer un réseau avec deux réseaux parallèles partageant leurs poids, c'est la raison pour laquelle ils utilisent la fonction clone.

+0

Dans ce code, le parallélisme réseau est déjà effectué au-dessus des lignes mentionnées. Je comprends que les paramètres sont clones sur un autre module ('siamese_2') mais pourquoi' siamese_1' est-il aussi ajouté à 'siamese_net'? – deepdebugging

+0

non, les lignes 122 à 126 font le parallélisme. 'siamese_net' est un' ParallelTable' et par conséquent vous devez ajouter au moins 2 modules (en parallèle) à ce réseau. C'est pourquoi vous ajoutez à la fois 'siamese_1' et' siamese_2', qui sont par conséquent mis en parallèle dans le réseau 'siamese_net'. – fonfonx

+0

Vrai, j'ai aussi découvert que les réseaux parallèles sont nécessaires car cette implémentation essaie de passer deux tenseurs de données en même temps. – deepdebugging