["Neural Networks Chapter 4 Tidak seperti konvolusi, misalnya, itu akan memiliki representasi 2D. Kita akan menggunakan aktivasi impor, yang memungkinkan kita untuk memberikan fuction aktivasi setiap lapisan neuron, dan kita juga akan mengimpor to_cattegorical, yang memungkinkan kita untuk mengubah nama kelas menjadi hal-hal seperti rock, disko, dan sebagainya, yang adalah apa yang disebut pengkodean satu-panas. Kita telah secara resmi mengembangkan fuction pembantu untuk menampilkan nilai MFCC: Pertama, kita akan memuat musik dan kemudian mengekstrak nilai MFCC darinya. Kemudian, kita akan menggunakan specshow, yang merupakan pertunjukan spektogram dari Library librosa. Berikut kick drumnya: [ 96 ]","Neural Networks Chapter 4 Kita dapat melihat bahwa pada frekuensi rendah, bassnya sangat jelas. Tidak banyak frekuensi lain yang terwakili. Namun, jika kita melihat siulan, cukup jelas bahwa ada frekuensi yang lebih tinggi yang diwakili: Semakin gelap warnanya, atau semakin mendekati merah, semakin besar daya dalam rentang frekuensi tersebut pada saat itu. Jadi, Anda bahkan dapat melihat [ 97 ]","Neural Networks Chapter 4 jenis perubahan frekuensi dengan peluit. Nah, berikut frekuensi musik-musik disko: Ini adalah keluaran frekuensi: Anda dapat melihat ketukan di keluaran sebelumnya, tetapi durasinya hanya 30 detik, jadi agak sulit untuk melihat ketukan individu. Bandingkan dengan musik klasik di mana tidak ada banyak ketukan seperti jenis bass yang berkelanjutan seperti yang berasal dari cello, misalnya: [ 98 ]","Neural Networks Chapter 4 Berikut adalah frekuensi untuk musik hip-hop: [ 99 ]","Neural Networks Chapter 4 Kelihatannya agak mirip dengan disko, tetapi jika diperlukan agar kita bisa membedakannya dengan mata kepala sendiri, kita tidak akan benar-benar membutuhkan jaringan saraf karena itu mungkin masalah yang relatif sederhana. Jadi, fakta bahwa kita tidak bisa membedakan antara ini bukanlah masalah kita, ini masalah jaringan saraf. Kita memiliki fuction tambahan lain di sini yang sekali lagi hanya memuat nilai MFCC, tetapi kali ini kita mempersiapkannya untuk jaringan saraf: Kita telah memuat nilai MFCC untuk musik tersebut, tetapi karena nilai ini mungkin antara negatif 250 hingga positif 150, nilai tersebut tidak baik untuk jaringan saraf. Kita tidak ingin memasukkan nilai-nilai besar dan kecil ini. Kita ingin memasukkan nilai mendekati negatif 1 dan positif 1 atau dari 0 ke 1. Oleh [ 100 ]","Neural Networks Chapter 4 karena itu, kita akan mencari tahu berapa nilai maks, nilai absolut untuk setiap musik, dan kemudian membagi semua nilai dengan nilai maks. Selain itu, panjang musiknya sedikit berbeda, jadi kita ingin memilih hanya 25.000 nilai MFCC. Kita harus sangat yakin bahwa apa yang kita masukkan ke dalam jaringan saraf selalu berukuran sama, karena hanya ada begitu banyak neuron masukan dan kita tidak dapat mengubahnya setelah kita membangun jaringan. Selanjutnya, kita memiliki fuction yang disebut generate _features_and_labels, yang akan melewati semua genre yang berbeda dan menelusuri semua musik dalam dataset dan menghasilkan nilai MFCC dan nama kelas tersebut: Seperti yang ditunjukkan pada tangkapan layar sebelumnya, kita akan menyiapkan daftar untuk semua fitur dan semua label. Pergi melalui masing- masing dari 10 genre. Untuk setiap genre, kita akan melihat file di folder itu. Folder generes\/'+genre+'\/*.au' menunjukkan bagaimana dataset diatur. Saat kita memproses folder itu, masing-masing akan ada 100 musik untuk setiap file, kita akan mengekstrak fitur-fiturnya dan memasukkan fitur-fitur itu ke dalam daftar all_features.append(features). Nama genre untuk musik itu juga perlu dimasukkan ke dalam daftar. Jadi, pada akhirnya, semua fitur akan memiliki 1.000 entri dan semua label akan memiliki 1.000 entri. Dalam hal semua fitur, masing-masing dari 1.000 entri tersebut akan memiliki 25.000 entri. Itu akan menjadi matriks 1.000 x 25.000. [ 101 ]","Neural Networks Chapter 4 Untuk semua label saat ini, ada 1.000 entri daftar panjang, dan di dalamnya ada kata-kata seperti blues, classical, country, disco,hiphop,jazz,metal, pop, reggae, dan rock. Sekarang, ini akan menjadi masalah karena jaringan saraf tidak akan memprediksi kata atau bahkan huruf. Kita perlu memberikan pengkodean satu- panas, yang berarti bahwa setiap kata di sini akan direpresentasikan sebagai sepuluh angka biner. Dalam kasus blues, itu akan menjadi satu dan kemudian sembilan nol. Dalam kasus klasik, itu akan menjadi nol diikuti oleh satu, diikuti dengan sembilan nol, dan seterusnya. Pertama, kita harus mencari tahu semua nama unik dengan menggunakan perintah np.unique(all_labels, return_inverse=True) untuk mendapatkannya kembali sebagai bilangan bulat. Kemudian, kita harus menggunakan to_categorical, yang mengubah bilangan bulat tersebut menjadi penyandian satu-panas. Jadi, yang kembali adalah 1000 x 10 dimensi. 1.000 karena ada 1.000 musik, dan masing-masing memiliki sepuluh angka biner untuk mewakili pengkodean satu-panas. Kemudian, kembalikan semua fitur yang ditumpuk bersama dengan perintah return np.stack(all_features), onehot_labels ke dalam satu matriks, serta one-hot matrics. Jadi, kita akan memanggil fuction tersebut dan menyimpan fitur dan labelnya: Untuk memastikannya, kita akan mencetak bentuk fitur dan label seperti yang ditunjukkan pada tangkapan layar berikut. Jadi, ini adalah 1.000 kali 25.000 [ 102 ]","Neural Networks Chapter 4 untuk fitur dan 1.000 kali 10 untuk label. Sekarang, kita akan membagi dataset menjadi train dan test split. Mari kita putuskan tanda 80% yang didefinisikan sebagai training_split=0 untuk melakukan split: Sebelum itu, kita akan shuffle, dan sebelum kita shuffle, kita perlu meletakkan label dengan fitur agar tidak shuffle dalam urutan yang berbeda. Kita akan memanggil np.random.shuffle(alldata) dan lakukan shuffle, split menggunakan splitidx=int(len(alldata)*(training_split), dan kemudian kita akan memiliki train dan testset, seperti yang ditunjukkan pada snapshot sebelumnya. Melihat bentuk kereta dan testsetnya, kereta itu 800, jadi 80% dari 1.000 baris: kita memiliki 25.010 fitur. Itu tidak benar-benar semua fitur. Ini sebenarnya adalah 25.000 fitur ditambah 10 untuk enkode satu-panas karena, ingat, kita menumpuknya bersama sebelum kita mengacaknya. Oleh karena itu, kita [ 103 ]","Neural Networks Chapter 4 harus menanggalkan itu kembali. Kita bisa melakukannya dengan train_input = train[: ,: -10]. Untuk input train dan input pengujian, kita mengambil semuanya kecuali 10 kolom terakhir, dan untuk label, kita mengambil 10 kolom hingga akhir, dan kemudian kita dapat melihat apa bentuk input train dan label kereta. Jadi sekarang, kita memiliki 800 kali 25.000 dan 800 kali 10. Selanjutnya, kita akan membangun jaringan saraf: Kita akan memiliki jaringan saraf sekuensial. Lapisan pertama akan menjadi lapisan padat 100 neuron. Sekarang, hanya pada lapisan pertama, penting bagi Anda untuk memberikan dimensi input atau bentuk input, dan itu akan menjadi 25.000 dalam kasus kita. Ini mengatakan berapa banyak nilai input yang datang per contoh. 25.000 itu akan terhubung ke 100 di lapisan pertama. Lapisan pertama akan melakukan penjumlahan tertimbang dari inputnya, bobotnya, dan suku biasnya, dan kemudian kita akan menjalankan fuction aktivasi relu. relu, jika Anda ingat, menyatakan bahwa apa pun yang kurang dari 0 akan menjadi 0. Apa pun yang lebih tinggi dari 0 hanya akan menjadi nilai itu sendiri. 100 ini kemudian akan terhubung ke 10 lagi dan itu akan menjadi lapisan keluaran. Ini [ 104 ]","Neural Networks Chapter 4 akan menjadi 10 karena kita telah melakukan pengkodean seseorang-panas dan kita memiliki 10 angka biner dalam penyandian itu. Aktivasi yang digunakan dalam kode, softmax, mengatakan untuk mengambil output dari 10 dan menormalkannya sehingga jumlahnya menjadi 1. Dengan begitu, mereka akhirnya menjadi probabilitas dan mana dari 10 yang memiliki skor tertinggi, probabilitas tertinggi , kita menganggap itu sebagai prediksi dan itu akan langsung sesuai dengan posisi mana pun yang memiliki angka tertinggi. Misalnya, jika berada di posisi 4, itu akan menjadi disko (lihat di kode). Selanjutnya, kita akan mengkompilasi model, memilih pengoptimal seperti Adam, dan mendefinisikan fuction loss. Setiap kali Anda memiliki beberapa keluaran seperti yang kita miliki di sini (kita memiliki 10), Anda mungkin ingin melakukan entropi silang kategoris dan akurasi metrik untuk melihat akurasi saat pelatihan dan selama evaluasi, selain kerugian, yang selalu ditampilkan: namun, akurasi lebih masuk akal bagi kita . Selanjutnya, kita dapat mencetak model.summary, yang memberi tahu kita detail tentang lapisan. Ini akan terlihat seperti berikut: Bentuk output dari 100 lapisan neuron pertama pasti 100 nilai karena ada 100 neuron, dan output dari lapisan kedua padat adalah 10 karena ada 10 neuron. [ 105 ]","Neural Networks Chapter 4 Jadi, mengapa ada 2,5 juta parameter, atau bobot, di lapisan pertama? Itu karena kita memiliki 25.000 masukan. Nah, kita memiliki 25.000 input dan masing- masing dari input tersebut menuju ke masing-masing dari 100 neuron padat. Jadi itu 2,5 juta, lalu ditambah 100, karena masing-masing neuron di 100 itu memiliki suku biasnya sendiri, bobot biasnya sendiri, dan itu perlu dipelajari juga. Secara keseluruhan, kita memiliki sekitar 2,5 juta parameter atau bobot. Selanjutnya, kita menjalankan fit. Dibutuhkan input pelatihan dan label pelatihan, dan mengambil jumlah epoch yang kita inginkan. Kita ingin 10, jadi itu 10 pengulangan dari input yang dilatih; dibutuhkan ukuran batch yang mengatakan berapa banyak, dalam kasus kita , musik yang harus dilalui sebelum memperbarui bobot; dan validation_split dari 0,2. Itu tidak pernah benar-benar melatih pada pemisahan validasi, tetapi pemisahan validasi memungkinkan kita melihat kemajuan saat berjalan. Akhirnya, karena kita memisahkan pelatihan dan pengujian sebelumnya, kita akan melakukan evaluasi pada pengujian, data pengujian, dan mencetak kehilangan dan keakuratannya. Ini dia hasil pelatihannya: [ 106 ]","Neural Networks Chapter 4 Itu sedang mencetak ini saat berjalan. Itu selalu mencetak kerugian dan akurasi. Ini ada di set pelatihan itu sendiri, bukan set validasi, jadi ini seharusnya mendekati 1.0. Anda sebenarnya mungkin tidak ingin mendekati 1.0 karena itu bisa mewakili overfitting, tetapi jika Anda membiarkannya cukup lama, sering kali mencapai akurasi 1.0 pada set pelatihan karena menghafal set pelatihan. Yang sangat kita pedulikan adalah akurasi validasi karena memungkinkan kita menggunakan set pengujian. Ini adalah data yang belum pernah dilihat sebelumnya, setidaknya tidak untuk pelatihan, dan memang relatif mendekati akurasi validasi, yang merupakan akurasi akhir kita . Akurasi terakhir ini ada pada data uji yang kita pisahkan sebelumnya. Sekarang kita mendapatkan akurasi sekitar 53%. Itu tampaknya relatif rendah sampai kita menyadari bahwa ada 10 genre yang berbeda. Menebak secara acak akan memberi kita akurasi 10%, jadi ini jauh lebih baik daripada menebak secara acak. Memperbaiki deteksi spam menggunakan jaringan saraf Di bagian ini, kita akan memperbarui pendeteksi spam dari sebelumnya untuk menggunakan jaringan saraf. Ingatlah bahwa kumpulan data yang digunakan berasal dari YouTube. Ada sekitar 2.000 komentar dengan sekitar setengahnya adalah spam dan setengahnya lagi bukan. Komentar ini berasal dari lima video berbeda. Dalam versi terakhir, kita menggunakan sekantong kata dan hutan acak. Kita melakukan pencarian parameter untuk menemukan parameter yang paling cocok untuk kumpulan kata, yaitu CountVectorizer yang memiliki 1.000 kata berbeda di dalamnya. 1000 kata ini adalah kata-kata yang paling banyak digunakan. Kita menggunakan unigram, bukan bigram atau trigram. Akan lebih baik untuk menghilangkan kata umum dan kata berhenti dari bahasa Inggris. Cara terbaik adalah menggunakan TF-IDF. Ditemukan juga bahwa menggunakan 100 pohon yang berbeda akan menjadi yang terbaik untuk hutan acak. Sekarang, kita akan menggunakan sekantong kata-kata tetapi kita akan [ 107 ]","Neural Networks Chapter 4 menggunakan shallow neural network alih-alih hutan acak. Juga ingat bahwa kita mendapat akurasi 95 atau 96 persen untuk versi sebelumnya. Mari kita lihat kodenya: Kita mulai dengan mengimpor. Kita akan menggunakan pandas sekali lagi untuk memuat dataset. Kali ini, kita akan menggunakan Keras Tokenizer. Tidak ada alasan khusus untuk menggunakan Tokenizer, kecuali untuk menunjukkan teknik alternatif. Kita akan mengimpor NumPy dan kemudian melanjutkan untuk mengimpor model sekuensial untuk jaringan saraf, yang merupakan jaringan feed-forward yang khas. Kita kemudian memiliki lapisan padat yang merupakan lapisan neuron yang khas. Kita juga akan menambahkan fitur dropout, yang membantu mencegah over-fitting, dan kita akan memutuskan aktivasi untuk setiap layer. Kita akan menggunakan metode to_categoricaldari Library np_utils dari Keras untuk menghasilkan one-hot encoding, dan kita akan memperkenalkan StratifiedFold untuk melakukan validasi silang kita. Pertama, kita memuat kumpulan data: Ada lima file CSV yang berbeda. Kita akan menumpuknya di atas satu sama lain sehingga kita memiliki satu kumpulan data besar. Kita kemudian mengacaknya [ 108 ]","Neural Networks Chapter 4 dengan menjalankan sampel yang mengambil baris acak. Kita akan mengatakan bahwa kita ingin menyimpan 100% data sehingga secara efektif mengocok semua data. Sekarang, teknik StratifiedFold mengambil sejumlah pemisahan, katakanlah lima, dan menghasilkan indeks dari kumpulan data asli untuk pemisahan tersebut: Kita akan mendapatkan pembagian 80%\/20% untuk pelatihan dan pengujian. Pengujian 20% ini akan berbeda dengan setiap pemisahan. Ini adalah iterator, oleh karena itu, kita dapat menggunakan loop GPS untuk melihat semua pemisahan yang berbeda. Kita akan mencetak posisi pengujian untuk melihat bahwa posisi tersebut tidak tumpang tindih untuk setiap pemisahan: Berikut pembagian pertama: [ 109 ]","Neural Networks Chapter 4 Berikut pembagian kedua: Berikut pembagian ketiga: [ 110 ]","Neural Networks Chapter 4 Berikut pembagian keempat: Berikut pembagian kelima: [ 111 ]","Neural Networks Chapter 4 Sekarang jelas bahwa iu tidak tumpang tindih. Kita kemudian mendefinisikan fuction yang menerima indeks ini untuk pemisahan yang berbeda dan melakukan sekantong kata, membangun jaringan saraf, melatihnya, dan mengevaluasinya. Kita kemudian mengembalikan skor untuk split itu. Kita mulai dengan mengambil posisi untuk set kereta dan tes dan mengekstrak komentar: [ 112 ]","Neural Networks Chapter 4 Kita kemudian melanjutkan untuk membangun Tokenizer kita . Pada titik ini, kita dapat menyebutkan jumlah kata yang kita ingin dukung di Tokenizer. Sebuah penelitian umum membawa kita pada kesimpulan bahwa menggunakan 2.000 kata lebih baik daripada 1000 kata. Untuk hutan acak, menggunakan 1.000 kata lebih baik dan didukung dengan melakukan GridSearch untuk semua parameter yang berbeda. Tidak ada alasan khusus untuk percaya bahwa karena kumpulan kata bekerja paling baik dengan 1.000 kata dibandingkan dengan hutan acak, itulah yang terbaik untuk jaringan saraf juga. Jadi, kita akan menggunakan 2.000 kata dalam kasus ini. Ini hanya konstruktor. Belum ada yang benar-benar terjadi dengan kantong kata-kata. Hal berikutnya yang perlu kita lakukan adalah mempelajari kata-kata itu dan yang akan terjadi dengan menggunakan metode fit_on_texts Sekarang, fit_on_texts seharusnya hanya digunakan pada set pelatihan. Kita hanya ingin mempelajari kata-kata di set pelatihan. Ini membantu kita mensimulasikan dunia nyata di mana Anda hanya melatih model Anda pada [ 113 ]","Neural Networks Chapter 4 kumpulan data tertentu dan kemudian dunia nyata menyajikan sesuatu yang mungkin baru yang belum pernah Anda lihat sebelumnya. Untuk melakukan ini, kita memiliki pemisahan pengujian pelatihan. Kita hanya ingin mempelajari kata-kata di set pelatihan. Jika ada kata-kata di set pengujian yang belum pernah kita lihat sebelumnya di set pelatihan, mereka akan diabaikan. Ini bagus karena begitulah cara kerjanya di dunia nyata. Kita akan mempelajari kata-kata di set pelatihan tetapi kemudian mengubah pelatihan dan komentar pengujian menjadi model bag of words. Texts_to_matrix digunakan untuk hal yang sama. Ini menghasilkan matriks yang dapat dimasukkan langsung ke jaringan saraf. Kita memberikan train_content, yang merupakan komentar, dan test_content Kemudian, kita dapat memutuskan apakah kita menginginkan skor tfidf, skor biner, atau hitungan frekuensi. Kita akan menggunakan tfidf dalam kasus ini. tfidf adalah angka antara 0 dan bilangan bulat acak apa pun, mungkin angka besar, dan dalam kebanyakan kasus, bukanlah ide yang baik untuk memberikan neuron dalam jaringan saraf angka yang sangat besar atau angka yang sangat kecil, yang berarti angka negatif. Di sini, kita ingin membuat skala angka-angka ini antara mungkin 0 dan 1, dan -1 dan 1. Untuk skala antara 0 dan 1, kita dapat membagi dengan maks. Jadi, kita harus melihat semua contoh pelatihan, semua nomor pelatihan untuk TF-IDF, dan membagi setiap nomor dengan jumlah maksimum di antara mereka. Kita harus melakukan hal yang sama untuk ujian. Sekarang, input kereta dan input tes adalah skor tfidf yang telah diskalakan ulang menjadi 0 hingga 1. Kita juga menggesernya antara -1 dan 1 dengan mengurangi rata-rata dari setiap skor. Sekarang, untuk output, meskipun kita bisa menggunakan biner, kita akan menggunakan kategorikal dalam kasus ini tanpa alasan tertentu, kecuali hanya untuk menunjukkannya. Kita akan mengambil semua keluaran yang diinginkan, kelas, yang merupakan spam, bukan spam, dan mengubahnya menjadi penyandian 1, 0 dan 0, 1. Sekarang, kita bisa membangun jaringan kita. Kita akan membangun jaringan lagi untuk setiap pemisahan kereta\/tes sehingga dimulai secara acak. Kita akan [ 114 ]","Neural Networks Chapter 4 membangun jaringan sekuensial, yang merupakan jaringan feed-forward yang khas. Kita akan memiliki lapisan pertama 512 neuron. Mereka akan menerima 2.000 masukan yang berbeda. Ada 2.000 karena itu ukuran sekantong kata-kata. Kita kemudian menggunakan aktivasi ReLU. Kita juga bisa menggunakan Tanh. ReLU umum di jaringan saraf saat ini. Ini cukup cepat dan juga akurat. Ada lapisan 512 dan kemudian lapisan 2. 2 sangat spesifik karena itulah outputnya. Kita memiliki pengkodean satu-panas, jadi 1, 0, 0, 1, jadi itu dua neuron. Itu harus sesuai dengan jumlah output yang kita miliki. Masing-masing dari keduanya memiliki tautan ke 512 neuron dari sebelumnya. Itu banyak tepi yang menghubungkan lapisan pertama ke lapisan kedua. Untuk mencegah overfitting, kita menambahkan dropout. Dropout 50% berarti bahwa setiap kali ia memperbarui bobot, ia hanya menolak memperbarui setengahnya, setengah acak. Kita kemudian menemukan jumlah tertimbang dari input mereka. Kita mengambil jumlah itu dan menjalankan softmax. Softmax mengambil output yang berbeda ini dan mengubahnya menjadi probabilitas sehingga salah satunya adalah yang tertinggi dan semuanya antara 0 dan 1. Kemudian, kita mengkompilasi model untuk menghitung kerugian sebagai categorical_crossentropy. Ini biasanya sesuatu yang digunakan ketika mereka menggunakan penyandian satu-panas. Mari kita gunakan pengoptimal Adamax. Ada berbagai pengoptimal yang tersedia di Keras, dan Anda dapat melihat dokumentasi Keras di https:\/\/keras.io\/. Akurasi adalah ukuran penting untuk dikerjakan saat kita melatih jaringan, dan kita juga ingin menghitung akurasi di bagian paling akhir untuk melihat seberapa baik hal itu dilakukan. Kita kemudian menjalankan fit di set pelatihan. d_train_inputs adalah input train, dan d_train_inputs adalah bagan matriks model kata, output train, dan [ 115 ]","Neural Networks Chapter 4 enkode one-hot. Kita akan mengatakan bahwa kita menginginkan 10 epoch, yang berarti akan melalui seluruh rangkaian pelatihan sepuluh kali, dan ukuran batch 16, yang berarti akan melewati 16 baris dan menghitung kerugian rata-rata dan kemudian memperbarui bobot . Setelah fit, yang secara tidak langsung berarti sudah dilatih, kita evaluasi tesnya. Tidak sampai titik ini yang benar-benar terlihat pada tes. Skor yang keluar akan menjadi kerugian dan metrik apa pun yang kita miliki, yang dalam hal ini adalah akurasi. Oleh karena itu, kita hanya akan menunjukkan akurasi kali 100 untuk mendapatkan persen dan kita akan mengembalikan skor. Sekarang, mari kita buat split itu lagi, yaitu k-fold split dengan lima fold yang berbeda: Kita mengumpulkan skor. Untuk setiap pemisahan, kita akan menjalankan fuction trains_and_test dan menyimpan skor. Di sini, itu berjalan pada setiap split. Jika Anda menggulir, Anda akan melihat bahwa Anda memulai zaman. Kita dapat melihat bahwa akurasi pada input pelatihan meningkat per epoch. Sekarang, jika ini menjadi sangat tinggi, Anda mungkin mulai khawatir tentang pemasangan yang berlebihan, tetapi setelah 10 zaman, gunakan set pengujian yang belum pernah terlihat sebelumnya. Ini membantu kita mendapatkan nomor akurasi untuk set pengujian. Kemudian, kita akan melakukannya lagi untuk split berikutnya dan kita akan mendapatkan akurasi yang berbeda. Kita akan melakukan ini beberapa kali lagi sampai kita memiliki lima angka yang berbeda, satu untuk setiap pemisahan. [ 116 ]","Neural Networks Chapter 4 Rata-rata ditemukan sebagai berikut: Di sini, kita mendapatkan 95%, yang sangat dekat dengan apa yang kita dapatkan dengan menggunakan hutan acak. Kita tidak menggunakan contoh jaringan saraf ini untuk menunjukkan bahwa kita bisa mendapatkan 100%. Kita menggunakan metode ini untuk mendemonstrasikan cara alternatif untuk mendeteksi spam daripada metode hutan acak. Ringkasan Dalam bab ini, kita membahas pengantar singkat tentang jaringan saraf, melanjutkan dengan jaringan saraf umpan maju, dan melihat program untuk mengidentifikasi genre musik dengan jaringan saraf. Akhirnya, kita merevisi detektor spam kita dari sebelumnya agar berfuction dengan jaringan saraf. Dalam bab berikutnya, kita akan melihat deep learning dan mempelajari tentang jaringan saraf convolutional. [ 117 ]","5 Deep Learning Dalam bab ini, kita akan membahas beberapa dasar-dasar pembelajaran yang mendalam (deep Learning). Deep learning mengacu pada jaringan saraf dengan banyak lapisan. Ini semacam kata kunci, tetapi teknologi di baliknya nyata dan cukup canggih. Istilah ini semakin populer seiring dengan pembelajaran mesin dan kecerdasan buatan, seperti yang ditunjukkan dalam grafik tren Google ini: Seperti yang dinyatakan oleh beberapa penemu metode pembelajaran mendalam, keuntungan utama deep learning adalah bahwa menambahkan lebih banyak data dan lebih banyak daya komputasi sering kali menghasilkan hasil yang lebih akurat, tanpa upaya signifikan yang diperlukan untuk rekayasa. Dalam bab ini, kita akan melihat hal-hal berikut: a. Metode pembelajaran yang mendalam b. Mengidentifikasi simbol matematika tulisan tangan dengan CNN [ 118 ]","c. Meninjau kembali pengidentifikasi spesies burung untuk menggunakan gambar Metode Deep Learning Deep learning mengacu pada beberapa metode yang dapat digunakan dalam aplikasi tertentu. Metode ini meliputi convolutional layer dan pooling. Fungsi aktivasi yang lebih sederhana dan lebih cepat, seperti ReLU, mengembalikan jumlah bobot neuron jika positif dan nol jika negatif. Teknik regularisasi, seperti dropout, secara acak mengabaikan bobot selama basis pembaruan bobot untuk mencegah overfitting. GPU digunakan untuk pelatihan yang lebih cepat dengan urutan 50 kali lebih cepat. Ini karena mereka dioptimalkan untuk perhitungan matriks yang digunakan secara luas di jaringan saraf dan unit memori untuk aplikasi seperti pengenalan suara. Beberapa faktor telah berkontribusi pada pertumbuhan dramatis deep learning dalam lima tahun terakhir. Kumpulan data publik yang besar, seperti ImageNet, yang menyimpan jutaan gambar berlabel yang mencakup seribu kategori dan Mozilla's Common Voice Project, yang berisi sampel ucapan kini tersedia. Kumpulan data tersebut telah memenuhi persyaratan dasar untuk banyak data pelatihan yang mendalam. GPU telah beralih ke deep learning dan kluster sambil juga berfokus pada game. Ini membantu memungkinkan deep learning skala besar. Kerangka kerja perangkat lunak canggih yang dirilis open source dan sedang mengalami peningkatan pesat juga tersedia untuk semua orang. Ini termasuk TensorFlow, Keras, Torch, dan Caffe. Arsitektur mendalam yang mencapai hasil mutakhir, seperti Inception-v3 sedang digunakan untuk dataset ImageNet. Jaringan ini sebenarnya memiliki perkiraan 24 juta parameter, dan komunitas besar peneliti dan insinyur perangkat lunak dengan cepat menerjemahkan [ 119 ]","prototipe penelitian ke dalam perangkat lunak sumber terbuka yang dapat diunduh, dievaluasi, dan diperluas oleh siapa saja. Konvolusi dan penyatuan (pooling) Bagian ini membahas lebih dekat dua teknologi deep learning yang mendasar, yaitu, convolution dan pooling. Sepanjang bagian ini, kita akan menggunakan gambar untuk memahami konsep-konsep ini. Namun demikian, apa yang akan kita pelajari juga dapat diterapkan pada data lain, seperti sinyal audio. Mari kita lihat foto berikut dan mulai dengan memperbesar untuk mengamati piksel: Konvolusi terjadi per saluran. Gambar masukan umumnya terdiri dari tiga saluran; merah, hijau, dan biru. Langkah selanjutnya adalah memisahkan ketiga warna ini. Diagram berikut menggambarkan hal ini: [ 120 ]","Konvolusi adalah kernel. Pada gambar ini, kita menerapkan kernel 3 x 3. Setiap kernel berisi sejumlah bobot. Kernel meluncur di sekitar gambar dan menghitung jumlah bobot piksel pada kernel, masing-masing dikalikan dengan bobot kernel yang sesuai: [ 121 ]","Istilah bias juga ditambahkan. Sebuah nomor tunggal, jumlah tertimbang, dihasilkan untuk setiap posisi yang digeser kernel. Bobot kernel dimulai dengan nilai acak dan berubah selama fase pelatihan. Diagram berikut menunjukkan tiga contoh kernel dengan bobot berbeda: [ 122 ]","Anda dapat melihat bagaimana gambar berubah secara berbeda tergantung pada bobotnya. Gambar paling kanan menyoroti tepi, yang sering berguna untuk mengidentifikasi objek. Langkahnya membantu kita memahami bagaimana kernel meluncur melintasi gambar. Diagram berikut adalah contoh langkah 1 x 1: Kernel bergerak satu piksel ke kanan dan kemudian ke bawah. Selama proses ini, bagian tengah kernel akan mengenai setiap piksel gambar sementara tumpang tindih dengan kernel lainnya. Juga diamati bahwa beberapa piksel terlewatkan oleh pusat kernel. Gambar berikut menggambarkan langkah 2 x 2: [ 123 ]","Dalam kasus-kasus tertentu, diamati bahwa tidak terjadi tumpang tindih. Untuk membuktikannya, diagram berikut berisi langkah 3 x 3: [ 124 ]","Dalam kasus seperti itu, tidak ada tumpang tindih yang terjadi karena ukuran kernel sama dengan langkahnya. Namun, batas gambar perlu ditangani secara berbeda. Untuk mempengaruhi ini, kita bisa menggunakan padding. Ini membantu menghindari perluasan kernel melintasi perbatasan. Padding terdiri dari piksel ekstra, yang selalu nol. Mereka tidak berkontribusi pada jumlah tertimbang. Padding memungkinkan bobot kernel untuk menutupi setiap wilayah gambar sambil tetap membiarkan kernel menganggap langkahnya adalah 1. Kernel menghasilkan satu output untuk setiap wilayah yang dicakupnya. Oleh karena itu, jika kita memiliki langkah yang lebih besar dari 1, kita akan memiliki output yang lebih sedikit daripada piksel aslinya. Dengan kata lain, konvolusi membantu mengurangi dimensi gambar. Rumus yang ditunjukkan di sini memberi tahu kita dimensi output dari konvolusi: [ 125 ]","Ini adalah praktik umum untuk menggunakan gambar persegi. Kernel dan langkah digunakan untuk kesederhanaan. Ini membantu kita fokus hanya pada satu dimensi, yang akan sama untuk lebar dan tinggi. Dalam diagram berikut, kernel 3 x 3 dengan langkah (3, 3) digambarkan: Perhitungan sebelumnya memberikan hasil 85 lebar dan 85 tinggi. Lebar dan tinggi gambar telah dikurangi secara efektif dengan faktor tiga dari 256 Musik Terbanggakan. Daripada menggunakan langkah-langkah besar, kita akan [ 126 ]","membiarkan konvolusi mengenai setiap piksel dengan menggunakan langkah 1. Ini akan membantu kita mencapai hasil yang lebih praktis . Kita juga perlu memastikan bahwa ada cukup bantalan. Namun, akan bermanfaat untuk mengurangi dimensi gambar saat kita bergerak melalui jaringan. Ini membantu kereta jaringan lebih cepat karena akan ada lebih sedikit parameter. Parameter yang lebih sedikit menyiratkan peluang yang lebih kecil untuk over-fitting. Kita sering menggunakan penggabungan maks atau rata-rata antara dimensi konvolusi alih-alih memvariasikan panjang langkah. Pooling melihat suatu wilayah, yang, mari kita asumsikan, adalah 2 x 2, dan hanya menyimpan nilai terbesar atau rata-rata. Gambar berikut menggambarkan matriks 2 x 2 yang menggambarkan pooling: Area pooling selalu memiliki ukuran langkah yang sama dengan ukuran pool. Ini membantu menghindari tumpang tindih. Pooling tidak menggunakan beban apa pun, yang berarti tidak ada yang perlu dilatih. Berikut adalah representasi jaringan saraf convolutional (CNN) yang relatif dangkal:: [ 127 ]","Kita mengamati bahwa gambar input mengalami berbagai konvolusi dan lapisan penyatuan dengan aktivasi ReLU di antara mereka sebelum akhirnya tiba di jaringan yang sepenuhnya terhubung secara tradisional. Jaringan yang sepenuhnya terhubung, meskipun tidak digambarkan dalam diagram, pada akhirnya memprediksi kelas. Dalam contoh ini, seperti pada kebanyakan CNN, kita akan memiliki banyak konvolusi di setiap lapisan. Di sini, kita akan mengamati 10, yang digambarkan sebagai baris. Masing-masing dari 10 konvolusi ini memiliki kernel sendiri di setiap kolom sehingga konvolusi yang berbeda dapat dipelajari pada setiap resolusi. Lapisan yang terhubung sepenuhnya di sebelah kanan akan menentukan konvolusi mana yang paling baik untuk mengidentifikasi mobil atau truk, dan seterusnya. [ 128 ]","Mengidentifikasi simbol matematika tulisan tangan dengan CNN Bagian ini berkaitan dengan membangun CNN untuk mengidentifikasi simbol matematika tulisan tangan. Kita akan menggunakan dataset HASYv2. Ini berisi 168.000 gambar dari 369 kelas berbeda di mana masing-masing kelas mewakili simbol yang berbeda. Dataset ini adalah analog yang lebih kompleks dibandingkan dengan dataset MNIST populer, yang berisi angka tulisan tangan. Diagram berikut menggambarkan jenis gambar yang tersedia dalam kumpulan data ini: [ 129 ]","Dan di sini, kita dapat melihat grafik yang menunjukkan berapa banyak simbol yang memiliki jumlah gambar yang berbeda: [ 130 ]","Terlihat bahwa banyak simbol memiliki sedikit gambar dan ada beberapa yang memiliki banyak gambar. Kode untuk mengimpor gambar apa pun adalah sebagai berikut: Kita mulai dengan mengimpor kelas Image dari Library IPython. Ini memungkinkan kita untuk menunjukkan gambar di dalam Jupyter Notebook. Berikut salah satu gambar dari dataset: [ 131 ]","Ini adalah gambar alfabet A. Setiap gambar berukuran 30 x 30 piksel. Gambar ini dalam format RGB meskipun sebenarnya tidak harus RGB. Saluran yang berbeda didominasi hitam dan putih atau skala abu-abu. Kita akan menggunakan tiga saluran ini. Kita kemudian melanjutkan untuk mengimpor CSV, yang memungkinkan kita memuat kumpulan data: File CSV ini menyatakan semua nama file dan nama kelas yang berbeda. Kita mengimpor kelas gambar dari QJM, yang memungkinkan kita memuat gambar. Kita mengimpor preprocessing.image, yang kemudian memungkinkan kita untuk mengubah gambar menjadi array numpy. Mari kita menelusuri file data, melihat lebih dekat setiap nama file dan memuatnya, sambil merekam kelas mana yang dimiliki: [ 132 ]","Langkah selanjutnya adalah menyimpan gambar dan kelas dan menggunakan pembaca CSV. Kita perlu mengatur penghitung untuk memastikan kita melewati baris pertama, yang merupakan header dari file CSV. Hanya setelah ini, kita melanjutkan untuk membuka gambar, yang ada di kolom pertama setiap baris. Ini diubah menjadi array. Hasil yang dicapai akan memiliki dimensi 30 x 30 x 3, yang diinterpretasikan sebagai lebar 30, tinggi 30, dan 3 saluran (RGB). Ketiga saluran ini akan memiliki angka antara 0 dan 255. Ini adalah nilai piksel tipikal, yang tidak baik untuk jaringan saraf. Kita membutuhkan nilai yang terletak antara 0 dan 1 atau -1 dan 1. Untuk melakukan ini, kita membagi setiap nilai piksel dengan 255. Untuk mempermudah, kita akan mengumpulkan nama file, nama kelas, dan matriks gambar dan menempatkan mereka ke dalam daftar gambar kita . Kita juga akan membuat catatan nama kelas. Cuplikan berikut akan membuat kita memahami konsep lebih mendalam: [ 133 ]","File tersebut bernama hasy-data\/v2-00000.png adalah nama kelas yang diikuti oleh array. Array memiliki dimensi 30 x 30 x 3. Dimensi terdalam dan terakhir adalah 3. Setiap 1.0 menggambarkan warna putih. Kita memahami ini karena kita membagi semuanya dengan 255 seperti yang disebutkan sebelumnya . Kita memiliki 168.000 gambar dalam kumpulan data )\\\"4:W: Kita kemudian melanjutkan untuk mengacak dan kemudian membagi data pada kereta 80%, basis pengujian 20%. Seperti yang terlihat pada codeblock berikut, pertama kita shuffle, kemudian dilanjutkan dengan split image: [ 134 ]","Karena kita menggunakan tupel ini dengan tiga nilai yang berbeda, pada akhirnya kita harus mengumpulkan semua itu ke dalam matriks: Kita perlu mengumpulkan gambar dan juga labelnya. Untuk mengumpulkan gambar, kita melewati setiap baris dan mengambil setiap elemen ketiga. Elemen ini adalah matriks gambar. Kita menyatukan semuanya ke dalam array numpy. Hal yang sama dilakukan untuk dataset kereta dan pengujian. Untuk output, kita harus pergi dan memilih nilai kedua. Ini masih string, seperti B dan . Kita perlu mengubah nilai kedua menjadi pengkodean satu-panas sebelum dapat digunakan untuk jaringan saraf. Kita melanjutkan untuk menggunakan encoder label prapemrosesan scikit-learn dan encoder one-hot: [ 135 ]","Kita akan membuat objek LabelEncorder dan kita akan menyesuaikan dan mengubah kelas: Fungsi fit mempelajari kelas mana yang ada. Ia belajar bahwa ada 369 nama kelas yang berbeda. Fungsi transform mengubahnya menjadi bilangan bulat. Hal ini dilakukan dengan menyortir kelas dan memberikan setiap kelas sebuah ID integer. Integer_encoded membantu mereproduksi daftar kelas sebagai ID integer. Encoder one-hot mengambil bilangan bulat ini dan menyesuaikannya; ini juga mempelajari berapa banyak bilangan bulat berbeda yang diwakili. Seperti yang dipelajari LabelEncorder tentang nama kelas, onehot_encoder akan mempelajari bahwa ada 369 bilangan bulat yang berbeda. Kode kemudian pindah ke LabelEncorder yang mengubah trains_output menjadi bilangan bulat. Bilangan bulat ini kemudian diubah menjadi pengkodean satu-panas. Encoding one-hot mengembalikan 369-dimensi dengan dimensi pertama dari 369 nilai dan vektor dari 369 nilai. Semua nilai adalah nol kecuali untuk satu 1. Posisi 1 ini tergantung pada kelas mana. test_output [ 136 ]","mengalami proses yang sama. Ketika data pelatihan untuk input dan output sudah siap, kita melanjutkan untuk membangun jaringan saraf. Untuk melakukan ini, kita akan menggunakan sequential lagi: Sequential adalah jaringan feed-forward. Meskipun ada konvolusi yang masih feed forward dan tidak berulang, tidak ada siklus. Lapisan padat digunakan di akhir jaringan. Kita juga menggunakan Dropout untuk mencoba mencegah overfitting. Ketika kita beralih dari konvolusi ke lapisan padat, kita perlu menggunakan perintah flatten, karena konvolusi adalah dua dimensi dan lapisan padat tidak. Kita juga perlu menggunakan Conv2D dan MaxPooling2D. Blok kode berikut adalah desain jaringan kita : Ini dimodelkan setelah desain MNIST, yang menangani angka tulisan tangan. Kita mulai dengan membuat model sekuensial. Kita perlu menambahkan lapisan konvolusi yang memiliki 32 konvolusi berbeda. Ukuran kernel akan menjadi 3 x [ 137 ]","3 dan aktivasi akan menjadi ReLU. Karena ini adalah layer pertama, kita perlu menyebutkan bentuk inputnya. Jika Anda ingat, dimensinya adalah 30 x 30 x 3. Kita menggunakan ukuran kernel 3 x 3 dan langkahnya sebagai 1 karena ini adalah nilai default. Memiliki langkah sebagai 1 akan membutuhkan bantalan. Ini akan menghasilkan bentuk 30 x 30 x 32 karena ada 32 konvolusi. Dimensi 30 x 30 tetap konstan. KITA sekarang mengamati bahwa kita tidak benar-benar mengurangi dimensi hanya dengan melakukan konvolusi ini. MaxPooling digunakan untuk mengurangi dimensi hingga setengahnya. Hal ini dimungkinkan karena memiliki ukuran kolam 2 x 2. Kita kemudian mengikuti dengan lapisan konvolusi lain, yang merupakan pengurangan dimensi lain. Setelah semua lilitan terjadi, kita meratakan semuanya. Ini mengubah representasi dua dimensi menjadi representasi satu dimensi. Ini kemudian dimasukkan ke dalam lapisan padat dengan lebih dari 1.000 neuron. Lapisan padat ini kemudian akan memiliki aktivasi a tanh. Ini kemudian dimasukkan ke dalam lapisan neuron padat lainnya. Kali ini, ada 369 dari mereka untuk output kelas. Ini adalah keluaran onehot_encoding. Kita tidak akan melakukan aktivasi tertentu kecuali softmax. Jadi, nilai asli akan diskalakan ulang menjadi antara 0 dan 1. Ini berarti bahwa jumlah semua nilai di 369 neuron yang berbeda adalah 1,0. Softmax pada dasarnya mengubah output menjadi probabilitas. Melanjutkan kompilasi categorical _crossentropy lagi membantu kita memprediksi salah satu dari beberapa kelas. Anda ingin melakukan ini pada pengoptimal adam dan mengamati keakuratannya. Berikut ringkasan modelnya: [ 138 ]","Diamati bahwa lapisan konvolusi tidak mengubah dimensi, tetapi penyatuannya. Ini mengurangi setengahnya karena ukuran dimensi yang aneh, yaitu, 15. Lapisan berikutnya adalah pada output 13, yang juga berkurang setengahnya. Parameter conv2d_1 (Conv2D) digunakan untuk mempelajari konvolusi. Parameter dense_1 (Dense) digunakan untuk mempelajari bobot yang terhubung ke lapisan sebelumnya. Dengan cara yang serupa, parameter dense_1 (Dense) adalah untuk bobot untuk lapisan sebelumnya. Pada akhirnya, kita memiliki sekitar 1,6 juta parameter. Kita akan memvisualisasikan akurasi kinerja dan akurasi validasi dengan TensorBoard. Kita akan menyimpan semua hasil ke dalam direktori bernama mnist-style karena itulah gaya jaringan yang kita bangun sebelumnya. Berikut ini adalah panggilan balik: [ 139 ]","Keras mendukung panggilan balik dari berbagai jenis. Callback digunakan dalam metode fit, jadi setelah setiap epoch, callback akan dipanggil. Ini meneruskan informasi ke panggilan balik, seperti kehilangan validasi dan kehilangan pelatihan. Kita menggunakan 10 epoch dan ukuran batch 32, dengan pemisahan validasi 0,2, 20%. Berikut hasil pelatihannya: Sekarang, ada banyak pilihan, tetapi pada akhirnya kita perlu memeriksanya. Kita mendapatkan akurasi validasi sekitar 76%, dan ketika kita menguji ini di set pengujian, kita mendapatkan akurasi 76% yang sama. Sekarang, ada banyak keputusan dalam desain ini, termasuk berapa banyak lapisan konvolusi yang harus dimiliki dan berapa ukurannya, kernel apa yang harus digunakan atau [ 140 ]","ukuran kernel apa, langkah apa, aktivasi apa untuk konvolusi, di mana max pooling muncul, jika pernah, berapa ukuran pooling, berapa banyak lapisan padat yang kita miliki, kapan muncul, apa aktivasinya, dan seterusnya dan seterusnya. Banyak keputusan. Cukup sulit untuk mengetahui bagaimana memilih desain yang berbeda ini. Ini sebenarnya disebut hyperparameters. Bobot yang dapat dipelajari selama prosedur fit hanya disebut parameter, tetapi keputusan yang harus Anda buat tentang bagaimana merancang jaringan dan fuction aktivasi dan seterusnya kita sebut hyperparameter, karena mereka tidak dapat dipelajari oleh jaringan. Untuk mencoba parameter yang berbeda, kita bisa melakukan beberapa loop: Kita akan menghitung berapa lama waktu yang dibutuhkan untuk melatih masing-masing. Kita akan mengumpulkan hasilnya, yang akan menjadi angka akurasi. Kemudian, kita akan mencoba konvolusi 2D, yang akan memiliki satu atau dua lapisan seperti itu. Kita akan mencoba lapisan padat dengan 128 neuron. Kita akan mencoba dropout sebagai for dropoutin [0.0. 0.25, 0.50,0.7], [ 141 ]","yang akan berupa ya atau tidak, dan artinya 0-25%, 50%, 75%. Jadi, untuk setiap kombinasi ini, kita membuat model tergantung pada berapa banyak konvolusi yang akan kita miliki, dengan lapisan konvolusi satu atau dua. Kita akan menambahkan lapisan konvolusi. Jika ini adalah layer pertama, kita perlu memasukkan bentuk input, jika tidak, kita hanya akan menambahkan layer. Kemudian, setelah menambahkan lapisan konvolusi, kita akan melakukan hal yang sama dengan max pooling. Kemudian, kita akan meratakan dan menambahkan lapisan padat dengan ukuran berapa pun yang berasal dari for dense_size in [128, 256,512, 1024, 2048]: loop. Itu akan selalu menjadi tanh. Jika Dropout digunakan, kita akan menambahkan layer dropout. Menyebut dropout ini berarti, katakanlah 50%, bahwa setiap kali ia memperbarui bobot setelah setiap batch, ada peluang 50% untuk setiap bobot yang tidak akan diperbarui, tetapi kita menempatkan ini di antara dua lapisan padat untuk disortir melindunginya dari overfitting. Lapisan terakhir akan selalu menjadi jumlah kelas karena harus, dan kita akan menggunakan softmax. Itu dikompilasi dengan cara yang sama. Siapkan direktori log yang berbeda untuk TensorBoard sehingga kita dapat membedakan konfigurasi yang berbeda. Mulai timer dan jalankan fit. Lakukan evaluasi dan dapatkan skor, hentikan timer, dan cetak hasilnya. Jadi, ini berjalan pada semua konfigurasi yang berbeda ini: [ 142 ]","0,74 adalah akurasi set tes yang sebenarnya. Jadi, Anda dapat melihat bahwa ada banyak angka yang berbeda untuk akurasi. Mereka turun ke titik tujuh rendah hingga titik tujuh tinggi, dan waktunya berbeda tergantung pada berapa banyak parameter yang ada di jaringan. Kita dapat memvisualisasikan hasil ini karena kita menggunakan fuction panggilan balik. Berikut akurasi dan loss, yang berasal dari set pelatihan: [ 143 ]","Dan inilah akurasi validasi dan kehilangan validasi: Perkecil sedikit sehingga kita dapat melihat konfigurasi di samping, dan kemudian kita dapat mematikan semuanya. Nyalakan kembali mnist-style. Ini adalah yang pertama kita coba: [ 144 ]","Anda dapat melihat bahwa akurasi naik dan kerugian turun. Itu cukup normal. Akurasi validasi naik dan kerugian turun, dan sebagian besar tetap konsisten. Apa yang tidak ingin kita lihat adalah kehilangan validasi yang meroket setelah beberapa saat, meskipun akurasinya meningkat. Itu cukup banyak definisi overfitting. Ini mempelajari contoh-contoh pelatihan dengan sangat baik, tetapi menjadi jauh lebih buruk pada contoh-contoh yang tidak dilihatnya. Kita benar- benar tidak ingin itu terjadi. Jadi, mari kita bandingkan beberapa hal. Pertama, kita akan membandingkan putus sekolah yang berbeda. Mari kita pergi ke conv2d_1-dense_* tetapi dengan putus sekolah yang berbeda. Sejauh kerugian terjadi: Kita bisa melihat bahwa dengan dropout yang sangat rendah, seperti 0 atau 0.25, kerugian diminimalkan. Itu karena jika Anda ingin benar-benar mempelajari set pelatihan itu, jangan menolak untuk memperbarui bobot. Sebagai gantinya, perbarui semuanya setiap saat. Dengan putaran yang sama, dengan melihat garis biru tua, kita dapat melihat bahwa itu pasti overfit setelah hanya dua epoch karena kehilangan validasi, contoh yang tidak terlihat, mulai menjadi jauh lebih buruk. Jadi, di situlah overfitting dimulai. Cukup jelas bahwa putus sekolah [ 145 ]"]
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180