Deep Learning Machine

By | July 28, 2024
1,063 Views

— 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

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

See also  Pytorch memperkenalkan TorchRec, library open source untuk Sistem Rekomendasi

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

See also  #Video Tutorial - Belajar Python Bagian 3

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

  1. DJL – Deep java Library: bebas pilih engine seperti pytorch, ONXX
  2. Deepnetts: pure java
  3. 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