web-dev-qa-db-fra.com

Un simple code de réseau neuronal convolutionnel

Je m'intéresse aux réseaux de neurones convolutifs (CNN) comme exemple d'application étendue sur le plan informatique qui convient à l'accélération à l'aide de matériel reconfigurable (c'est-à-dire, disons FPGA)

Pour ce faire, je dois examiner un code CNN simple que je peux utiliser pour comprendre comment ils sont mis en œuvre, comment les calculs dans chaque couche se déroulent, comment la sortie de chaque couche est alimentée à l'entrée de la suivante . Je connais la partie théorique ( http://cs231n.github.io/convolutional-networks/ )

Mais, je ne suis pas intéressé par la formation du CNN, je veux un code CNN complet et autonome pré-formé et toutes les valeurs de poids et de biais sont connues.

Je sais qu'il existe de nombreuses bibliothèques CNN, c'est-à-dire Caffe, mais le problème est qu'il n'y a pas d'exemple de code trivial qui soit autonome. même pour l'exemple le plus simple de Caffe "cpp_classification", de nombreuses bibliothèques sont appelées, l'architecture du CNN est exprimée sous forme de fichier .prototxt, d'autres types d'entrées tels que .caffemodel et .binaryproto sont impliqués. Les bibliothèques openCV2 sont également appelées. il y a des couches et des couches d'abstraction et différentes bibliothèques travaillant ensemble pour produire le résultat de la classification.

Je sais que ces abstractions sont nécessaires pour générer une implémentation CNN "utilisable", mais pour une personne matérielle qui a besoin d'un code à nu pour étudier, c'est trop de "travail non lié".

Ma question est: quelqu'un peut-il me guider dans une implémentation CNN simple et autonome avec laquelle je peux commencer?

11
bromanous

Je peux recommander tiny-cnn . Il est simple, léger (par exemple, en-tête uniquement) et CPU uniquement, tout en fournissant plusieurs couches fréquemment utilisées dans la littérature (comme par exemple des couches de regroupement, des couches de décrochage ou une couche de normalisation de réponse locale). Cela signifie que vous pouvez facilement explorer une implémentation efficace de ces couches en C++ sans avoir besoin de connaître CUDA et de fouiller dans les E/S et le code du framework comme requis par le framework tel que Caffe . L'implémentation manque de commentaires, mais le code est toujours facile à lire et à comprendre.

Le fourni exemple MNIST est assez facile à utiliser (essayé moi-même il y a quelque temps) et s'entraîne efficacement. Après la formation et les tests, les poids sont écrits dans un fichier. Ensuite, vous avez un modèle pré-formé simple à partir duquel vous pouvez commencer, voir les examples/mnist/test.cpp et examples/mnist/train.cpp fournis. Il peut facilement être chargé pour tester (ou reconnaître des chiffres) de sorte que vous puissiez déboguer le code lors de l'exécution d'un modèle appris.

Si vous voulez inspecter un réseau plus compliqué, jetez un œil à Exemple Cifar-1 .

13
David Stutz

Voici l'implémentation la plus simple que j'ai vue: DNN McCaffrey

En outre, le code source de ceci par Karpathy semble assez simple.

6
cgarner