Kata pengantar
Dalam pembelajaran mesin, jaringan saraf konvolusional adalah jaringan saraf buatan yang dapat diselesaikan yang telah berhasil diterapkan pada pengenalan gambar. Saat ini, banyak pengakuan nomor plat, pengenalan wajah, dll. Gunakan jaringan saraf konvolusional. Dapat dikatakan bahwa jaringan saraf konvolusional telah mencapai kesuksesan besar dalam pengakuan gambar. Ada banyak kerangka pembelajaran mendalam sumber terbuka, seperti caffe, tensorflow, obor, dll. Kerangka kerja pembelajaran yang mendalam ini termasuk implementasi jaringan saraf konvolusional lengkap. Jadi, mengapa kita masih harus menulis jaringan saraf konvolusional sendiri? Lebih baik menggunakan kerangka pembelajaran mendalam sumber terbuka ini secara langsung, yang cepat dan mudah ditangani, memiliki kinerja yang baik dan beberapa bug. Ya, jika Anda hanya menggunakan jaringan saraf konvolusional untuk melakukan beberapa aplikasi dan tidak peduli dengan prinsip kerjanya, maka Anda tidak perlu bekerja keras untuk menulis jaringan saraf konvolusional. Tetapi jika Anda ingin sepenuhnya menguasai prinsip kerja jaringan saraf konvolusional, orang kuno mengatakan: Apa yang Anda dapatkan di atas kertas selalu dangkal, dan Anda harus mempraktikkan kesadaran saat ini. Karena itu, sangat penting bagi Anda untuk mengimplementasikan jaringan saraf konvolusional sendiri untuk memperdalam pemahaman Anda tentang hal itu.
Apa itu cupcnn
Cupcnn adalah jaringan saraf konvolusional yang ditulis dalam Java. Selain bekerja, saya menyadarinya untuk memperdalam pemahaman saya tentang jaringan saraf konvolusional. Ini cukup sederhana dan berkinerja baik, membuatnya sangat cocok untuk dirujuk oleh pemula. Kode sumbernya dapat diunduh dari GitHub: Cupcnn
Anda tidak perlu khawatir tentang keterbatasan protokolnya atau semacamnya. Anda dapat menggunakannya untuk melakukan apa saja dan memodifikasinya secara sewenang -wenang. Jika itu dapat membantu Anda, saya harap ini dapat memberi Anda bintang! Lai Lai
^-^^-^^-^^-^
Ide Desain
Saya berharap ini adalah jaringan saraf yang cukup sederhana untuk membantu pemula belajar. Jadi saya tidak menerapkan hal -hal akselerasi bersamaan itu, yang menjamin sifat pengantar kode. Saat merancang, saya membagi jaringan saraf konvolusional menjadi empat modul: jaringan (Layer Blob Loss Active), yang dapat dilihat dari nama paket. Lapisan, kehilangan, dan aktif semuanya memiliki kelas dasar, dan pemrograman seluruh jaringan saraf berorientasi pada kelas dasar. Jaringan adalah pusat yang mengintegrasikan keempat modul ini, mengoordinasikan dan mengirim sumber daya. Setiap lapisan akan memiliki instance jaringan, sehingga berbagai data dapat dengan mudah diperoleh melalui jaringan, seperti mendapatkan output dari setiap lapisan, diff, dll.
Diagram blok desain adalah sebagai berikut:
Parameter menyimpan sangat sederhana untuk Java. Menerapkan antarmuka serializable dapat dengan cepat mengimplementasikan serialisasi dan deserialisasi parameter. CUPCNN hanya mengimplementasikan antarmuka serializable untuk Blob dan Blobparams di direktori data, dan semua parameter diimplementasikan oleh keduanya.
Kinerja saat ini
Jaringan saraf yang sepenuhnya terhubung
Saat ini, pada dataset MNIST, jaringan saraf yang sepenuhnya terhubung (koneksi penuh (100) + koneksi penuh (30) + koneksi penuh (10) + softmax) dilatih dengan 30 EPOE, dengan laju akurasi 96,76
Jaringan saraf konvolusional
Jaringan saraf konvolusional (6 fitur) + pooling maksimum + konvolusi (6 fitur) + koneksi penuh (512) + koneksi penuh (30) + koneksi penuh (10) + softmax), ketika laju pembelajaran 0,2, 30 EPOE dilatih, laju akurasi adalah 97,79. Saya percaya bahwa setelah penyetelan parameter lebih lanjut, tingkat akurasi dapat lebih tinggi di bawah pelatihan yang cukup.
Snapshot pelatihan dari jaringan saraf konvolusional adalah sebagai berikut:
mulai kereta
EPOE: 0 LossValue: 2.3019369891560455 LR: 0.2 Akurasi adalah 0.13
EPOE: 0 LossValue: 2.0722489482105195 LR: 0.2 Akurasi adalah 0.44
EPOE: 0 LossValue: 1.2423286194012682 LR: 0.2 Akurasi adalah 0.72
EPOE: 0 LossValue: 0.7860529560675255 LR: 0.2 Akurasi adalah 0.79
EPOE: 0 LossValue: 0.6272194196176664 LR: 0.2 Akurasi adalah 0.87
EPOE: 0 LossValue: 0,5240051326725808 LR: 0,2 akurasi 0,84
EPOE: 0 LossValue: 0,27637563581928026 LR: 0,2 akurasi 0,95
EPOE: 0 LossValue: 0.35585388987055083 LR: 0.2 Akurasi adalah 0.92
EPOE: 0 LossValue: 0.441971528417802 LR: 0.2 Akurasi adalah 0.92
EPOE: 0 LossValue: 0,2563771032599674 LR: 0,2 akurasi 0,95
EPOE: 0 LossValue: 0.39872273532502 LR: 0.2 Akurasi adalah 0.9
EPOE: 1 LossValue: 0.264085484522027 LR: 0.16000000000000000000003 Akurasi adalah 0.91
EPOE: 1 LossValue: 0.22754066024803088 LR: 0.16000000000000000000003 Akurasi adalah 0.96
EPOE: 1 LossValue: 0.30256420975577103 LR: 0.16000000000000000000003 Akurasi adalah 0.96
EPOE: 1 LossValue: 0.18149648622985948 LR: 0.16000000000000000003 Akurasi adalah 0.99
EPOE: 1 LossValue: 0.177239938748327 LR: 0.16000000000000000000003 Akurasi adalah 0.96
EPOE: 1 LossValue: 0.15041993009777443 LR: 0.16000000000000000000003 Akurasi adalah 0.98
EPOE: 1 LossValue: 0.10759545752665524 LR: 0.160000000000000000.0003 Akurasi adalah 1.0
Penggunaan cupcnn
Saat ini, Cupcnn mengimplementasikan tes pada dataset MNIST. Di bawah SRC/Test, Mnisttest adalah pintu masuk ke fungsi utama, dan jaringan saraf spesifik dibangun di kelas MnistNetwork. Di kelas MnistNetwork, BuildConVNetwork dan BuildFcNetwork masing -masing mengimplementasikan pembangunan jaringan saraf konvolusional dan pembangunan jaringan saraf yang terhubung sepenuhnya. Berkat properti lintas-platform yang baik dari Java, setelah Anda mengunduh kode sumber Cupcnn, gunakan Eclipse untuk membuka proyek, dan kemudian jalankan secara langsung, Anda harus dapat memulai pelatihan dan pengujian pada dataset MNIST.
Membangun Jaringan Saraf
public void buildnetwork () {// Pertama membangun objek jaringan saraf dan atur parameter network = new network (); network.setBatch (100); network.setLoss (new LoglikehoodLoss ()); //network.setloss(new crossentropyloss ()); pengoptimal = sgdoptimizer baru (0,2); network.setoptimizer (pengoptimal); // buildfcnetwork (); buildConvnetwork (); network.prepare (); } Fungsi setBatch () mengatur berapa banyak gambar dalam batch.
setLoss () Mengatur fungsi kerugian untuk digunakan. Cupcnn mengimplementasikan fungsi kehilangan entropi silang dan fungsi kehilangan log-likelihood.
setoptimizer () harus digunakan untuk mengatur pengoptimal. Cupcnn hanya mengimplementasikan pengoptimal SGD. Jika Anda menerapkan pengoptimal yang lebih baik dan bersedia mengirimkannya ke Cupcnn, saya ingin sangat menyambutnya.
Membangun jaringan saraf yang sepenuhnya terhubung
private void buildfcnetwork () {// Tambahkan lapisan jaringan ke lapisan inputlayer jaringan1 = inputlayer baru (jaringan, new blobparams (network.getBatch (), 1,28,28)); network.addlayer (layer1); FullConnectionLayer layer2 = fullConnectionLayer baru (jaringan, new blobparams (network.getBatch (), 784,1,1)); layer2.setActivationFunc (reluactivationfunc ()) baru; network.addlayer (layer2); FullConnectionLayer layer3 = fullConnectionLayer baru (jaringan, blobparams baru (network.getBatch (), 100,1,1)); layer3.setActivationFunc (reluactivationfunc ()); network.addlayer (layer3); FullConnectionLayer layer4 = fullConnectionLayer baru (jaringan, blobparams baru (network.getBatch (), 30,1,1)); layer4.setActivationFunc (baru sigmodactivationFunc ()); network.addlayer (layer4); FullConnectionLayer layer5 = fullConnectionLayer baru (jaringan, blobparams baru (network.getBatch (), 10,1,1)); layer5.setActivationFunc (reluactivationfunc ()); network.addlayer (layer5); Softmaxlayer sflayer = softmaxlayer baru (jaringan, blobparams baru (network.getBatch (), 10,1,1)); network.addlayer (sflayer); }Seperti yang ditunjukkan pada kode di atas, setiap lapisan membutuhkan jaringan, yang merupakan instance dari jaringan. Jaringan adalah administrator global dan operator sumber daya. Dengan referensi jaringan, kami dapat dengan mudah mendapatkan data output, kesalahan output, dll. Dari setiap lapisan. Selain itu, setiap lapisan membutuhkan parameter yang menentukan ukuran blok data output layer saat ini, yang memberi tahu lapisan tertentu berapa banyak data yang Anda butuhkan untuk output. Misalnya, lapisan terakhir dari jaringan saraf adalah softmaxlayer, angka mana yang perlu di -output. Angka ini diwakili oleh vektor panjang 10, seperti angka 7, sehingga softmaxlayer harus menghasilkan nilai elemen ke -8 menjadi 1 dan nilai elemen lain menjadi 0. Lapisan konvolusi dan lapisan pengumpulan membutuhkan lebih banyak parameter karena keduanya memiliki kernel. Untuk lapisan konvolusi, itu disebut kernel konvolusi. Langkah setiap arah lapisan konvolusi adalah 1, yang masih ruang untuk perbaikan. Untuk lapisan pooling, selain melewati parameter inti pooling, Anda juga perlu melewati langkah horizontal dan vertikal, yang diperlukan.
Pelatihan dan pengujian
Setelah membangun jaringan saraf, Anda perlu menghubungi metode network.prepare (), yang akan membuat blok data output dan blok data kesalahan berdasarkan parameter data dari setiap lapisan. Oleh karena itu, panggilan ke metode ini diperlukan.
public void train (daftar <GitImage> imlist, int epoes) {System.out.println ("Begin train"); int batch = network.getBatch (); ganda loclalr = optimizer.getlr (); untuk (int e = 0; e <epoes; e ++) {collections.shuffle (imlist); untuk (int i = 0; i <imglist.size ()-batch; i+= batch) {daftar <lob> inputAndLabel = buildblobbyimagelist (imlist, i, batch, 1,28,28); double lossValue = network.train (inputAndLabel.get (0), inputAndLabel.get (1)); if (i> batch && i/batch%50 == 0) {System.out.print ("Epoe:"+E+"LossValue:"+LossValue+""+"LR:"+Optimizer.getlr ()+""); testinner (inputandlabel.get (0), inputandlabel.get (1)); }} if (locLalr> 0.001) {loclalr*= 0.8; optimizer.setlr (loclalr); }}} tes public void (Daftar <GigImage> imlist) {System.out.println ("Mulai tes"); int batch = network.getBatch (); int correctcount = 0; int i = 0; untuk (i = 0; i <imglist.size ()-batch; i+= batch) {daftar <lob> inputAndLabel = buildblobbyimagelist (imlist, i, batch, 1,28,28); Output blob = network.predict (inputAndLabel.get (0)); int [] caloutlabels = getBatchOutputLabel (output.getData ()); int [] reallabel = getBatchOutputLabel (inputAndLabel.get (1) .getData ()); untuk (int kk = 0; kk <caloutlabels.length; kk ++) {if (caloutlabels [kk] == reallabels [kk]) {correctcount ++; }}} Double Accuracy = correctCount/(1.0*i+batch); System.out.println ("Tes Accuracy adalah"+akurasi+"correctcount"+correctcount); }Seperti disebutkan di atas, Anda dapat berlatih dengan menelepon kereta jaringan, dan Anda dapat menguji dengan memanggil metode prediksi jaringan.
Parameter Simpan dan Muat
public void saveModel (nama string) {network.saveModel (name); } public void loadModel (nama string) {network = new network (); network.loadmodel (name); network.prepare (); }Memanggil SaveModel dan LoadModel jaringan masing -masing dapat menyimpan dan memuat parameter. Anda hanya perlu meneruskan nama file. Ketika kami membuat jaringan saraf melalui parameter yang disimpan, kami harus pertama -tama jaringan baru A, kemudian hubungi model loadmodel dari jaringan ini untuk memuat parameter yang disimpan, dan kemudian jangan lupa untuk memanggil metode persiapan untuk membuat blok data output dan blok data kesalahan untuk setiap lapisan.
Status penyelesaian saat ini dan rencana masa depan
Saat ini, lapisan yang diterapkan meliputi: koneksi penuh, konvolusi, lapisan pengumpulan maksimum, lapisan pengumpulan rata -rata, dan lapisan Softmax. Fungsi aktivasi yang diterapkan adalah: Sigmod, Tanh, Relu.
Fungsi kerugian yang diimplementasikan adalah: entropi silang, log-likelihood. Optimalisasi yang diterapkan adalah: SGD. Parameter sudah dapat menyimpan dan memuat. Selanjutnya, lapisan putus sekolah akan ditambahkan, dan contoh-contoh pada CIFAR-10 akan ditambahkan.
Selain itu, saya akan menulis beberapa artikel untuk meninjau pemikiran dan pertanyaan saya selama proses menulis cupcnn untuk referensi oleh pemula. Tolong ambil jalan memutar. Mereka yang tertarik dapat terus memperhatikan. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.