Kursus lengkap dalam bahasa Rusia dapat ditemukan di
tautan ini .
Kursus bahasa Inggris asli tersedia di
tautan ini .
Kuliah baru dijadwalkan setiap 2-3 hari.Wawancara dengan Sebastian
- Jadi, kita kembali dengan Sebastian di bagian ketiga dari kursus ini. Sebastian, saya tahu Anda telah melakukan banyak pengembangan menggunakan jaringan saraf convolutional. Bisakah Anda memberi tahu kami sedikit lebih banyak tentang jaringan ini dan apa itu? Saya yakin bahwa siswa kursus kami akan mendengarkan dengan minat yang tidak kalah, karena pada bagian ini mereka harus mengembangkan jaringan saraf convolutional sendiri.
- Hebat! Jadi, jaringan saraf convolutional adalah cara yang bagus untuk struktur dalam jaringan, untuk membangun apa yang disebut invarian (alokasi fitur yang tidak dapat diubah). Misalnya, ambil ide pengenalan pola di atas panggung atau foto, Anda ingin memahami apakah Sebastian digambarkan atau tidak. Tidak masalah di bagian mana dari foto saya berada, di mana kepala saya berada - di tengah foto atau di sudut. Pengenalan kepala saya, wajah saya harus terjadi terlepas dari di mana mereka berada dalam gambar. Ini adalah invarian, variabilitas lokasi, yang diwujudkan oleh jaringan saraf convolutional.
- Sangat menarik! Bisakah Anda memberi tahu kami tugas utama di mana jaringan saraf convolutional digunakan?
- Jaringan saraf convolutional cukup digunakan ketika bekerja dengan audio dan video, termasuk gambar medis. Mereka juga digunakan dalam teknologi bahasa, di mana spesialis menggunakan pembelajaran mendalam untuk memahami dan mereproduksi konstruksi bahasa. Bahkan, ada banyak aplikasi untuk teknologi ini, saya bahkan akan mengatakan bahwa itu tidak ada habisnya! Teknologinya dapat digunakan dalam bidang keuangan dan bidang lainnya.
"Saya menggunakan jaringan saraf convolutional untuk menganalisis gambar satelit."
- Hebat! Tugas standar!
- Bagaimana menurut Anda, dapatkah kita menganggap jaringan saraf convolutional sebagai sesuatu alat terakhir dan paling maju dalam pengembangan pembelajaran yang mendalam?
- Ha! Saya sudah belajar untuk tidak pernah mengatakan tidak pernah. Akan selalu ada sesuatu yang baru dan luar biasa!
"Jadi kita masih punya pekerjaan yang harus dilakukan?" :)
- Akan ada cukup banyak pekerjaan!
- Luar biasa! Dalam kursus ini, kami hanya mengajar pionir pembelajaran mesin di masa depan. Apakah Anda memiliki keinginan untuk siswa kami sebelum mereka mulai membangun jaringan saraf convolutional pertama mereka?
- Ini fakta menarik untukmu. Jaringan saraf convolutional ditemukan pada tahun 1989, dan ini sudah lama sekali! Sebagian besar dari Anda bahkan tidak dilahirkan pada waktu itu, yang berarti bahwa itu bukan kejeniusan dari algoritma yang penting, tetapi data yang beroperasi pada algoritma tersebut. Kita hidup di dunia di mana ada banyak data untuk dianalisis dan dicari pola. Kami memiliki kemampuan untuk meniru fungsi pikiran manusia menggunakan data dalam jumlah besar ini. Ketika Anda bekerja pada jaringan saraf convolutional, cobalah untuk fokus pada menemukan data yang tepat dan menerapkannya - lihat apa yang terjadi dan kadang-kadang bisa berubah menjadi sihir nyata, seperti halnya dalam kasus kami ketika kami sedang memecahkan masalah mendeteksi kanker kulit.
- Hebat! Baiklah, mari kita turun ke sihir!
Pendahuluan
Dalam pelajaran terakhir, kami belajar bagaimana mengembangkan jaringan saraf yang dalam yang dapat mengklasifikasikan gambar elemen pakaian dari kumpulan data Fashion MNIST.

Hasil yang kami raih saat bekerja di jaringan saraf sangat mengesankan - akurasi klasifikasi 88%. Dan ini ada dalam beberapa baris kode (tidak memperhitungkan grafik dan kode konstruksi gambar)!
model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28, 1)), tf.keras.layers.Dense(128, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax) ])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
NUM_EXAMPLES = 60000 train_dataset = train_dataset.repeat().shuffle(NUM_EXAMPLES).batch(32) test_dataset = test_dataset.batch(32)
model.fit(train_dataset, epochs=5, steps_per_epoch=math.ceil(num_train_examples/32))
test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test_examples/32)) print(': ', test_accuracy)
: 0.8782
Kami juga bereksperimen dengan efek dari jumlah neuron di lapisan tersembunyi dan jumlah iterasi pelatihan pada keakuratan model. Tetapi bagaimana kita membuat model ini menjadi lebih baik dan lebih akurat? Salah satu cara untuk mencapai ini adalah dengan menggunakan jaringan saraf convolutional, disingkat SNA. SNA menunjukkan akurasi yang lebih besar dalam menyelesaikan masalah klasifikasi gambar daripada jaringan saraf yang terhubung sepenuhnya standar yang kami temui di kelas sebelumnya. Karena alasan inilah SNA menjadi sangat populer dan itu berkat mereka bahwa terobosan teknologi di bidang visi mesin menjadi mungkin.
Dalam pelajaran ini, kita akan belajar betapa mudahnya mengembangkan classifier SNA dari awal menggunakan TensorFlow dan Keras. Kami akan menggunakan dataset Fashion MNIST yang sama yang kami gunakan dalam pelajaran sebelumnya. Pada akhir pelajaran ini, kami membandingkan keakuratan klasifikasi elemen pakaian dari jaringan saraf sebelumnya dengan jaringan saraf convolutional dari pelajaran ini.
Sebelum Anda terjun ke dalam pengembangan, ada baiknya sedikit lebih jauh ke dalam prinsip kerja jaringan saraf convolutional.
Dua konsep dasar dalam jaringan saraf convolutional:
- konvolusi
- operasi subsampling (pooling, max pooling)
Mari kita lihat lebih dekat.
Konvolusi
Dalam bagian pelajaran ini, kita akan belajar teknik yang disebut konvolusi. Mari kita lihat cara kerjanya.
Ambil gambar dalam nuansa abu-abu dan, misalnya, bayangkan bahwa dimensinya 6 px dan lebar 6 px.

Komputer kami menginterpretasikan gambar sebagai array piksel dua dimensi. Karena gambar kami dalam nuansa abu-abu, nilai setiap piksel akan berada dalam kisaran 0 hingga 255. 0 - hitam, 255 - putih.
Pada gambar di bawah ini kita melihat representasi dari gambar 6px x 6px dan nilai piksel yang sesuai:

Seperti yang sudah Anda ketahui, sebelum bekerja dengan gambar, Anda harus menormalkan nilai piksel - membawa nilai ke interval dari 0 hingga 1. Namun, dalam contoh ini, untuk kemudahan penjelasan, kami akan menyimpan nilai piksel gambar dan tidak akan menormalkannya.
Inti dari konvolusi adalah untuk membuat set nilai lain, yang disebut kernel atau filter. Contohnya dapat dilihat pada gambar di bawah ini - matriks 3 x 3:

Kemudian kita dapat memindai gambar kita menggunakan kernel. Dimensi gambar kami adalah 6x6px, dan inti adalah 3x3px. Lapisan convolutional diterapkan ke inti dan setiap bagian dari gambar input.
Mari kita bayangkan bahwa kita ingin berbelit-belit di atas piksel dengan nilai 25 (3 baris, 3 kolom) dan hal pertama yang perlu dilakukan adalah memusatkan inti di atas piksel ini:

Pada gambar, penempatan inti disorot dengan warna kuning. Sekarang kita hanya akan melihat nilai-nilai piksel yang ada dalam persegi panjang kuning kami, yang ukurannya sesuai dengan ukuran inti konvolusi kami.
Sekarang kita ambil nilai piksel dari gambar dan kernel, gandakan setiap piksel gambar dengan piksel kernel yang sesuai dan tambahkan semua nilai produk, dan tetapkan nilai piksel yang dihasilkan ke gambar baru.



Kami melakukan operasi serupa dengan semua piksel di gambar kami. Tetapi apa yang harus terjadi pada piksel di perbatasan?

Ada beberapa solusi. Pertama, kita bisa mengabaikan piksel ini, tetapi dalam kasus ini kita akan kehilangan informasi tentang gambar, yang mungkin berubah menjadi signifikan, dan gambar yang diperkecil akan menjadi lebih kecil dari aslinya. Kedua, kita cukup "membunuh" dengan nilai nol piksel yang nilai intinya berada di luar cakupan gambar. Proses ini disebut perataan.

Sekarang kita telah membuat perataan dengan nilai-nilai nol piksel, kita dapat menghitung nilai dari piksel akhir dalam gambar yang diperkecil seperti sebelumnya.
Konvolusi adalah proses penerapan inti (filter) ke setiap bagian dari gambar input, dengan analogi dengan lapisan yang terhubung penuh (lapisan padat), kita akan melihat bahwa konvolusi adalah lapisan yang sama dalam Keras.
Sekarang mari kita lihat konsep kedua dari jaringan syaraf convolutional - operasi subsampling (penyatuan, penyatuan maksimum).
Operasi subsampling (pooling, max-pooling)
Sekarang kita akan mempertimbangkan konsep dasar kedua yang mendasari jaringan saraf convolutional - operasi subsampling (penyatuan, penyatuan maksimum). Dengan kata sederhana, operasi subsampling adalah proses mengompresi (perampingan) gambar dengan menambahkan nilai blok piksel. Mari kita lihat bagaimana ini bekerja pada contoh nyata.

Untuk melakukan operasi subsampling, kita perlu memutuskan dua komponen dari proses ini - ukuran sampel (ukuran kotak persegi panjang) dan ukuran langkah. Dalam contoh ini, kita akan menggunakan kisi-kisi persegi panjang 3x3 dan langkah 3. Langkah ini menentukan jumlah piksel di mana kisi-kisi persegi panjang harus digeser saat melakukan operasi subsampling.
Setelah kami memutuskan ukuran kisi dan ukuran langkah, kami perlu menemukan nilai piksel maksimum yang masuk ke kisi yang dipilih. Dalam contoh di atas, nilai 1, 0, 4, 8, 2, 5, 20, 13, 25 jatuh ke dalam kisi.Nilai maksimum adalah 25. Nilai ini "ditransfer" ke gambar baru. Kotak digeser 3 piksel ke kanan dan proses memilih nilai maksimum dan mentransfernya ke gambar baru diulang.

Akibatnya, gambar yang lebih kecil akan diperoleh dibandingkan dengan gambar input asli. Dalam contoh kita, gambar diperoleh setengah dari ukuran gambar asli kita. Ukuran gambar akhir akan bervariasi tergantung pada pilihan ukuran kotak persegi panjang dan ukuran langkah.
Mari kita lihat bagaimana ini akan bekerja dengan Python!
Ringkasan
Kami menjadi akrab dengan konsep-konsep seperti konvolusi dan operasi max-pooling.
Konvolusi adalah proses menerapkan filter ("inti") ke gambar. Pengoperasian subsampling dengan nilai maksimum adalah proses mengurangi ukuran gambar dengan menggabungkan sekelompok piksel menjadi nilai maksimum tunggal dari grup ini.
Seperti yang akan kita lihat di bagian praktis, lapisan konvolusional dapat ditambahkan ke jaringan saraf menggunakan lapisan
Conv2D
di Keras. Lapisan ini mirip dengan lapisan Padat, dan berisi bobot dan offset yang mengalami optimasi (pemilihan). Lapisan
Conv2D
juga mengandung filter ("kernel"), yang nilainya juga dioptimalkan. Jadi, di lapisan
Conv2D
, nilai-nilai di dalam matriks filter adalah variabel yang mengalami optimasi.
Beberapa istilah yang berhasil kami temui:
- SNS - jaringan saraf convolutional. Jaringan saraf yang mengandung setidaknya satu lapisan konvolusional. SNA tipikal berisi lapisan lain, seperti lapisan sampel dan lapisan yang terhubung penuh.
- Konvolusi adalah proses menerapkan filter ("inti") ke gambar.
- Filter (inti) adalah matriks yang ukurannya lebih kecil dari data input, yang dimaksudkan untuk mengkonversi data input dalam blok.
- Alignment adalah proses menambahkan, paling sering nilai nol, ke tepi gambar.
- Operasi subsampling adalah proses mengurangi ukuran gambar melalui pengambilan sampel. Ada beberapa jenis lapisan sub-sampel, misalnya, lapisan rata-rata sub-sampel (sampel nilai rata-rata), namun demikian, sub-sampel dengan nilai maksimum paling sering digunakan.
- Sub-sampel dengan nilai maksimum adalah proses sub-sampel, di mana banyak nilai dikonversi menjadi nilai tunggal - maksimum di antara sampel.
- Langkah - jumlah piksel perpindahan oleh filter (inti) pada gambar.
- Sampling (downsampling) - proses mengurangi ukuran gambar.
CoLab: klasifikasi elemen pakaian Fashion MNIST menggunakan jaringan saraf convolutional
Kami dilingkari dengan jari! Masuk akal untuk melakukan bagian praktis ini hanya setelah bagian
sebelumnya selesai - semua kode, kecuali satu blok, tetap sama. Struktur jaringan saraf kita sedang berubah, dan ini adalah empat baris tambahan untuk lapisan saraf convolutional dan lapisan subsampling pada nilai maksimum (max-pooling).
model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, (3,3), padding='same', activation=tf.nn.relu, input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D((2, 2), strides=2), tf.keras.layers.Conv2D(64, (3,3), padding='same', activation=tf.nn.relu), tf.keras.layers.MaxPooling2D((2, 2), strides=2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax) ])
Semua penjelasan terperinci tentang cara kerja, mereka berjanji untuk memberi kita di bagian selanjutnya - 4 bagian.
Oh ya Keakuratan model pada tahap pelatihan menjadi sama dengan 97% (model "dilatih kembali" pada
epochs=10
), dan ketika menjalankan set data untuk tes, itu menunjukkan persis 91%. Peningkatan akurasi yang terlihat relatif terhadap arsitektur sebelumnya, di mana kami hanya menggunakan lapisan yang sepenuhnya terhubung - 88%.
Ringkasan
Dalam bagian pelajaran ini, kami mempelajari jenis baru dari jaringan saraf - jaringan saraf convolutional. Kami menjadi akrab dengan istilah-istilah seperti "konvolusi" dan "operasi max-pooling", mengembangkan dan melatih jaringan saraf convolutional dari awal. Sebagai hasilnya, kami melihat bahwa jaringan saraf convolutional kami menghasilkan akurasi lebih dari jaringan saraf yang kami kembangkan dalam pelajaran terakhir.
Catatan PS dari penulis terjemahan.
Kursus ini disebut "Pengantar pembelajaran mendalam menggunakan TensorFlow", jadi kami tidak akan mengeluh tentang kurangnya penjelasan rinci tentang prinsip jaringan saraf convolutional (lapisan) - dua artikel berikutnya akan tentang prinsip operasi jaringan saraf convolutional dan struktur internal mereka (Artikel tidak berhubungan dengan kursus, tetapi direkomendasikan oleh peserta StackOverflow untuk pemahaman yang lebih baik tentang apa yang terjadi).
... dan ajakan bertindak standar - daftar, beri nilai tambah, dan bagikan :)
YouTubeTelegramVKontakte