Deeplearning4j: Deep learning et ETL pour la JVM

Eclipse Deeplearning4j est une bibliothèque open source, distribuée et d'apprentissage en profondeur pour la JVM. Deeplearning4j est écrit en Java et est compatible avec n'importe quel langage JVM, tel que Scala, Clojure ou Kotlin. Les calculs sous-jacents sont écrits en C, C ++ et Cuda. Keras servira d'API Python. Intégré à Hadoop et Apache Spark, Deeplearning4j apporte l'IA aux environnements d'entreprise pour une utilisation sur des GPU et des processeurs distribués.

Deeplearning4j est en fait une pile de projets destinés à prendre en charge tous les besoins d'une application d'apprentissage en profondeur basée sur JVM. Au-delà de Deeplearning4j lui-même (l'API de haut niveau), il comprend ND4J (algèbre linéaire à usage général), SameDiff (différenciation automatique basée sur un graphique), DataVec (ETL), Arbiter (recherche d'hyperparamètres) et le C ++ LibND4J (sous-tend tout de ce qui précède). LibND4J à son tour fait appel à des bibliothèques standard pour la prise en charge du processeur et du GPU, telles que OpenBLAS, OneDNN (MKL-DNN), cuDNN et cuBLAS.

L'objectif d'Eclipse Deeplearning4j est de fournir un ensemble de composants de base pour la création d' applications intégrant l'IA. Les produits d'IA au sein d'une entreprise ont souvent une portée plus large que le simple apprentissage automatique. L'objectif global de la distribution est de fournir des valeurs par défaut intelligentes pour la création d'applications d'apprentissage en profondeur.

Deeplearning4j est en concurrence, à un certain niveau, avec tous les autres frameworks d'apprentissage profond. Le projet le plus comparable dans la portée est TensorFlow, qui est le principal cadre d'apprentissage en profondeur de bout en bout pour la production. TensorFlow possède actuellement des interfaces pour Python, C ++ et Java (expérimental), et une implémentation distincte pour JavaScript. TensorFlow utilise deux méthodes d'entraînement: en mode graphique et en mode immédiat (exécution hâtive). Deeplearning4j ne prend actuellement en charge que l'exécution basée sur des graphes.

PyTorch, probablement le principal cadre d'apprentissage en profondeur pour la recherche, ne prend en charge que le mode immédiat; il a des interfaces pour Python, C ++ et Java. H2O Sparkling Water intègre la plate-forme d'apprentissage automatique en mémoire distribuée et open source H2O avec Spark. H2O a des interfaces pour les notebooks Java et Scala, Python, R et H2O Flow.

Le support commercial pour Deeplearning4j peut être acheté auprès de Konduit, qui prend également en charge de nombreux développeurs travaillant sur le projet.

Comment fonctionne Deeplearning4j

Deeplearning4j traite les tâches de chargement de données et d'algorithmes d'entraînement comme des processus séparés. Vous chargez et transformez les données à l'aide de la bibliothèque DataVec et vous entraînez des modèles à l'aide de tenseurs et de la bibliothèque ND4J.

Vous ingérez des données via une RecordReaderinterface et parcourez les données à l'aide d'un fichier RecordReaderDataSetIterator. Vous pouvez choisir une DataNormalizationclasse à utiliser comme préprocesseur pour votre DataSetIterator. Utilisez ImagePreProcessingScalerpour les données d'image, NormalizerMinMaxScalersi vous avez une plage uniforme sur toutes les dimensions de vos données d'entrée et NormalizerStandardizedans la plupart des autres cas. Si nécessaire, vous pouvez implémenter une DataNormalizationclasse personnalisée .

DataSetLes objets sont des conteneurs pour les caractéristiques et les étiquettes de vos données et conservent les valeurs dans plusieurs instances de INDArray: une pour les caractéristiques de vos exemples, une pour les étiquettes et deux autres pour le masquage, si vous utilisez des données de séries chronologiques. Dans le cas des caractéristiques, le INDArrayest un tenseur de la taille Number of Examples x Number of Features. En règle générale, vous diviserez les données en mini-lots pour la formation; le nombre d'exemples dans un INDArrayest assez petit pour tenir en mémoire mais assez grand pour obtenir un bon dégradé.

Si vous regardez le code Deeplearning4j pour définir des modèles, comme l'exemple Java ci-dessous, vous verrez qu'il s'agit d'une API de très haut niveau, similaire à Keras. En fait, l'interface Python prévue avec Deeplearning4j utilisera Keras; dès maintenant, si vous avez un modèle Keras, vous pouvez l'importer dans Deeplearning4j.

MultiLayerConfiguration conf =

    nouveau NeuralNetConfiguration.Builder ()

        .optimizationAlgo (OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)

        .updater (nouveaux Nesterovs (learningRate, 0.9))

        .liste(

            nouveau DenseLayer.Builder (). nIn (numInputs) .nOut (numHiddenNodes) .activation ("relu"). build (),

            nouveau OutputLayer.Builder (LossFunction.NEGATIVELOGLIKELIHOOD).

                  activation ("softmax"). nIn (numHiddenNodes) .nOut (numOutputs) .build ()

        ) .backprop (vrai) .build ();

La MultiLayerNetworkclasse est l'API de configuration de réseau la plus simple disponible dans Eclipse Deeplearning4j; pour les structures DAG, utilisez à la ComputationGraphplace. Notez que l'algorithme d'optimisation (SGD dans cet exemple) est spécifié séparément du programme de mise à jour (Nesterov dans cet exemple). Ce réseau neuronal très simple a une couche dense avec une ReLUfonction d'activation et une couche de sortie avec -log(likelihood)perte et une softmaxfonction d'activation, et est résolu par propagation en retour. Des réseaux plus complexes peuvent également GravesLSTM, ConvolutionLayer, EmbeddingLayeret d' autres des deux douzaines de types de couches pris en charge et seize types d'espace de couche.

Le moyen le plus simple d'entraîner le modèle consiste à appeler la .fit()méthode sur la configuration du modèle avec votre DataSetIteratorcomme argument. Vous pouvez également réinitialiser l'itérateur et appeler la .fit()méthode pour autant d'époques que vous le souhaitez, ou utiliser un fichier EarlyStoppingTrainer.

Pour tester les performances du modèle, utilisez une Evaluationclasse pour voir dans quelle mesure le modèle entraîné s'adapte à vos données de test, qui ne doivent pas être identiques aux données d'entraînement.

Deeplearning4j fournit une fonction d'écoute vous permettant de surveiller visuellement les performances de votre réseau, qui sera appelée après le traitement de chaque mini-lot. L'un des écouteurs les plus souvent utilisés est ScoreIterationListener.

Installation et test de Deeplearning4j

At the moment, the easiest way to try out Deeplearning4j is by using the official quick start. It requires a relatively recent version of Java, an installation of Maven, a working Git, and a copy of IntelliJ IDEA (preferred) or Eclipse. There are also a few user-contributed quick starts. Start by cloning the eclipse/deeplearning4j-examples repo to your own machine with Git or GitHub Desktop. Then install the projects with Maven from the dl4j-examples folder.

[email protected] dl4j-examples % mvn clean install

[INFO] Scanning for projects...

[WARNING]

[WARNING] Some problems were encountered while building the effective model for org.deeplearning4j:dl4j-examples:jar:1.0.0-beta7

[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-compiler-plugin @ line 250, column 21

[WARNING]

[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.

[WARNING]

[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.

[WARNING]

[INFO]

[INFO] ------------------< org.deeplearning4j:dl4j-examples >------------------

[INFO] Building Introduction to DL4J 1.0.0-beta7

[INFO] --------------------------------[ jar ]---------------------------------

Downloaded from central: //repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-enforcer-plugin/1.0.1/maven-enforcer-plugin-1.0.1.pom (6.5 kB at 4.4 kB/s)

Downloading from central: //repo.maven.apache.org/maven2/org/apache/maven/enforcer/enforcer/1.0.1/enforcer-1.0.1.pom

Downloaded from central: //repo.maven.apache.org/maven2/org/apache/maven/enforcer/enforcer/1.0.1/enforcer-1.0.1.pom (11 kB at 137 kB/s)

Downloading from central: //repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-enforcer-plugin/1.0.1/maven-enforcer-plugin-1.0.1.jar

Downloaded from central: //repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-enforcer-plugin/1.0.1/maven-enforcer-plugin-1.0.1.jar (22 kB at 396 kB/s)

Downloading from central: //repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/1.4.0/exec-maven-plugin-1.4.0.pom

Downloaded from central: //repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/1.4.0/exec-maven-plugin-1.4.0.pom (12 kB at 283 kB/s)

Downloading from central: //repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/1.4.0/exec-maven-plugin-1.4.0.jar

Downloaded from central: //repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/1.4.0/exec-maven-plugin-1.4.0.jar (46 kB at 924 kB/s)

Downloading from central: //repo.maven.apache.org/maven2/com/lewisd/lint-maven-plugin/0.0.11/lint-maven-plugin-0.0.11.pom

Downloaded from central: //repo.maven.apache.org/maven2/com/lewisd/lint-maven-plugin/0.0.11/lint-maven-plugin-0.0.11.pom (19 kB at 430 kB/s)

Downloading from central: //repo.maven.apache.org/maven2/com/lewisd/lint-maven-plugin/0.0.11/lint-maven-plugin-0.0.11.jar

Downloaded from central: //repo.maven.apache.org/maven2/com/lewisd/lint-maven-plugin/0.0.11/lint-maven-plugin-0.0.11.jar (106 kB at 1.6 MB/s)

Downloading from central: //repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-compiler-plugin/3.5.1/maven-compiler-plugin-3.5.1.pom

[WARNING]   - org.agrona.collections.Hashing

[WARNING]   - org.agrona.collections.Long2ObjectCache$ValueIterator

[WARNING]   - org.agrona.collections.Int2ObjectHashMap$EntrySet

[WARNING]   - org.agrona.concurrent.SleepingIdleStrategy

[WARNING]   - org.agrona.collections.MutableInteger

[WARNING]   - org.agrona.collections.Int2IntHashMap

[WARNING]   - org.agrona.collections.IntIntConsumer

[WARNING]   - org.agrona.concurrent.status.StatusIndicator

[WARNING]   - 175 more...

[WARNING] javafx-base-14-mac.jar, javafx-graphics-14-mac.jar, jakarta.xml.bind-api-2.3.2.jar define 1 overlapping classes:

[WARNING]   - module-info

[WARNING] protobuf-1.0.0-beta7.jar, guava-19.0.jar define 3 overlapping classes:

[WARNING]   - com.google.thirdparty.publicsuffix.TrieParser

[WARNING]   - com.google.thirdparty.publicsuffix.PublicSuffixPatterns

[WARNING]   - com.google.thirdparty.publicsuffix.PublicSuffixType

[WARNING] jsr305-3.0.2.jar, guava-1.0.0-beta7.jar define 35 overlapping classes:

[WARNING]   - javax.annotation.RegEx

[WARNING]   - javax.annotation.concurrent.Immutable

[WARNING]   - javax.annotation.meta.TypeQualifierDefault

[WARNING]   - javax.annotation.meta.TypeQualifier

[WARNING]   - javax.annotation.Syntax

[WARNING]   - javax.annotation.CheckReturnValue

[WARNING]   - javax.annotation.CheckForNull

[WARNING]   - javax.annotation.Nonnull

[WARNING]   - javax.annotation.meta.TypeQualifierNickname

[WARNING]   - javax.annotation.MatchesPattern

[WARNING]   - 25 more...

[WARNING] maven-shade-plugin has detected that some class files are

[WARNING] present in two or more JARs. When this happens, only one

[WARNING] single version of the class is copied to the uber jar.

[WARNING] Usually this is not harmful and you can skip these warnings,

[WARNING] otherwise try to manually exclude artifacts based on

[WARNING] mvn dependency:tree -Ddetail=true and the above output.

[WARNING] See //maven.apache.org/plugins/maven-shade-plugin/

[INFO] Attaching shaded artifact.

[INFO]

[INFO] --- maven-install-plugin:2.4:install (default-install) @ dl4j-examples ---

[INFO] Installing /Volumes/Data/repos/deeplearning4j-examples/dl4j-examples/target/dl4j-examples-1.0.0-beta7.jar to /Users/martinheller/.m2/repository/org/deeplearning4j/dl4j-examples/1.0.0-beta7/dl4j-examples-1.0.0-beta7.jar

[INFO] Installing /Volumes/Data/repos/deeplearning4j-examples/dl4j-examples/pom.xml to /Users/martinheller/.m2/repository/org/deeplearning4j/dl4j-examples/1.0.0-beta7/dl4j-examples-1.0.0-beta7.pom

[INFO] Installing /Volumes/Data/repos/deeplearning4j-examples/dl4j-examples/target/dl4j-examples-1.0.0-beta7-shaded.jar to /Users/martinheller/.m2/repository/org/deeplearning4j/dl4j-examples/1.0.0-beta7/dl4j-examples-1.0.0-beta7-shaded.jar

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time:  05:07 min

[INFO] Finished at: 2020-07-10T10:58:55-04:00

[INFO] ------------------------------------------------------------------------

[email protected] dl4j-examples %

Once the installation is complete, open the dl4j-examples/ directory with IntelliJ IDEA and try running some of the examples.