2017-06-07 3 views
1

Je crée un réseau en utilisant Caffe, pour lequel j'ai besoin de définir ma propre couche. Je voudrais utiliser le calque Python pour cela.Comment dois-je utiliser les blobs dans une couche de Caffe Python, et quand est-ce que leur entraînement a lieu?

Ma couche contiendra certains paramètres appris. De this answer, on me dit que je vais devoir créer un vecteur blob pour cela. Y a-t-il une spécification que ce blob devra suivre, comme comme contraintes dans les dimensions, etc.? Indépendamment de ce que ma couche fait, puis-je créer un blob d'une dimension, et utiliser un élément, un chacun, du blob pour tout calcul dans la couche? Que signifie le diff d'un blob? D'après ce que je comprends, le diff de bottom est le gradient à la couche actuelle, et top pour la couche précédente. Cependant, que se passe-t-il exactement here?

  • Quand ces paramètres sont-ils formés? Est-ce que cela doit être fait manuellement dans la définition de la couche? J'ai vu les exemples dans test_python_layer.py, mais la plupart d'entre eux n'ont aucun paramètre.

  • +1

    Une très bonne question. – Shai

    Répondre

    1

    Vous pouvez ajouter autant de paramètres internes que vous le souhaitez, et ces paramètres (Blobs) peuvent avoir la forme que vous voulez.

    Pour ajouter Blobs (dans la classe de votre couche):

    def setup(self, bottom, top): 
        self.blobs.add_blob(2) # add two blobs 
        self.blobs[0].reshape(3, 4) # first blob is 2D 
        self.blobs[0].data[...] = 0 # init 
        self.blobs[1].reshape(10) # second blob is 1D with 10 elements 
        self.blobs[1].data[...] = 1 # init to 1 
    

    Quel est le « sens » de chaque paramètre et comment les organiser self.blobs est entièrement à vous.

    Comment les paramètres de formation peuvent-ils être "formés"?
    C'est l'une des choses sympas à propos de caffe (et d'autres kits d'outils DNN), vous n'avez pas à vous en préoccuper!
    Que devez-vous faire? Tout ce dont vous avez besoin est de calculer le gradient de la perte avec les paramètres et de le stocker dans self.blobs[i].diff. Une fois que les gradients sont mis à jour, les internes de caffe se charge de mettre à jour les paramètres en fonction des gradients/taux d'apprentissage/dynamique/politique de mise à jour, etc.
    Ainsi,
    Vous doit avoir une méthode backward non trivial pour votre couche

    backward(self, top, propagate_down, bottom): 
        self.blobs[0].diff[...] = # diff of parameters 
        self.blobs[1].diff[...] = # diff for all the blobs 
    

    Vous pourriez vouloir tester votre implémentation de la couche, une fois que vous l'avez complétée. Regardez un this PR pour un test numérique des gradients.

    +0

    Merci! Si je veux un blob particulier pour être un paramètre fixe et ne pas apprendre, je peux mettre le diff à 0 droit? – GoodDeeds

    +0

    @GoodDeeds ou réglez le taux d'apprentissage sur zéro pour ce blob. voir couche BatchNorm par exemple – Shai

    +0

    Je reçois une erreur avec ceci. J'ai suivi la méthode de création d'un blob selon votre exemple, et j'obtiens un index hors plage quand j'essaie d'accéder 'self.blobs [1]'. Il n'y a pas une telle erreur si je fais 'add_blob (1)' deux fois, mais peut-être qu'il y a une erreur logique différente dans ce cas. Pourriez-vous s'il vous plaît dire pourquoi cela pourrait se produire? – GoodDeeds