["mengurangi overfitting. Lihatlah dropout 0,75. Di situlah hilangnya validasi menjadi lebih baik dan lebih baik, yang berarti semakin rendah. Namun, itu tidak menjadikannya yang paling akurat, karena kita dapat melihat bahwa akurasi belum tentu yang terbaik untuk set pelatihan atau set validasi kita:: Sebenarnya, sekitar 0,5 tampaknya cukup bagus untuk set validasi. Sekarang, mari kita pastikan itu sama untuk lapisan lainnya. Sekali lagi, tanpa dropout (0,0), kita mendapatkan kehilangan pelatihan terendah tetapi kehilangan validasi tertinggi. Demikian juga, kita mendapatkan dropout 0,75 untuk kehilangan validasi terendah tetapi belum tentu pelatihan terbaik. Sekarang, mari kita bandingkan berapa banyak lapisan padat yang mereka miliki. Kita hanya akan tetap dengan dropout 0.5, jadi kita akan menggunakan conv2d_1. Jadi, kita memiliki satu lapisan konvolusi, dense_*, dan dropout 0,50: [ 146 ]","Jadi pilihannya di sini adalah, apakah lapisan padat memiliki 128, 256, 512, 1.024, atau 2.048? Pada grafik sebelumnya, kita dapat melihat bahwa ada beberapa kasus overfitting yang jelas. Hampir semua hal yang bukan 128 mulai mengalami overfitting. Jadi, lapisan padat 128 mungkin merupakan pilihan terbaik. Sekarang, mari kita bandingkan satu lapisan konvolusi dengan dua lapisan konvolusi:: Bukan perbedaan besar, sebenarnya. Untuk validasi, kita mendapatkan dua lapisan konvolusi dan menerima kerugian terendah, yang biasanya sama dengan akurasi tertinggi. Ini berarti bahwa kita telah menyempit. Ini disebut pemilihan model, yang semuanya tentang mencari tahu apa model terbaik, serta hyperparameter terbaik. Kita telah mempersempit ini menjadi konvolusi dua dimensi, dua lapisan itu, 128 padat di lapisan padat pertama, dan 50% putus sekolah. Mengingat itu, mari kita latih ulang semua data sehingga kita memiliki model terlatih terbaik yang mungkin kita miliki: [ 147 ]","Kita mendapatkan dua lapisan konvolusi kita , kita melakukan 128 dropout 0,5 kita yang padat, dan dalam hal ini kita mengambil semua data yang kita miliki, seluruh dataset dilatih dan diuji, dan menyatukan semuanya. Sekarang, kita tidak dapat benar-benar mengevaluasi model ini karena kita baru saja kehilangan set pengujian kita , jadi yang akan kita lakukan adalah menggunakan model ini untuk memprediksi gambar lain. Sebenarnya, kita akan menyimpan model setelah itu pas dan kita akan menunjukkan cara memuat dalam satu menit. Jika Anda akan memuat ini di file lain, Anda juga ingin tahu apa nama label itu karena yang kita tahu hanyalah penyandian satu-panas. Dari pengkodean satu-panas, kita bisa mendapatkan kembali nomor integer, tapi tetap saja itu tidak sama dengan nama simbol yang sebenarnya. Jadi, kita harus menyimpan kelas dari LabelEncorder dan kita hanya akan menggunakan file numpy untuk menyimpannya. Mari kita latih modelnya: [ 148 ]","Ini sebenarnya bisa semua dalam file terpisah. Anda dapat memuat semuanya lagi:: Impor keras.models dan Anda dapat menggunakan fitur load _model. File model di sana sebenarnya menyimpan struktur serta bobotnya. Hanya itu yang perlu Anda lakukan untuk memulihkan jaringan. Anda dapat mencetak ringkasan lagi. Untuk LabelEncorder, kita perlu memanggil konstruktor lagi dan memberikan kelas yang kita simpan sebelumnya. Sekarang, kita dapat membuat sebuah fuction yang disebut predict mengambil sebuah gambar. Kita melakukan sedikit preprocessing untuk mengubah gambar menjadi array, kita membaginya dengan 255, dan kita memprediksi. Jika Anda memiliki seluruh rangkaian gambar, Anda tidak perlu melakukan pembentukan ulang ini, tetapi karena kita hanya memiliki satu, kita dapat meletakkannya dalam array yang memiliki satu baris. Kita akan mendapatkan prediksi dari ini, dan menggunakan LabelEncorder, kita dapat membalikkan prediksi ke nama sebenarnya dari kelas, nama simbol, dan prediksi yang mana? Nah, ini adalah pengkodean satu-panas, sehingga Anda dapat mengetahui posisi angka [ 149 ]","tertinggi. Ini mengambil semua output neuron, 369, mencari tahu apa angka kepercayaan terbesar, dan mengatakan itulah yang diprediksi. Oleh karena itu, penyandian satu-panas akan memberi tahu Anda simbol khusus ini, dan kemudian kita dapat mencetaknya: Inilah cara kita dapat menggunakan fuction itu: [ 150 ]","Kita sebenarnya menggunakan gambar pelatihan untuk tujuan ini alih-alih membuat yang baru, tetapi Anda mendapatkan idenya. Anda mengambil gambar yang menyatakan bahwa itu adalah \\\", dan saya 87% yakin tentang hal itu. Untuk prediksi pi, kita 58% yakin dan untuk prediksi alfa, kita 88% yakin. Selanjutnya, kita akan melihat contoh spesies burung yang kita gunakan sebelumnya, dan alih-alih menggunakan semua atribut yang dibuat manusia, kita akan menggunakan gambar itu sendiri.. Meninjau kembali pengidentifikasi spesies burung untuk menggunakan gambar Di bagian ini, kita akan meninjau kembali pengidentifikasi spesies burung dari sebelumnya. Kali ini, kita akan memperbaruinya untuk menggunakan jaringan saraf dan pembelajaran mendalam. Bisakah Anda mengingat kumpulan data burung? Ini memiliki 200 spesies burung yang berbeda di 12.000 gambar. Tidak seperti sebelumnya, kita tidak akan menggunakan atribut berlabel manusia, dan sebaliknya kita akan menggunakan gambar yang sebenarnya tanpa pra- pemrosesan. Dalam upaya pertama kita , kita akan membangun jaringan saraf konvolusi khusus, seperti yang kita lakukan untuk pengklasifikasi simbol matematika. Mari kita pergi ke kode. Kita akan mulai dengan impor khas: [ 151 ]","Kita akan membuat beberapa variabel kenyamanan, baris dan kolom gambar, lebar dan tinggi, dan jumlah saluran, RGB, meskipun setiap gambar burung akan sama. Meskipun tidak semuanya harus berukuran sama, kita akan mengubah ukurannya ke ukuran ini sehingga semuanya konsisten: Sekarang, proyek ini memperkenalkan fitur menarik di Keras yang disebut generator data gambar: Generator data dapat menghasilkan gambar baru dari set pelatihan yang ada dan gambar baru ini dapat memiliki berbagai perbedaan; misalnya bisa diputar, bisa dibalik horizontal atau vertikal, dan lain sebagainya. Kemudian, kita dapat menghasilkan lebih banyak contoh daripada yang sebenarnya kita mulai. Ini adalah hal yang bagus untuk dilakukan ketika Anda memiliki sejumlah kecil contoh pelatihan. Kita memiliki, dalam kasus kita , sekitar 6.000 set pelatihan. Itu relatif kecil dalam pembelajaran mendalam, jadi kita ingin dapat menghasilkan lebih banyak; generator data hanya akan terus menghasilkannya selama kita terus memintanya. Untuk gambar pelatihan, kita juga ingin membuat versi dengan flip horizontal. Kita tidak ingin melakukan flip vertikal karena saya tidak mengharapkan gambar burung menjadi terbalik. Kita juga [ 152 ]","ingin mendukung rotasi hingga 45 derajat, dan kita ingin mengubah skala semua nilai piksel untuk dibagi 255. Sebenarnya, ImageDataGenerator hanya memanggil konstruktor, jadi belum terjadi apa-apa. Yang ingin Anda lakukan selanjutnya adalah menggunakan flow_from_directory , sehingga gambar Anda dapat diatur ke dalam direktori atau subdirektori. Kita memiliki direktori a train , dan di dalamnya akan ada folder untuk setiap kelas burung. Jadi, ada 200 folder berbeda di dalam kereta dan di dalam folder itu ada gambar burung itu. Kita ingin semua gambar diubah ukurannya menjadi 256 x 256 dan kita dapat menunjukkan bahwa alih-alih menggunakan biner, kita ingin menggunakan kelas kategoris, yang berarti bahwa kita akan memiliki banyak kelas yang berbeda (200, dalam hal ini). Kita juga akan menggunakan generator data untuk set pengujian, hanya karena flow_from_directory adalah fuction yang mudah digunakan. Kita tidak ingin melakukan flips, atau rotasi. Kita hanya ingin menggunakan set pengujian apa adanya sehingga kita dapat membandingkannya dengan orang lain. Hal lain yang sangat nyaman tentang flow_from_directory adalah secara otomatis akan menghasilkan matriks OVNQZ dengan data gambar, dan juga akan memberikan nilai kelas dalam penyandian satu-panas. Jadi, apa yang beberapa langkah sebelumnya sekarang dilakukan sekaligus. Sekarang, saya tidak benar-benar perlu melakukan reset, tetapi karena ini secara teknis iterator, jika Anda terus-menerus memperbaiki model dan mencoba untuk melatih ulang, maka Anda mungkin ingin melakukan reset sehingga Anda mendapatkan semua gambar yang sama di urutan yang sama. Bagaimanapun, ini adalah iterator, sehingga Anda dapat memanggil berikutnya, mengatur ulang, dan sebagainya: [ 153 ]","Sekarang, kita akan membangun model sekuensial, yang akan menjadi model konvolusi. Kita memiliki kernel konvolusi 3 x 3, 64 ini. Kita juga memiliki RELU dan konvolusi lain yang dibangun oleh RELU, yang dapat kita lakukan penggabungan maksimal, dan hanya dari eksperimen, saya menemukan bahwa ini bekerja dengan relatif baik: 3 x 3 diikuti oleh 3 x 3, masing-masing 64. Dengan memiliki cukup titik maksimal dramatis 4 x 4, jadi kita ulangi proses ini dan kemudian kita ratakan. Kita memiliki dropout 50% hanya untuk mengurangi overfitting, kepadatan 400 neuron, dropout lain, dan kemudian 200 untuk output karena ada 200 kelas yang berbeda, dan karena pengkodean satu panas kategoris, kita ingin menggunakan softmax sehingga hanya satu dari 200 yang memiliki nilai tertinggi. Kita juga ingin memastikan bahwa semuanya berjumlah 1.0. Berikut ringkasan modelnya. Pada akhirnya, kita memiliki sekitar 5 juta parameter: [ 154 ]","Variasi berbeda yang saya lakukan yang memiliki parameter jauh lebih banyak, seperti, katakanlah, 100 juta berkinerja lebih buruk karena terlalu banyak parameter. Ada terlalu banyak parameter, artinya sangat sulit untuk melatihnya untuk mempelajari apa pun karena jelas semua parameter dimulai secara acak, jadi sangat sulit untuk membuat parameter tersebut tren ke nilai yang tepat, atau ada begitu sedikit sehingga tidak akan mempelajari apa pun salah satu. Ada [ 155 ]","semacam keseimbangan yang harus Anda temukan, dan 5 juta, saya pikir, ada di dekat keseimbangan itu. Sekarang, jika Anda menggunakan generator, Anda tidak memiliki semua data untuk pelatihan yang disiapkan sebelumnya; itu akan menghasilkan gambar- gambar itu saat berjalan: Itu membuatnya sebenarnya cukup hemat memori. Anda tidak perlu memuat seluruh dataset sebelumnya. Itu hanya akan membuatnya sesuai kebutuhan, tetapi Anda harus memanggil fit _generator alih-alih hanya menggunakan fit. Apa yang Anda berikan alih-alih input kereta dan keluaran kereta adalah generatornya. Generator tahu bagaimana menghasilkan matriks gambar dan tahu bagaimana menghasilkan pengkodean satu-panas. Jadi, sekali lagi, itu sangat nyaman bila Anda memiliki gambar. Ada juga jenis generator lainnya. Lihat dokumentasi Keras untuk ini. steps_per_epoch menunjukkan berapa banyak gambar yang akan dihasilkan per epoch, atau berapa banyak batch yang harus diproduksi. Generator, secara default, menghasilkan kumpulan 32 gambar. Mengenai jumlah epoch, dan jika Anda ingin melakukan beberapa statistik di TensorBoard, Anda dapat mengatur callback dan verbose 2 sehingga kita dapat melihat beberapa output di sini. Ada 10 zaman: [ 156 ]","Kita dapat melihat bahwa akurasi pelatihan ada pada gambar yang sedang dilatih. Ini tidak terlalu akurat untuk akurasi yang akan ada di set pengujian, jadi kita melakukannya secara terpisah. Gambar uji juga ada di generator. Anda tidak hanya mengevaluasi Anda menggunakan evaluate_generator dan Anda berkata, berapa banyak gambar yang ingin Anda evaluasi? Kita hanya akan melakukan 1.000, dan kita akan mendapatkan akurasi 22%. Itu tidak terlalu buruk. Tebakan acak akan menghasilkan 0,5%, jadi 22% cukup bagus, dan itu hanya dari model buatan tangan mulai dari awal yang harus mempelajari semuanya dari gambar burung itu. Alasan saya mengatakan hal seperti ini adalah karena hal berikutnya yang akan kita lakukan adalah memperluas model yang sudah terlatih untuk mendapatkan peningkatan akurasi yang baik. Model ini dibuat dengan tangan, tetapi akan lebih baik untuk memperluas sesuatu seperti InceptionV3, yang ditunjukkan di sini: [ 157 ]","Ini cukup dalam; ia memiliki banyak lapisan konvolusi dan, seperti kebanyakan CNN, ia berakhir dengan lapisan yang terhubung penuh atau mungkin beberapa lapisan yang terhubung sepenuhnya. Model InceptionV3 dirancang untuk ImageNet. Nah, ini adalah dataset, dan ada kompetisi yang terkait dengannya di mana ada jutaan gambar dan 1.000 kelas yang berbeda, seperti serangga, rumah, mobil, dan sebagainya. Model InceptionV3 sangat canggih, atau pada satu titik. Itu adalah kompetisi ImageNet untuk memerangi database lain. Kita akan menggunakan sebagian besar jaringan ini hingga lapisan yang terhubung sepenuhnya. Kita tidak ingin lapisan akhir yang sepenuhnya terhubung atau padat karena itu dirancang untuk ImageNet. Secara khusus, ada 1.000 output dan itu tidak baik bagi kita . Kita tidak perlu mengenali gambar ImageNet. Namun, kita perlu mengenali gambar burung kita, dan hanya ada 200 kelas yang berbeda. Jadi, kita hanya memotong bagian depannya dan menggantinya dengan layer yang terhubung penuh, atau beberapa layer. Kita akan menggunakan semua konvolusi yang dipelajarinya, dan semua kernel yang dipelajarinya berdasarkan image ImageNet tersebut. Mari kita pergi ke kode. Untuk melakukan ini, impor InceptionV3 dari aplikasi Keras. Ada model lain yang dapat Anda pilih dari Keras yang tersedia juga: [ 158 ]","Kita akan menggunakan generator data seperti yang kita lakukan sebelumnya. Di sinilah mulai menjadi berbeda: Pertama, muat model InceptionV3 menggunakan bobot ImageNet. include_top = False berarti menurunkan lapisan padat yang terhubung penuh di bagian atas. Itulah yang mereka sebut puncak. Di situlah akhirnya menghasilkan 1.000 output yang berbeda. Kita tidak ingin itu. Kita hanya ingin konvolusi. Ini akan disebut base_model. Panggil Y, yang merupakan output dari model dasar, tambahkan GlobalAveragePooling, yang berarti menghitung rata-rata di seluruh konvolusi, dan kemudian dimasukkan ke dalam beberapa lapisan padat, dengan 1.024 neuron padat dan lapisan lain 200. Dari tentu saja, 200 karena kita memiliki 200 spesies burung yang berbeda, dan 1.024 hanya untuk mempelajari bagaimana konvolusi dapat mencocokkan spesies burung dan kemudian menghasilkan model dengan lapisan tersebut.Input dari model adalah input dari InceptionV3 dan keluarannya adalah out_layer = Dense (200, activation='softmax') (x). [ 159 ]","Pada titik ini, Anda dapat memanggil fuction model biasa seperti kompilasi, tetapi sebelum kita mengompilasi, kita ingin menandai semua lapisan model dasar dan semua konvolusi sebagai tidak dapat dilatih. Kita akan melakukan dua langkah di sini. Saat kita memasang dua lapisan padat baru, 1.024 rapat dan 200 rapat, keduanya memiliki bobot acak, jadi sejauh ini tidak berguna. Konvolusi telah dipelajari di ImageNet, jadi bagus. Kita tidak ingin mengubah konvolusi di bawah semua kernel tersebut dengan melatih gambar burung kita sampai kita mendapatkan pasangan lapisan padat baru dalam urutan yang benar. Jadi, pertama-tama kita akan menandai lapisan tersebut dari model awal sebagai tidak dapat dilatih; simpan saja angka-angka itu karena kita hanya akan melatih dua lapisan baru kita: Itu terjadi selanjutnya pada generator fit, sama seperti sebelumnya. Kita akan melakukan 100 epoch untuk memulai: [ 160 ]","Dan kita akan melakukan evaluasi: Jadi, sekarang, kita mencapai akurasi hingga 44%. Jadi hanya dengan menggunakan bobot dan struktur v3 awal atau ImageNet tetapi mengganti dua lapisan teratas dengan jaringan kita yang sepenuhnya terhubung, kita mendapatkan peningkatan 20% dari apa yang kita miliki dengan jaringan saraf convolutional kustom kita sendiri. Tapi kita bisa lebih baik lagi. Kita dapat menggunakan apa yang baru saja kita dapatkan sehingga model sekarang telah melatih dua lapisan teratas dan menandai semuanya sebagai dapat dilatih: [ 161 ]","Jadi, sekarang dua lapisan teratas diurutkan menjadi bentuk yang masuk akal, dengan akurasi 44%, kita akan membiarkan seluruh jaringan memperbarui semua gambar burung kita. Kita akan melakukannya dengan sangat lambat menggunakan penurunan gradien stokastik dengan tingkat pembelajaran yang sangat lambat dan momentum yang tinggi. Melewati 100 zaman, kita sekarang memiliki 64%: Jadi, kita pada dasarnya melakukan peningkatan 20% setiap kali. Dengan CNN khusus, kita mendapatkan akurasi 22% hanya dengan memulai dari awal. Sekarang, tentu saja, ini bukan jaringan sebesar model awal, tetapi ini menunjukkan apa yang terjadi jika Anda memulai dari awal. Kemudian, kita mulai dengan awal, semua kernel, tetapi kemudian menambahkan 2 lapisan acak kita sendiri di atas, dengan bobot acak, melatih bobot tersebut tetapi tidak mengubah kernel, dan kita mendapatkan akurasi 44%. Akhirnya, kita [ 162 ]","memeriksa dan memperbarui semua bobot, kernel, dan lapisan atas, dan kita mendapatkan akurasi 64%. Anda juga ingin tahu apa nama kelasnya jika Anda ingin mencetak nama burung kepada pengguna: Dalam hal ini, kita hanya dapat membuat daftar subdirektori dalam bentuk yang diurutkan karena itu akan cocok dengan enkode one-hot, dan kita dapat mendefinisikan fuction yang disebut predict di mana Anda memberinya nama file dengan gambar di dalamnya dan memuat gambar itu. Pastikan itu mengubah ukurannya dan mengubahnya menjadi array, membaginya dengan 255, dan kemudian menjalankan prediktor. Semua ini dilakukan untuk kita sebelumnya dengan generator gambar: [ 163 ]","Tapi sekarang, karena kita melakukan ini satu per satu, kita hanya akan melakukannya dengan tangan saja. Jalankan prediksi, cari tahu apa skor terbaik, posisi, dan ambil nama kelas lalu cetak, plus kepercayaan diri. Ada beberapa contoh burung yang saya temukan di internet: Dalam kasus burung kolibri, mereka melakukannya dengan benar. Gelatik rumah juga diprediksi dengan benar. Namun, angsa itu tidak diprediksi dengan benar. Ini adalah contoh membiarkan pengguna mengetikkan nama file. Jadi, jika Anda memiliki gambar sendiri yang relatif mirip dengan gambar jenis fotografi, Anda harus Menggunakanuntuk menggunakan model yang sudah terlatih seperti InceptionV3 untuk mendapatkan peningkatan akurasi yang besar. Ringkasan Dalam bab ini, kita membahas deep learning dan CNN. Kita berlatih dengan jaringan saraf convolutional dan deep learning dengan dua proyek. Pertama, kita membangun sistem yang dapat membaca simbol matematika tulisan tangan dan [ 164 ]","kemudian meninjau kembali formulir pengenal spesies burung dan mengubah implementasinya untuk menggunakan jaringan saraf konvolusi dalam yang secara signifikan lebih akurat. Ini menyimpulkan proyek Python AI untuk pemula. [ 165 ]","Daftar pustaka Alberto Artasanchez, Prateek Joshi (2020), Artificial Intelligence with Python, Packt Publishing Deitel\u00ae Developer Series (2019), Python for Programmers, Pearson Education, Inc. Joshua Eckroth (2018), Python Artificial Intelligence Projects for Beginners, Packt Publishing https:\/\/www.javatpoint.com\/artificial-intelligence-tutorial https:\/\/alimulyantonet.wordpress.com\/2021\/01\/11\/instal-anaconda-dan-python\/ [ 166 ]","Lampiran Code program yang ada di materi dapat didownload pada link https:\/\/github.com\/PacktPublishing\/Python-Artificial-Intelligence-Projects-for- Beginners Instal Anaconda dan Python Untuk mempelajari buku ini, kita akan menggunakan bahasa pemrograman Python. Kita akan belajar menginstal Python dan IDE dengan bantuan distribusi Anaconda. Distribusi Anaconda adalah platform gratis dan sumber terbuka untuk bahasa pemrograman Python \/ R. Anaconda dapat dengan mudah diinstal pada OS apa pun seperti Windows, Linux, dan MAC OS. Anaconda menyediakan lebih dari 1500 paket sains data Python \/ R yang cocok untuk mengembangkan model pembelajaran mesin dan deep learning. Distribusi Anaconda menyediakan instalasi Python dengan berbagai IDE seperti Jupyter Notebook, Spyder, Anaconda prompt, dll. Oleh karena itu, Anaconda adalah solusi paket yang sangat nyaman yang dapat Anda unduh dan instal dengan mudah di komputer Anda. Anaconda secara otomatis akan menginstal Python dan beberapa IDE dan pustaka dasar dengannya. Di bawah ini beberapa langkah diberikan untuk menunjukkan proses pengunduhan dan pemasangan Anaconda dan IDE: [ 167 ]","Step- 2: Install Anaconda Python (Python 3.7 version): [ 168 ]","[ 169 ]","[ 170 ]","Step- 3: Buka Anaconda Navigator [ 171 ]","Pilih spyder 3.3.3 Tulis program pertama Anda, dan simpan menggunakan ekstensi .py Jalankan program menggunakan tombol Run segitiga. Anda dapat memeriksa keluaran program di panel konsol di sisi kanan bawah. [ 172 ]","[ 173 ]","Biografi Penulis Ali Mulyanto, Lahir di Bantul pada tanggal 29 Mei 1975. Saat ini sebagai Dosen Tetap Prodi Teknik Informatika Universitas Panca Sakti Bekasi. Mulai aktif mengajar tahun 2007. Menamatkan Pendidikan S1 di STMIK Muhammadiyah Jakarta tahan 2007, dan Lulus S2 tahun 2016 di jurusan Teknik Informatika STMIK Eresha. Email: [email protected], blog: h p:\/\/www.alimulyantonet.wordpress.com Nopiyanto, Lahir di Bekasi pada tanggal 20 November 1992. Saat ini sebagai Dosen Tetap Prodi Manajemen Informatika Universitas Panca Sakti Bekasi. Mulai aktif mengajar tahun 20. Menamatkan Pendidikan S1 di STMIK Muhammadiyah Jakarta tahan 2019, dan Lulus S2 tahun 2019 di jurusan Teknik Informatika President University. Tukino, lahir di Wonogiri pada tanggal 23 Maret 1968, saat ini penulis sebagai Dosen tetap di Prodi Sistem Informasi, Fakultas Ilmu Komputer, Universitas Buana Perjuangan Karaang. Riwayat Pendidikan Formal, Penulis Kuliah S1, Lulus Tahun 1968 dan S2, Lulus Tahun 2000 Jurusan Sistem Informasi di Universitas Gunadarma [ 174 ]","[ 175 ]"]
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