web-dev-qa-db-fra.com

Aide-mémoire pour caffe / pycaffe?

Est-ce que quelqu'un sait s'il existe une feuille de triche pour toutes les commandes pycaffe importantes? Jusqu'à présent, j'utilisais caffe uniquement via l'interface Matlab et les scripts terminal + bash.

Je voulais passer à l'utilisation d'ipython et passer en revue les exemples de bloc-notes ipython. Cependant, j'ai du mal à obtenir un aperçu de toutes les fonctions qui sont à l'intérieur du module caffe pour python. (Je suis également assez nouveau sur python).

44
mcExchange

Les tests pycaffe et ce fichier sont la principale passerelle vers l'interface de codage python).

Tout d'abord, vous souhaitez choisir d'utiliser Caffe avec CPU ou GPU. Il suffit d'appeler caffe.set_mode_cpu() ou caffe.set_mode_gpu(), respectivement.

Net

La classe principale exposée par l'interface pycaffe est le Net. Il a deux constructeurs:

net = caffe.Net('/path/prototxt/descriptor/file', caffe.TRAIN)

qui crée simplement un Net (dans ce cas en utilisant le Data Layer spécifié pour la formation), ou

net = caffe.Net('/path/prototxt/descriptor/file', '/path/caffemodel/weights/file', caffe.TEST)

qui crée un Net et charge automatiquement les poids tels qu'ils sont enregistrés dans le fichier caffemodel fourni - dans ce cas en utilisant le Data Layer spécifié pour les tests .

Un objet Net possède plusieurs attributs et méthodes. Ils peuvent être trouvés ici . Je ne citerai que ceux que j'utilise le plus souvent.

Vous pouvez accéder aux objets blob du réseau au moyen de Net.blobs. Par exemple.

data = net.blobs['data'].data
net.blobs['data'].data[...] = my_image
fc7_activations = net.blobs['fc7'].data

Vous pouvez également accéder aux paramètres (poids) de la même manière. Par exemple.

Nice_Edge_detectors = net.params['conv1'].data
higher_level_filter = net.params['fc7'].data

Ok, il est maintenant temps d'alimenter le net avec quelques données. Ainsi, vous utiliserez les méthodes backward() et forward(). Donc, si vous voulez classer une seule image

net.blobs['data'].data[...] = my_image
net.forward() # equivalent to net.forward_all()
softmax_probabilities = net.blobs['prob'].data

La méthode backward() est équivalente, si l'on s'intéresse au calcul des gradients.

Vous pouvez enregistrer les poids nets pour les réutiliser ultérieurement. C'est juste une question de

 net.save('/path/to/new/caffemodel/file')

Solveur

L'autre composant principal exposé par pycaffe est le Solver. Il existe plusieurs types de solveurs, mais je vais utiliser uniquement SGDSolver par souci de clarté. Il est nécessaire pour former un modèle Caffe. Vous pouvez instancier le solveur avec

solver = caffe.SGDSolver('/path/to/solver/prototxt/file')

Solver encapsulera le réseau que vous formez et, s'il est présent, le réseau utilisé pour les tests. Notez qu'il s'agit généralement du même réseau, uniquement avec un autre Data Layer. Les réseaux sont accessibles avec

 training_net = solver.net
 test_net = solver.test_nets[0] # more than one test net is supported

Ensuite, vous pouvez effectuer une itération du solveur, c'est-à-dire une passe avant/arrière avec mise à jour du poids, en tapant simplement

 solver.step(1)

ou exécutez le solveur jusqu'à la dernière itération, avec

 solver.solve()

Autres caractéristiques

Notez que pycaffe vous permet de faire plus de choses, telles que en spécifiant l'architecture du réseau via une classe Python ou en créant un nouveau Layer type . Ces fonctionnalités sont moins souvent utilisées, mais elles sont assez faciles à comprendre en lisant les cas de test.

96
Flavio Ferrara

Veuillez noter que la réponse de Flavio Ferrara a un petit problème qui peut vous faire perdre beaucoup de temps:

net.blobs['data'].data[...] = my_image
net.forward()

Le code ci-dessus n'est pas efficace si votre première couche est une couche de type de données, car lorsque net.forward() est appelée, elle commencera à partir de la première couche, puis vos données insérées my_image Seront couvertes. Il ne montrera donc aucune erreur mais vous donnera une sortie totalement hors de propos. La bonne façon consiste à affecter les couches de début et de fin, par exemple:

net.forward(start='conv1', end='fc')

Voici un référentiel Github de Face Verification Experiment sur LFW Dataset, utilisant pycaffe et du code matlab. Je suppose que cela pourrait aider beaucoup, en particulier le fichier caffe_ftr.py.

https://github.com/AlfredXiangWu/face_verification_experiment

En outre, voici quelques exemples de code d'utilisation de pycaffe pour la classification d'images:

http://codrspace.com/Jaleyhd/caffe-python-tutorial/http://prog3.com/sbdm/blog/u011762313/article/details/48342495

10
yi-ji