Table Des Matières
Deep Neural Networks avec le support GPU
Mise à Jours: Ceci est une version plus récente du framework qu’Ivan Vasilev a développé en travaillant chez ExB Research. Actuellement, vous pouvez créer le projet, mais certains tests ne fonctionnent pas. Si vous voulez accéder à la version précédente, elle est disponible dans l’ancienne branche.
Ceci est une implémentation Java de certains algorithmes pour la formation de Deep neural networks (réseaux neuronaux profonds). Le support GPU est fourni via OpenCL et Aparapi. L’architecture est conçue avec la modularité, l’extensibilité et la possibilité de branchement.
La Structure Git
Ivan Vasilev utilise le modèle git-flow. Les sources les plus stables (mais plus anciennes) sont disponibles dans la branche master, tandis que les plus récentes sont dans la branche develop.
Si vous voulez utiliser la version compatible Java 7 précédente, vous pouvez consulter cette version.
Types de réseaux neuronaux (Neural Networks)
- Perceptron multicouche
- Réseaux convolutifs avec mise en pool max, moyen et stochastique.
- La machine restreinte Boltzmann
- Autoencoder (Encodeur automatique)
- Réseau de confiances profondes
- Encodeur automatique empilé
Algorithmes d’Entraînement
- Backpropagation – prend en charge les perceptrons multicouches, les réseaux convolutifs et les dropout
- Divergence contrastive et divergence contrastive persistante mis en œuvre en utilisant ces lignes directrices.
- formation en couches pour les réseaux profonds – fonctionne pour les auto-encodeurs empilés et les DBN, mais supporte tout type de formation.
Tous les algorithmes supportent l’exécution du GPU.
Les ensembles de données pris en charge prêts à l’emploi sont MNIST, CIFAR-10 / CIFAR-100, IRIS et XOR, mais vous pouvez facilement implémenter les vôtres.
Prise en charge expérimentale des opérations de prétraitement des images RVB – transformations affines, recadrage et mise à l’échelle des couleurs (voir Generaltest.java -> testImageInputProvider).
Fonctions d’activation
- Sigmoid
- Tanh
- ReLU
- LRN
- Softplus
- Softmax
Toutes les fonctions supportent l’exécution du GPU. elles peuvent être appliqués à tous les types de réseaux et à tous les algorithmes de formation. Vous pouvez également implémenter de nouvelles activations.
Comment Construire La Bibliothèque
- Java 8.
- Pour construire le projet, vous avez besoin de Maven.
- en fonction de votre environnement, vous devrez peut-être télécharger le fichier aparapi .dll ou .so correspondant (situé à la racine de chaque archive) et ajoutez son emplacement à la variable PATH du système. Pour la configuration d’OpenCL dans un environnement Linux, vous pouvez trouvez le guide içi
Comment Exécuter Les Exemples
Les échantillons sont organisés en tests unitaires. Si vous voulez voir des exemples sur différents jeux de données populaires, vous pouvez aller à https://github.com/MedMus/neuralnetworks
Structure De La Bibliothèque
Il y a deux projets:
- nn-core – contient l’implémentation complète.
- nn-samples – contient des implémentations de jeux de données populaires
- nn-performance – certaines métriques de performance.
- nn-userinterface – travail inachevé sur la représentation visuelle du réseau.
La conception du logiciel est hiérarchisée, chaque niveau dépendant des précédents.
Architecture Du Réseau
La Propagation De Données
Ce niveau propage les données via le réseau. Il profite de sa structure graphique. Il y a deux composants de base principaux:
- LayerCalculator – propage les données à travers le graphique. Il reçoit la couche cible et les données d’entrée fixées sur une couche donnée (considérée comme une couche d’entrée). Il garantit que les données sont propagées à travers les couches dans le bon ordre et que toutes les connexions dans le graphique sont calculées. Par exemple, pendant la phase d’anticipation de la rétro-propagation, les données d’apprentissage sont bloquées sur la couche d’entrée et propagées à la couche cible (la couche de sortie du réseau). Dans la phase bp, la dérivée d’erreur de sortie est bloquée en tant qu ‘”entrée” dans la couche et les poids sont mis à jour en utilisant une traversée de graphe en largeur commençant à partir de la couche de sortie. Essentiellement, le rôle de LayerCalculator est de fournir l’ordre dans lequel les couches réseau sont calculées.
- ConnectionCalculator – classe de base pour tous les types de neurones (sigmoïde, redresseurs, convolution, etc.). Une fois que l’ordre de calcul des couches est déterminé par LayerCalculator, la liste des connexions d’entrée pour chaque couche est calculée par ConnectionCalculator.
GPU
La plupart des implémentations de ConnectionCalculator sont optimisées pour l’exécution du GPU. Il existe deux implémentations – Native OpenCL et Aparapi. Aparapi impose des restrictions importantes sur le code qui peut être exécuté sur le GPU. Les plus significatifs sont:
- Seuls les tableaux (et variables) unidimensionnels des types de données primitifs sont autorisés. Il n’est pas possible d’utiliser des objets complexes.
- Seules les méthodes membres de la classe Aparapi Kernel sont autorisées à être appelées depuis le code exécutable GPU.
Par conséquent, avant chaque calcul GPU, toutes les données sont converties en tableaux à one-dim (une dimension) et en variables de type primitif. Pour cette raison, tous les types de neurones Aparapi utilisent soit AparapiWeightedSum (pour les couches entièrement connectées et les fonctions d’entrée de la somme pondérée), AparapiSubsampling2D (pour les couches de sous-échantillonnage) ou AparapiConv2D (pour les couches convolutives). La plupart des données sont représentées par un tableau unidimensionnel par défaut (par exemple Matrix).
L’implémentation OpenCL native n’a pas ces restrictions.
Formation
Tous les formateurs utilisent la classe de base Trainer. Ils sont optimisés pour fonctionner sur le GPU, mais vous pouvez brancher d’autres implémentations et de nouveaux algorithmes de formation. La procédure de formation comporte des phases de formation et de test. Chaque formateur reçoit des paramètres (par exemple, le taux d’apprentissage, l’élan, etc.) via les propriétés (un HashMap). Pour les propriétés prises en charge pour chaque formateur, vérifiez la classe TrainerFactory.
Données D’entrée
L’entrée est fournie au réseau de neurones par les formateurs via l’interface TrainingInputProvider. Chaque TrainingInputProvider fournit des exemples d’apprentissage sous la forme TrainingInputData (l’implémentation par défaut est TrainingInputDataImpl). L’entrée peut être modifiée par une liste de modificateurs – par exemple MeanInputFunction (pour soustraire la valeur moyenne) et ScalingInputFunction (mise à l’échelle dans une plage). Actuellement, MnistInputProvider et IrisInputProvider sont implémentés.
Pour télécharger ou juste éditer la librairie ou encore voir l’article Original en Anglais “java deep learning algorithms and deep neural networks with gpu acceleration “