Jadual Kandungan[Sembunyi][Tunjukkan]
Otak adalah setanding dengan rangkaian saraf. Ini ialah analogi yang biasanya digunakan untuk membantu seseorang yang baru mengenali subjek tersebut memahami idea di sebalik pembelajaran mesin dan rangkaian saraf tiruan.
Oleh kerana terdapat beberapa lapisan pengiraan matematik dan statistik yang berlaku di sebalik tabir, mentakrifkan rangkaian ini sebagai fungsi matematik ialah kaedah yang lebih maju.
Ini adalah untuk mereka yang sebenarnya berminat dengan pembelajaran mesin dan ingin melihat cara kod rangkaian saraf Python ditulis.
Dalam artikel ini, kami akan menunjukkan cara membina rangkaian saraf dalam (DNN) bersambung sepenuhnya dari awal Python 3.
Gambaran Keseluruhan Struktur Fail untuk Kod Rangkaian Neural Python Kami
Terdapat tiga fail yang akan dibuat di sini. Yang pertama ialah fail nn.py yang mudah, yang akan dibincangkan dalam "Menyediakan Fungsi Pembantu" dan "Membina Rangkaian Neural dari Gores."
Kami juga akan mempunyai fail bernama mnist loader.py untuk memuatkan data ujian, seperti yang diterangkan dalam "Memuatkan Data MNIST."
Akhir sekali, kami akan mempunyai fail bernama test.py yang akan dilancarkan di terminal untuk menguji rangkaian saraf kami.
Fail ini diterangkan secara terperinci dalam "Ujian Menjalankan."
Pemasangan
Pustaka NumPy Python mesti dimuat turun untuk mengikuti tutorial ini. Anda boleh mencapai ini dengan menggunakan arahan berikut pada terminal:
Mengimport Modul dan menyediakan fungsi Helper
Hanya dua perpustakaan yang kami perlukan ialah rawak dan NumPy, yang akan kami import serta-merta. Untuk pemberat awal rangkaian saraf kami, kami akan mengocoknya menggunakan perpustakaan rawak.
Untuk mempercepatkan pengiraan kami, kami akan menggunakan NumPy atau np (mengikut konvensyen, ia sering diimport sebagai np). Dua fungsi pembantu kami akan dibuat selepas import kami. Dua fungsi sigmoid: satu dan perdana sigmoid.
Regresi logistik akan mengklasifikasikan data menggunakan fungsi sigmoid, manakala rambatan belakang akan mengira delta atau kecerunan menggunakan fungsi perdana sigmoid.
Mencipta Kelas Rangkaian
Membina rangkaian neural yang dipautkan sepenuhnya merupakan satu-satunya fokus bahagian ini. Kelas rangkaian akan merangkumi semua fungsi yang datang selepas itu. Fungsi Object() { [kod asli] } akan dibuat pada mulanya dalam kelas rangkaian kami.
Satu hujah, saiz, diperlukan oleh fungsi Object() { [kod asli] }. Pembolehubah saiz ialah koleksi nilai berangka yang mewakili bilangan nod input yang terdapat dalam setiap lapisan rangkaian saraf kami.
Kami memulakan empat sifat dalam kaedah __init__ kami. Pembolehubah input, saiz, digunakan untuk menetapkan senarai saiz lapisan dan bilangan lapisan, num lapisan, masing-masing.
Langkah pertama ialah secara rawak menetapkan bias awal rangkaian kami kepada setiap lapisan yang mengikuti lapisan input.
Akhir sekali, setiap pautan antara lapisan input dan output mempunyai pemberatnya yang dijana secara rawak. Np.Random.Randn() memberikan sampel rawak yang diambil daripada taburan normal untuk konteks.
Fungsi Suapan Hadapan
Dalam rangkaian saraf, maklumat dihantar ke hadapan oleh fungsi suapan hadapan. Satu hujah, a, yang menunjukkan vektor pengaktifan semasa, akan diperlukan oleh fungsi ini.
Fungsi ini menganggarkan pengaktifan pada setiap lapisan dengan mengulangi semua berat sebelah dan berat dalam rangkaian. Jawapan yang diberikan ialah ramalan, iaitu pengaktifan lapisan terakhir.
Penurunan Kecerunan kelompok mini
Kuda kerja kelas Rangkaian kami ialah Keturunan Kecerunan. Dalam versi ini, kami menggunakan turunan kecerunan kelompok mini (stokastik), variasi turunan kecerunan yang diubah suai.
Ini menunjukkan bahawa sekumpulan kecil titik data akan digunakan untuk mengemas kini model kami. Empat hujah yang diperlukan dan satu hujah pilihan diserahkan kepada kaedah ini. Empat pembolehubah yang diperlukan ialah set data latihan, bilangan zaman, saiz kumpulan mini, dan kadar pembelajaran (eta).
Data ujian tersedia atas permintaan. Kami akan membekalkan data ujian apabila kami akhirnya menilai rangkaian ini. Bilangan sampel dalam fungsi ini pada mulanya ditetapkan kepada panjang senarai sebaik sahaja data latihan telah diubah menjadi jenis senarai.
Kami juga menggunakan proses yang sama untuk menguji data yang diberikan. Ini kerana bukannya dikembalikan kepada kami sebagai senarai, mereka benar-benar zip senarai. Apabila kami memuatkan sampel data MNIST nanti, kami akan mengetahui lebih lanjut tentang perkara ini.
Jika kami boleh memastikan bahawa kami menyediakan kedua-dua jenis data sebagai senarai, maka penghantaran jenis ini tidak semestinya penting.
Sebaik sahaja kami mempunyai data, kami pergi ke zaman latihan dalam satu gelung. Tempoh latihan hanyalah satu pusingan latihan rangkaian saraf. Kami mula-mula mengocok data dalam setiap zaman untuk memastikan rawak sebelum membuat senarai kumpulan mini.
Fungsi kumpulan mini kemas kini, yang dibincangkan di bawah, akan dipanggil untuk setiap kumpulan mini. Ketepatan ujian juga akan dikembalikan jika data ujian tersedia.
Fungsi pembantu terbitan kos
Mari kita bangunkan fungsi pembantu yang dipanggil derivatif kos terlebih dahulu sebelum kita benar-benar mencipta kod perambatan belakang. Jika kita membuat kesilapan dalam lapisan keluaran kita, fungsi derivatif kos akan menunjukkannya.
Ia memerlukan dua input: tatasusunan pengaktifan output dan koordinat y bagi nilai output yang dijangkakan.
Fungsi perambatan belakang
Vektor pengaktifan kami sekarang, pengaktifan, serta mana-mana vektor pengaktifan lain, pengaktifan dan vektor-z, zs, semuanya mesti diingati. Lapisan yang dipanggil lapisan input diaktifkan terlebih dahulu.
Kami akan mengulangi setiap berat sebelah dan berat selepas meletakkannya. Setiap gelung melibatkan pengiraan vektor z sebagai hasil darab titik bagi pemberat dan pengaktifan, menambahkannya pada senarai zs, mengira semula pengaktifan dan menambah pengaktifan yang dikemas kini pada senarai pengaktifan.
Akhirnya, matematik. Delta, yang sama dengan ralat dari lapisan sebelumnya didarab dengan perdana sigmoid bagi elemen terakhir vektor zs, dikira sebelum kita memulakan hantaran ke belakang kita.
Lapisan terakhir nabla b ditetapkan sebagai delta dan lapisan akhir nabla w ditetapkan sebagai hasil darab titik delta dan lapisan pengaktifan kedua hingga terakhir (ditransmisikan supaya kita benar-benar boleh melakukan pengiraan) .
Kami meneruskan seperti sebelumnya, bermula dengan lapisan kedua dan berakhir dengan yang terakhir, dan ulangi proses selepas melengkapkan lapisan terakhir ini. Nablas kemudiannya diberikan semula sebagai tupel.
Mengemas kini turunan kecerunan kelompok mini
Kaedah SGD (keturunan kecerunan stokastik) kami dari sebelum ini menggabungkan pengemaskinian kumpulan mini. Oleh kerana ia digunakan dalam SGD tetapi juga memerlukan backprop, saya berdebat di mana untuk meletakkan fungsi ini.
Akhirnya, saya membuat pilihan untuk menyiarkannya di sini. Ia bermula dengan menjana 0 vektor bagi nabla bias dan pemberat, sama seperti fungsi backprop kami.
Ia memerlukan kumpulan mini dan kadar pembelajaran eta sebagai dua inputnya. Dalam kumpulan mini, kami kemudian menggunakan fungsi backprop untuk mendapatkan delta setiap tatasusunan nabla untuk setiap input, x dan output, y. Senarai nabla kemudiannya dikemas kini dengan delta ini.
Akhir sekali, kami menggunakan kadar pembelajaran dan nablas untuk mengemas kini berat dan berat sebelah rangkaian. Setiap nilai dikemas kini kepada nilai terbaharu, ditolak kadar pembelajaran, didarab dengan saiz kumpulan mini, dan kemudian ditambahkan pada nilai nabla.
Menilai fungsi
Fungsi menilai adalah yang terakhir yang perlu kita tulis. Data ujian adalah satu-satunya input untuk fungsi ini. Dalam fungsi ini, kami hanya membandingkan output rangkaian dengan hasil yang dijangkakan, y. Dengan memberi masukan, x, ke hadapan, output rangkaian ditentukan.
Kod Lengkap
Apabila kita menggabungkan semua kod, ini adalah bagaimana ia muncul.
Menguji Rangkaian Neural
Memuatkan data MNIST
. data MNIST adalah dalam format .pkl.gz, yang akan kami buka menggunakan GZIP dan memuatkan dengan jeruk. Mari tulis kaedah pantas untuk memuatkan data ini sebagai satu tuple saiz tiga, dibahagikan kepada latihan, pengesahan dan data ujian.
Untuk menjadikan data kami lebih mudah diurus, kami akan menulis fungsi lain untuk mengekod y ke dalam tatasusunan 10 item. Tatasusunan adalah semua 0s kecuali 1 yang sepadan dengan digit yang betul imej.
Kami akan menggunakan data beban asas dan satu kaedah pengekodan panas untuk memuatkan data kami ke dalam format yang boleh dibaca. Satu lagi fungsi akan ditulis yang akan menukar nilai x kami kepada senarai saiz 784, sepadan dengan 784 piksel imej dan nilai y kami ke dalam bentuk vektor dikod panas tunggal mereka.
Kemudian kami akan menggabungkan nilai x dan y supaya satu indeks sepadan dengan yang lain. Ini terpakai pada set data latihan, pengesahan dan ujian. Kami kemudian mengembalikan data yang diubah.
Menjalankan Ujian
Kami akan membuat fail baharu yang dipanggil "mnist loader" yang akan mengimport kedua-dua rangkaian saraf yang kami sediakan sebelum ini (simple nn) dan MNIST set data loader sebelum kami mula menguji.
Dalam fail ini, semua yang perlu kita lakukan ialah mengimport data, membina rangkaian dengan saiz lapisan input 784 dan saiz lapisan output 10, jalankan fungsi SGD rangkaian pada data latihan, kemudian uji menggunakan data ujian.
Perlu diingat bahawa untuk senarai lapisan input kami, tiada bezanya mana-mana nombor antara 784 dan 10. Kita boleh menukar lapisan lain mengikut cara yang kita suka; hanya saiz input dan output ditetapkan.
Tiga lapisan tidak diperlukan; kita mungkin menggunakan empat, lima, atau bahkan hanya dua. Selamat bereksperimen dengannya.
Kesimpulan
Di sini, menggunakan Python 3, kami mencipta rangkaian saraf dari awal. Bersama dengan matematik peringkat tinggi, kami juga membincangkan spesifik pelaksanaan.
Kami bermula dengan melaksanakan fungsi pembantu. Untuk neuron berfungsi, fungsi utama sigmoid dan sigmoid adalah penting. Kami kemudiannya mempraktikkan fungsi suapan hadapan, yang merupakan proses asas untuk menyuap data ke dalam rangkaian saraf.
Seterusnya, kami mencipta fungsi keturunan kecerunan dalam Python, enjin yang memacu rangkaian saraf kami. Untuk mencari "minima tempatan" dan mengoptimumkan berat dan berat sebelahnya, rangkaian saraf kami menggunakan keturunan kecerunan. Kami mencipta fungsi perambatan belakang menggunakan keturunan kecerunan.
Dengan menyampaikan kemas kini apabila output tidak sepadan dengan label yang betul, fungsi ini membolehkan rangkaian saraf untuk "belajar."
Akhirnya, kami meletakkan Python baharu kami rangkaian neural untuk ujian menggunakan set data MNIST. Semuanya berfungsi dengan lancar.
Selamat Pengkodan!
Sila tinggalkan balasan anda