Daftar Isi[Bersembunyi][Menunjukkan]
Otak sebanding dengan jaringan saraf. Ini adalah analogi yang biasanya digunakan untuk membantu seseorang yang baru mengenal subjek untuk memahami ide di balik pembelajaran mesin dan jaringan saraf tiruan.
Karena ada beberapa lapisan perhitungan matematika dan statistik yang terjadi di belakang layar, mendefinisikan jaringan ini sebagai fungsi matematika adalah metode yang lebih maju.
Ini untuk orang-orang yang benar-benar tertarik dengan pembelajaran mesin dan ingin melihat bagaimana kode jaringan saraf Python ditulis.
Dalam artikel ini, kami akan mendemonstrasikan cara membangun jaringan saraf dalam (DNN) yang terhubung penuh dari awal Ular sanca 3.
Gambaran Umum Struktur File untuk Kode Jaringan Neural Python Kami
Akan ada tiga file yang dibuat di sini. Yang pertama adalah file nn.py sederhana, yang akan dibahas di “Menyiapkan Fungsi Helper” dan “Membangun Neural Network dari Awal.”
Kami juga akan memiliki file bernama mnist loader.py untuk memuat data pengujian, seperti yang dijelaskan dalam “Memuat Data MNIST.”
Terakhir, kita akan memiliki file bernama test.py yang akan diluncurkan di terminal untuk menguji jaringan saraf kita.
File ini dijelaskan secara rinci di “Menjalankan Tes.”
Instalasi
Pustaka NumPy Python harus diunduh untuk mengikuti tutorial ini. Anda dapat melakukannya dengan menggunakan perintah berikut di terminal:
Mengimpor Modul dan mengatur fungsi Helper
Hanya dua perpustakaan yang kami butuhkan adalah acak dan NumPy, yang akan kami impor segera. Untuk bobot awal jaringan saraf kita, kita akan mengacaknya menggunakan perpustakaan acak.
Untuk mempercepat perhitungan kita, kita akan menggunakan NumPy atau np (berdasarkan konvensi, sering diimpor sebagai np). Dua fungsi pembantu kami akan dibuat setelah impor kami. Dua fungsi sigmoid: satu dan sigmoid prima.
Regresi logistik akan mengklasifikasikan data menggunakan fungsi sigmoid, sedangkan backpropagation akan menghitung delta atau gradien menggunakan fungsi prima sigmoid.
Membuat Kelas Jaringan
Membangun jaringan saraf yang sepenuhnya terhubung adalah satu-satunya fokus dari bagian ini. Kelas jaringan akan mencakup semua fungsi yang muncul setelahnya. Fungsi Object() { [native code] } akan dibuat awalnya di kelas jaringan kita.
Satu argumen, ukuran, diperlukan oleh fungsi Object() { [native code] }. Variabel ukuran adalah kumpulan nilai numerik yang mewakili jumlah node input yang ada di setiap lapisan jaringan saraf kita.
Kami menginisialisasi empat properti dalam metode __init__ kami. Variabel input, ukuran, digunakan untuk mengatur daftar ukuran lapisan dan jumlah lapisan, jumlah lapisan, masing-masing.
Langkah pertama adalah secara acak menetapkan bias awal jaringan kami untuk setiap lapisan yang mengikuti lapisan input.
Akhirnya, setiap link antara lapisan input dan output memiliki bobot yang dihasilkan secara acak. Np.Random.Randn() memberikan sampel acak yang diambil dari distribusi normal untuk konteks.
Fungsi Umpan Maju
Dalam jaringan saraf, informasi dikirim ke depan oleh fungsi umpan maju. Satu argumen, a, menunjukkan vektor aktivasi saat ini, akan dibutuhkan oleh fungsi ini.
Fungsi ini memperkirakan aktivasi pada setiap lapisan dengan mengulangi semua bias dan bobot dalam jaringan. Jawaban yang diberikan adalah prediksi, yang merupakan aktivasi dari lapisan terakhir.
Keturunan Gradien Batch Mini
Pekerja keras kelas Jaringan kami adalah Gradient Descent. Dalam versi ini, kami menggunakan penurunan gradien mini-batch (stokastik), variasi penurunan gradien yang dimodifikasi.
Ini menunjukkan bahwa sejumlah kecil titik data akan digunakan untuk memperbarui model kami. Empat argumen wajib dan satu argumen opsional diteruskan ke metode ini. Empat variabel yang diperlukan adalah kumpulan data pelatihan, jumlah epoch, ukuran mini-batch, dan learning rate (eta).
Data uji tersedia berdasarkan permintaan. Kami akan menyediakan data uji ketika kami akhirnya mengevaluasi jaringan ini. Jumlah sampel dalam fungsi ini awalnya diatur ke panjang daftar setelah data pelatihan diubah menjadi tipe daftar.
Kami juga menerapkan proses yang sama untuk menguji data yang diberikan. Ini karena alih-alih dikembalikan kepada kami sebagai daftar, mereka benar-benar zip daftar. Saat kita memuat sampel data MNIST nanti, kita akan mempelajari lebih lanjut tentang ini.
Jika kami dapat memastikan bahwa kami menyediakan kedua jenis data sebagai daftar, maka jenis-casting ini tidak selalu penting.
Setelah kami memiliki data, kami melewati periode pelatihan dalam satu lingkaran. Periode pelatihan hanya satu putaran pelatihan jaringan saraf. Kami pertama-tama mengacak data di setiap zaman untuk memastikan keacakan sebelum membuat daftar batch mini.
Fungsi batch mini pembaruan, yang dibahas di bawah, akan dipanggil untuk setiap mini-batch. Akurasi pengujian juga akan dikembalikan jika data pengujian tersedia.
Fungsi pembantu turunan biaya
Mari kita kembangkan fungsi pembantu yang disebut turunan biaya terlebih dahulu sebelum kita benar-benar membuat kode backpropagation. Jika kita membuat kesalahan pada lapisan keluaran kita, fungsi turunan biaya akan menunjukkannya.
Ini membutuhkan dua input: array aktivasi output dan koordinat y dari nilai output yang diantisipasi.
Fungsi propagasi balik
Vektor aktivasi kami saat ini, aktivasi, serta vektor aktivasi lainnya, aktivasi, dan vektor z, zs, semuanya harus diingat. Lapisan yang disebut lapisan input diaktifkan terlebih dahulu.
Kami akan mengulang setiap bias dan bobot setelah memasangnya. Setiap loop melibatkan penghitungan vektor z sebagai produk titik dari bobot dan aktivasi, menambahkannya ke daftar zs, menghitung ulang aktivasi, dan menambahkan aktivasi yang diperbarui ke daftar aktivasi.
Akhirnya, matematika. Delta, yang sama dengan kesalahan dari lapisan sebelumnya dikalikan dengan bilangan prima sigmoid dari elemen terakhir dari vektor zs, dihitung sebelum kita memulai lintasan mundur kita.
Lapisan terakhir nabla b diatur menjadi delta, dan lapisan terakhir nabla w diatur menjadi produk titik delta dan lapisan aktivasi kedua hingga terakhir (ditransposisikan sehingga kita benar-benar dapat menghitungnya) .
Kami melanjutkan seperti sebelumnya, dimulai dengan lapisan kedua dan diakhiri dengan yang terakhir, dan ulangi prosesnya setelah menyelesaikan lapisan terakhir ini. Nablas kemudian diberikan kembali sebagai tupel.
Memperbarui penurunan gradien Mini-batch
Metode SGD (penurunan gradien stokastik) kami dari sebelumnya menggabungkan pembaruan mini-batch. Karena digunakan dalam SGD tetapi juga membutuhkan backprop, saya memperdebatkan di mana harus meletakkan fungsi ini.
Akhirnya, saya memutuskan untuk mempostingnya di sini. Ini dimulai dengan menghasilkan 0 vektor nablas bias dan bobot, seperti yang dilakukan fungsi backprop kami.
Ini membutuhkan mini-batch dan tingkat pembelajaran eta sebagai dua inputnya. Dalam mini-batch, kami kemudian menggunakan fungsi backprop untuk mendapatkan delta setiap array nabla untuk setiap input, x, dan output, y. Daftar nabla kemudian diperbarui dengan delta ini.
Terakhir, kami menggunakan tingkat pembelajaran dan nablas untuk memperbarui bobot dan bias jaringan. Setiap nilai diperbarui ke nilai terbaru, dikurangi kecepatan pembelajaran, dikalikan dengan ukuran minibatch, dan kemudian ditambahkan ke nilai nabla.
Evaluasi fungsi
Fungsi evaluasi adalah fungsi terakhir yang perlu kita tulis. Data uji adalah satu-satunya masukan untuk fungsi ini. Dalam fungsi ini, kami hanya membandingkan keluaran jaringan dengan hasil yang diantisipasi, y. Dengan memberi makan input, x, maju, output jaringan ditentukan.
Kode Lengkap
Ketika kita menggabungkan semua kode, ini adalah tampilannya.
Menguji Jaringan Saraf
Memuat data MNIST
Grafik data MNIST dalam format .pkl.gz, yang akan kita buka menggunakan GZIP dan memuat dengan acar. Mari kita tulis metode cepat untuk memuat data ini sebagai tupel berukuran tiga, dibagi menjadi data pelatihan, validasi, dan pengujian.
Untuk membuat data kita lebih mudah dikelola, kita akan menulis fungsi lain untuk mengkodekan y ke dalam array 10-item. Array akan menjadi semua 0 kecuali untuk 1 yang cocok dengan digit gambar yang tepat.
Kami akan menggunakan data beban dasar dan satu metode enkode panas untuk memuat data kami ke dalam format yang dapat dibaca. Fungsi lain akan ditulis yang akan mengubah nilai x kita menjadi daftar ukuran 784, cocok dengan 784 piksel gambar, dan nilai y kita menjadi bentuk vektor tunggal yang dikodekan panas.
Kemudian kita akan menggabungkan nilai x dan y sehingga satu indeks cocok dengan indeks lainnya. Ini berlaku untuk set data pelatihan, validasi, dan pengujian. Kami kemudian mengembalikan data yang diubah.
Menjalankan Tes
Kami akan membuat file baru bernama "mnist loader" yang akan mengimpor jaringan saraf yang kami buat sebelumnya (simple nn) dan pemuat data MNIST sebelum kami memulai pengujian.
Dalam file ini, yang perlu kita lakukan hanyalah mengimpor data, membangun jaringan dengan ukuran lapisan input 784 dan ukuran lapisan output 10, menjalankan fungsi SGD jaringan pada data pelatihan, kemudian mengujinya menggunakan data uji.
Ingatlah bahwa untuk daftar lapisan input kita, tidak ada bedanya berapa pun angka antara 784 dan 10. Kita dapat mengubah lapisan lain sesuka kita; hanya ukuran input dan output yang tetap.
Tiga lapisan tidak diperlukan; kita mungkin menggunakan empat, lima, atau bahkan hanya dua. Bersenang-senang bereksperimen dengannya.
Kesimpulan
Di sini, menggunakan Python 3, kami membuat jaringan saraf dari awal. Seiring dengan matematika tingkat tinggi, kami juga membahas spesifik implementasi.
Kami mulai dengan mengimplementasikan fungsi pembantu. Agar neuron dapat bekerja, fungsi prima sigmoid dan sigmoid sangat penting. Kami kemudian mempraktikkan fungsi feedforward, yang merupakan proses mendasar untuk memasukkan data ke dalam jaringan saraf.
Selanjutnya, kami membuat fungsi penurunan gradien dengan Python, mesin yang menggerakkan jaringan saraf kami. Untuk menemukan "minima lokal" dan mengoptimalkan bobot dan biasnya, jaringan saraf kami menggunakan penurunan gradien. Kami membuat fungsi backpropagation menggunakan keturunan gradien.
Dengan memberikan pembaruan ketika output tidak cocok dengan label yang tepat, fungsi ini memungkinkan jaringan saraf untuk "belajar."
Akhirnya, kami menempatkan Python baru kami saraf jaringan untuk pengujian menggunakan kumpulan data MNIST. Semuanya berfungsi dengan lancar.
Selamat Coding!
Tinggalkan Balasan