— Deep Learning Machine — Library Deep Learning saat ini banyak dikembangkan dengan menggunakan bahasa python, adapun beberapa bahasa seperti C++ yaitu caffe2 dan banyak lainnya tidak begitu berkembang. Setiap bahasa dan library berkembang dengan adanya komunitas penggunanya. Hemm… bagaimana dengan bahasa seperti java?! Apakah ada library yang mempermudah deep learning dengan java?
Deep Learning Java menggunakan Deep Java Library – DJL
Contents
Disingkat dengan DJL – https://djl.ai/ dengan tagline – Open Source library to build and deploy deep learning in java – DLJ sangat aktif dalam membuat banyak project karena AWS Amazon sebagai sponsornya, kalau Pytorch adalah facebook dan Tensorflow adalah Google. Didalam githubnya ada banyak sekali contohnya – https://github.com/deepjavalibrary/djl/tree/master/examples –
Engine
DLJ mendukung banyak engine seperti
Mencoba DJL
Build tools di java, saya sarankan dengan Gradle dan Maven serta IDE Netbeans! Mari kita coba saja membuat project java berbasis gradle – https://towardsdatascience.com/deep-learning-in-java-d9b54ae1423a – Yuk tambahkan dependecies seperti berikut
implementation "ai.djl:api:0.12.0" implementation "ai.djl:basicdataset:0.12.0" implementation "ai.djl:model-zoo:0.12.0" implementation "ai.djl.mxnet:mxnet-engine:0.12.0" implementation "org.slf4j:slf4j-api:1.7.26" implementation "org.slf4j:slf4j-simple:1.7.26" implementation "net.java.dev.jna:jna:5.3.0" implementation "ai.djl.mxnet:mxnet-native-auto:1.8.0"
Seperti kita bisa menggunakan benchmark dataset MNIST sebagai pelatihan, berikut kita akan melatih dataset MNIST
int batchSize = 32; Mnist mnist = Mnist.builder().setSampling(batchSize, true).build(); mnist.prepare(new ProgressBar()); Model model = Model.newInstance("mlp"); model.setBlock(new Mlp(28 * 28, 10, new int[] {128, 64})); DefaultTrainingConfig config = new DefaultTrainingConfig(Loss.softmaxCrossEntropyLoss()) //softmaxCrossEntropyLoss is a standard loss for classification problems .addEvaluator(new Accuracy()) // Use accuracy so we humans can understand how accurate the model is .addTrainingListeners(TrainingListener.Defaults.logging()); // Now that we have our training configuration, we should create a new trainer for our model Trainer trainer = model.newTrainer(config); trainer.initialize(new Shape(1, 28 * 28)); int epoch = 2; EasyTrain.fit(trainer, epoch, mnist, null) Path modelDir = Paths.get("build/mlp"); Files.createDirectories(modelDir); model.setProperty("Epoch", String.valueOf(epoch)); model.save(modelDir, "mlp");
Kalian bisa melihat diakhir kode disimpan dengan nama build/mlp, proses pelatihan butuh sekitar 20 menit hasilnya akan disimpan dengan nama *.params
Yuk sekarang kita coba gunakan model yang sudah disimpan tadi untuk menguji dataset berupa gambar dari URL
var img = ImageFactory.getInstance().fromUrl("https://resources.djl.ai/images/0.png"); img.getWrappedImage(); Path modelDir = Paths.get("build/mlp"); Model model = Model.newInstance("mlp"); model.setBlock(new Mlp(28 * 28, 10, new int[] {128, 64})); model.load(modelDir); Translator<Image, Classifications> translator = new Translator<Image, Classifications>() { @Override public NDList processInput(TranslatorContext ctx, Image input) { // Convert Image to NDArray NDArray array = input.toNDArray(ctx.getNDManager(), Image.Flag.GRAYSCALE); return new NDList(NDImageUtils.toTensor(array)); } @Override public Classifications processOutput(TranslatorContext ctx, NDList list) { // Create a Classifications with the output probabilities NDArray probabilities = list.singletonOrThrow().softmax(0); List<String> classNames = IntStream.range(0, 10).mapToObj(String::valueOf).collect(Collectors.toList()); return new Classifications(classNames, probabilities); } @Override public Batchifier getBatchifier() { // The Batchifier describes how to combine a batch together // Stacking, the most common batchifier, takes N [X1, X2, ...] arrays to a single [N, X1, X2, ...] array return Batchifier.STACK; } }; var predictor = model.newPredictor(translator); var classifications = predictor.predict(img); System.out.println(classifications);
hasilnya
[ class: "0", probability: 0.99997 class: "6", probability: 0.00001 class: "2", probability: 0.00001 class: "9", probability: 5.1e-07 class: "1", probability: 2.9e-07 ]
Hasilnya sesuai dengan dataset gambar
yaitu probalitias nya angka 0 mempunyai nilai tertinggi yaitu 0.99997
Bila kalian ingin menggunakan Maven
Bisa kunjungi berikut https://medium.com/datactw/deep-learning-for-java-dl4j-getting-started-tutorial-2259c76c0a7c
Deep Learning Java menggunakan deepnetts
Selain menggunakan Deep Library Java diatas, kita bisa menggunakan – https://www.deepnetts.com/ -tapi bedanya ini dikembangkan oleh perusahaan deepnetts, yuk kita coba saja – https://github.com/deepnetts/deepnetts-communityedition – Oiya ini menggunakan Maven ya, kalian tambahkan berikut
<dependency> <groupId>com.deepnetts</groupId> <artifactId>deepnetts-core</artifactId> <version>1.12</version> </dependency>
Yuk kita coba dengan logika XOR yang sangat simple untuk menguji dataset bersifat non linear, kita buat class dataset terlebih dahulu
class ExampleDataSets { public static TabularDataSet xor() { TabularDataSet dataSet = new TabularDataSet(2, 1); MLDataItem item1 = new TabularDataSet.Item(new float[] {0, 0}, new float[] {0}); dataSet.add(item1); MLDataItem item2 = new TabularDataSet.Item(new float[] {0, 1}, new float[] {1}); dataSet.add(item2); MLDataItem item3 = new TabularDataSet.Item(new float[] {1, 0}, new float[] {1}); dataSet.add(item3); MLDataItem item4 = new TabularDataSet.Item(new float[] {1, 1}, new float[] {0}); dataSet.add(item4); return dataSet; } }
Yuk langsung saja gunakan kode berikut
TabularDataSet dataSet = ExampleDataSets.xor(); dataSet.setColumnNames(new String[] {"input1", "input2", "output"}); FeedForwardNetwork neuralNet = FeedForwardNetwork.builder() .addInputLayer(2) .addFullyConnectedLayer(3, ActivationType.TANH) .addOutputLayer(1, ActivationType.SIGMOID) .lossFunction(LossType.MEAN_SQUARED_ERROR) .build(); neuralNet.setOutputLabels("output"); BackpropagationTrainer trainer = new BackpropagationTrainer(neuralNet); trainer.setMaxEpochs(1000); trainer.setMaxError(0.01f); trainer.setLearningRate(0.9f); trainer.train(dataSet); float [][] contoh = new float[][]{{1,1},{1,0},{0,1},{0,0}}; for(float [] cnt:contoh){ float [] hasil = neuralNet.predict(cnt); System.out.println(cnt[0]+" "+cnt[1]+" --> "+hasil[0]); }
hasilnya
Epoch:163, Time:0ms, TrainError:0.010333252, TrainErrorChange:-3.6292523E-4, TrainAccuracy: 1.0 Epoch:164, Time:0ms, TrainError:0.0099921785, TrainErrorChange:-3.410736E-4, TrainAccuracy: 1.0 TRAINING COMPLETED Total Training Time: 87ms ------------------------------------------------------------------------ 1.0 1.0 --> 0.15136014 1.0 0.0 --> 0.870597 0.0 1.0 --> 0.8830706 0.0 0.0 --> 0.13116015
Untuk lebih lanjut, kalian bisa menggunakan example yang telah disediakan oleh mereka, – https://github.com/deepnetts/deepnetts-communityedition/tree/community-visrec/deepnetts-examples/src/main/java/deepnetts/examples –
Deep Learning Java menggunakan deeplearning4j
Selain kedua library diatas kalian bisa menggunakan – https://deeplearning4j.org/ – examplenya bisa kalian pelajari disini – https://github.com/eclipse/deeplearning4j-examples – bedanya 2 diatas adalah support untuk android! – https://deeplearning4j.konduit.ai/ –. Kalian wajib gunakan maven ya! – https://search.maven.org/search?q=deeplearning4j –
Kesimpulan
Dari ketiga library diatas, yaitu
- DJL – Deep java Library: bebas pilih engine seperti pytorch, ONXX
- Deepnetts: pure java
- DeepLearning4j: support untuk android juga
Semuanya bagus sekali dan mempunyai kelebihan masing-masing, kalian sebagai developer harus menyesuaikan saja dengan kebutuhan user/client – Deep Learning Machine