Bagaimana Menerapkan CNN dengan Deeplearning4j

1. Ikhtisar

Dalam tutorial ini, kita akan membuat dan melatih model jaringan neural konvolusional menggunakan pustaka Deeplearning4j di Java.

Untuk informasi lebih lanjut tentang cara mengatur perpustakaan, silakan lihat panduan kami di Deeplearning4j.

2. Klasifikasi Gambar

2.1. Pernyataan masalah

Misalkan kita memiliki sekumpulan gambar. Setiap gambar mewakili objek dari kelas tertentu. Selain itu, objek pada gambar termasuk satu-satunya kelas yang diketahui. Jadi rumusan masalahnya adalah membangun model yang akan mampu mengenali kelas objek pada citra yang diberikan .

Misalnya, kita memiliki sekumpulan gambar dengan sepuluh gerakan tangan. Kami membuat model dan melatihnya untuk mengklasifikasikannya. Kemudian setelah pelatihan, kami dapat memberikan gambar lain dan mengklasifikasikan gerakan tangan pada gambar tersebut. Tentu saja, gerakan yang diberikan haruslah milik kelas yang dikenal.

2.2. Representasi Gambar

Dalam memori komputer, gambar dapat direpresentasikan sebagai matriks angka. Setiap angka adalah nilai piksel, mulai dari 0 hingga 255.

Gambar grayscale adalah matriks 2D. Demikian pula gambar RGB merupakan matriks 3D dengan dimensi lebar, tinggi, dan kedalaman.

Seperti yang bisa kita lihat, gambar adalah sekumpulan angka . Oleh karena itu, kita dapat membangun model jaringan multi-layer untuk melatih mereka mengklasifikasikan gambar.

3. Jaringan Neural Konvolusional

Convolutional Neural Network (CNN) adalah model jaringan multi-layer yang memiliki struktur tertentu. Struktur CNN dapat dibagi menjadi dua blok: lapisan konvolusional dan lapisan yang sepenuhnya terhubung (atau padat) . Mari kita lihat masing-masing.

3.1. Lapisan Konvolusional

Setiap lapisan konvolusional adalah kumpulan matriks persegi, yang disebut kernel . Di atas segalanya, kita membutuhkan mereka untuk melakukan konvolusi pada gambar masukan. Jumlah dan ukurannya dapat bervariasi, tergantung pada kumpulan data yang diberikan. Kami kebanyakan menggunakan kernel 3 × 3 atau 5 × 5, dan jarang yang 7 × 7. Ukuran dan jumlah yang tepat dipilih dengan trial and error.

Selain itu, kami secara acak memilih variabel matriks kernel di awal rangkaian. Mereka adalah bobot jaringan.

Untuk melakukan konvolusi, kita dapat menggunakan kernel sebagai jendela geser. Kami akan mengalikan bobot kernel dengan piksel gambar yang sesuai dan menghitung jumlahnya. Kemudian kita dapat memindahkan kernel untuk menutupi potongan gambar berikutnya menggunakan langkah (bergerak ke kanan) dan padding (bergerak ke bawah). Hasilnya, kita akan mendapatkan nilai yang akan digunakan dalam perhitungan selanjutnya.

Singkatnya, dengan lapisan ini, kita mendapatkan gambar yang berbelit-belit . Beberapa variabel mungkin kurang dari nol. Ini biasanya berarti bahwa variabel-variabel ini kurang penting dibandingkan variabel lainnya. Itulah mengapa menerapkan fungsi ULT adalah pendekatan yang baik untuk membuat lebih sedikit penghitungan lebih lanjut.

3.2. Lapisan Subsampling

Lapisan subsampling (atau penggabungan) adalah lapisan jaringan, biasanya digunakan setelah jaringan konvolusional. Setelah konvolusi, kita mendapatkan banyak variabel yang dihitung . Namun, tugas kita adalah memilih yang paling berharga di antara mereka .

Pendekatannya adalah dengan menerapkan algoritma jendela geser ke gambar yang berbelit-belit. Pada setiap langkah, kita akan memilih nilai maksimum di jendela persegi dengan ukuran yang telah ditentukan, biasanya antara 2 × 2 dan 5 × 5 piksel. Akibatnya, kita akan memiliki lebih sedikit parameter yang dihitung. Oleh karena itu, ini akan mengurangi penghitungan.

3.3. Lapisan Padat

Lapisan padat (atau sepenuhnya terhubung) adalah lapisan yang terdiri dari banyak neuron. Kami membutuhkan lapisan ini untuk melakukan klasifikasi. Selain itu, mungkin ada dua atau lebih dari lapisan konsekuen seperti itu. Yang penting, lapisan terakhir harus memiliki ukuran yang sama dengan jumlah kelas untuk klasifikasi.

Output jaringan adalah probabilitas gambar milik masing-masing kelas . Untuk memprediksi probabilitas, kami akan menggunakan fungsi aktivasi Softmax.

3.4. Teknik Optimasi

Untuk melakukan pelatihan, kita perlu mengoptimalkan bobot. Ingat, awalnya kami memilih variabel ini secara acak. Jaringan saraf adalah fungsi yang besar . Dan, itu memiliki banyak parameter yang tidak diketahui, bobot kami.

Ketika kami mengirimkan gambar ke jaringan, itu memberi kami jawabannya . Kemudian, kita dapat membuat fungsi kerugian, yang bergantung pada jawaban ini . Dalam hal pembelajaran yang diawasi, kami juga memiliki jawaban aktual - kelas yang sebenarnya. Misi kami adalah meminimalkan fungsi kerugian ini . Jika kita berhasil, maka model kita terlatih dengan baik.

Untuk meminimalkan fungsinya, kita harus memperbarui bobot jaringan . Untuk melakukan itu, kita dapat menghitung turunan dari fungsi kerugian sehubungan dengan masing-masing parameter yang tidak diketahui ini. Kemudian, kami dapat memperbarui setiap bobot.

Kita dapat menambah atau mengurangi nilai bobot untuk menemukan minimum lokal dari fungsi kerugian kita karena kita mengetahui kemiringannya. Selain itu, proses ini berulang dan disebut Gradient Descent . Propagasi mundur menggunakan penurunan gradien untuk menyebarkan pembaruan bobot dari akhir ke awal jaringan.

Dalam tutorial ini, kita akan menggunakan algoritma pengoptimalan Stochastic Gradient Decent (SGD). Ide utamanya adalah kami memilih secara acak kumpulan gambar kereta api di setiap langkah. Kemudian kami menerapkan propagasi mundur.

3.5. Metrik Evaluasi

Terakhir, setelah melatih jaringan, kita perlu mendapatkan informasi tentang seberapa baik performa model kita.

Metrik yang paling banyak digunakan adalah akurasi . Ini adalah rasio gambar yang diklasifikasikan dengan benar ke semua gambar. Sementara itu, recall, precision, dan F1-score juga merupakan metrik yang sangat penting untuk klasifikasi gambar .

4. Penyusunan Set Data

Di bagian ini, kami akan menyiapkan gambar. Mari gunakan set data CIFAR10 yang disematkan dalam tutorial ini. Kami akan membuat iterator untuk mengakses gambar:

public class CifarDatasetService implements IDataSetService { private CifarDataSetIterator trainIterator; private CifarDataSetIterator testIterator; public CifarDatasetService() { trainIterator = new CifarDataSetIterator(trainBatch, trainImagesNum, true); testIterator = new CifarDataSetIterator(testBatch, testImagesNum, false); } // other methods and fields declaration }

Kami dapat memilih beberapa parameter sendiri. TrainBatch dan testBatch masing-masing adalah jumlah gambar per kereta dan langkah evaluasi. TrainImagesNum dan testImagesNum adalah jumlah gambar untuk pelatihan dan pengujian. Satu zaman berlangsung trainImagesNum / trainBatch langkah . Jadi, memiliki 2048 gambar kereta dengan ukuran batch = 32 akan menghasilkan 2048/32 = 64 langkah per satu epoch.

5. Jaringan Neural Konvolusional dalam Deeplearning4j

5.1. Membangun Model

Selanjutnya, mari buat model CNN kita dari awal. Untuk melakukannya, kita akan menggunakan lapisan konvolusional, subsampling (penggabungan), dan terhubung sepenuhnya (padat) .

MultiLayerConfiguration configuration = new NeuralNetConfiguration.Builder() .seed(1611) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .learningRate(properties.getLearningRate()) .regularization(true) .updater(properties.getOptimizer()) .list() .layer(0, conv5x5()) .layer(1, pooling2x2Stride2()) .layer(2, conv3x3Stride1Padding2()) .layer(3, pooling2x2Stride1()) .layer(4, conv3x3Stride1Padding1()) .layer(5, pooling2x2Stride1()) .layer(6, dense()) .pretrain(false) .backprop(true) .setInputType(dataSetService.inputType()) .build(); network = new MultiLayerNetwork(configuration);

Di sini kami menentukan kecepatan pembelajaran, algoritme pembaruan, jenis masukan model kami, dan arsitektur berlapis . Kami dapat bereksperimen pada konfigurasi ini. Dengan demikian, kami dapat melatih banyak model dengan arsitektur dan parameter pelatihan yang berbeda. Selanjutnya kita dapat membandingkan hasil dan memilih model terbaik.

5.2. Melatih Model

Kemudian, kami akan melatih model yang dibangun. Ini dapat dilakukan dalam beberapa baris kode:

public void train() { network.init(); IntStream.range(1, epochsNum + 1).forEach(epoch -> { network.fit(dataSetService.trainIterator()); }); }

Jumlah epoch adalah parameter yang bisa kita tentukan sendiri . Kami memiliki kumpulan data kecil. Hasilnya, beberapa ratus epoch sudah cukup.

5.3. Mengevaluasi Model

Terakhir, kami dapat mengevaluasi model yang sekarang terlatih. Pustaka Deeplearning4j menyediakan kemampuan untuk melakukannya dengan mudah:

public Evaluation evaluate() { return network.evaluate(dataSetService.testIterator()); }

Evaluasi adalah sebuah objek, yang berisi metrik yang dihitung setelah melatih model. Yakni akurasi, presisi, recall, dan skor F1 . Selain itu, ia memiliki antarmuka yang dapat dicetak yang ramah:

==========================Scores===================== # of classes: 11 Accuracy: 0,8406 Precision: 0,7303 Recall: 0,6820 F1 Score: 0,6466 =====================================================

6. Kesimpulan

Dalam tutorial ini, kita telah mempelajari tentang arsitektur model CNN, teknik pengoptimalan, dan metrik evaluasi. Selanjutnya, kami telah mengimplementasikan model menggunakan pustaka Deeplearning4j di Java.

Seperti biasa, kode untuk contoh ini tersedia di GitHub.