Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Beberapa bulan yang lalu, rakan sekerja kami daripada Google dibelanjakan pada Kaggle pertandingan untuk mencipta pengelas untuk imej yang diperoleh dalam sensasi permainan "Cepat, Lukis!" Pasukan itu, termasuk pemaju Yandex Roman Vlasov, mengambil tempat keempat dalam pertandingan itu. Pada latihan pembelajaran mesin Januari, Roman berkongsi idea pasukannya, pelaksanaan terakhir pengelas dan amalan menarik lawannya.


- Hai semua! Nama saya Roma Vlasov, hari ini saya akan memberitahu anda tentang Quick, Draw! Cabaran Pengiktirafan Doodle.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Terdapat lima orang dalam pasukan kami. Saya menyertai sebelum tarikh akhir penggabungan. Kami tidak bernasib baik, kami digoncang sedikit, tetapi kami digoncang dari kedudukan wang, dan mereka digoncang dari kedudukan emas. Dan kami mendapat tempat keempat yang terhormat.

(Semasa pertandingan, pasukan memerhatikan diri mereka dalam penilaian, yang dibentuk berdasarkan keputusan yang ditunjukkan pada satu bahagian set data yang dicadangkan. Penarafan akhir, seterusnya, dibentuk pada bahagian lain set data. Ini dilakukan sedemikian bahawa peserta pertandingan tidak melaraskan algoritma mereka kepada data tertentu. Oleh itu, pada peringkat akhir, apabila bertukar antara penilaian, kedudukan bergegar sedikit (dari bahasa Inggeris goncang - untuk bercampur): pada data lain, hasilnya mungkin berubah berbeza. Pasukan Roman berada di tempat pertama dalam tiga teratas. Dalam kes ini, tiga teratas ialah wang, zon penarafan kewangan, kerana hanya tiga tempat pertama dianugerahkan hadiah wang tunai. Selepas rombakan, pasukan itu sudah pun berada dalam tempat keempat. Dengan cara yang sama, pasukan lain kehilangan kemenangan, kedudukan emas. - Ed.)

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Persaingan itu juga penting kerana Evgeniy Babakhnin menerima grandmaster, Ivan Sosin menerima tuan, Roman Soloviev kekal sebagai grandmaster, Alex Parinov menerima tuan, saya menjadi pakar, dan sekarang saya sudah menjadi tuan.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Apa ini Pantas, Draw? Ini adalah perkhidmatan daripada Google. Google mempunyai matlamat untuk mempopularkan AI dan dengan perkhidmatan ini ingin menunjukkan cara rangkaian saraf berfungsi. Anda pergi ke sana, klik Mari lukis, dan halaman baharu muncul di mana anda diberitahu: lukis zigzag, anda mempunyai 20 saat untuk melakukan ini. Anda cuba melukis zigzag dalam 20 saat, seperti di sini, sebagai contoh. Jika anda berjaya, rangkaian mengatakan ia adalah zigzag dan anda teruskan. Terdapat hanya enam gambar sedemikian.

Jika rangkaian Google gagal mengecam perkara yang anda lukis, salib diletakkan pada tugas itu. Nanti saya akan beritahu anda apa maksudnya pada masa hadapan sama ada lukisan itu diiktiraf oleh rangkaian atau tidak.

Perkhidmatan ini mengumpulkan bilangan pengguna yang agak besar, dan semua gambar yang dilukis oleh pengguna telah direkodkan.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Kami berjaya mengumpul hampir 50 juta imej. Dari sini, kereta api dan tarikh ujian untuk pertandingan kami dibentuk. Dengan cara ini, jumlah data dalam ujian dan bilangan kelas diserlahkan dalam huruf tebal atas sebab tertentu. Saya akan memberitahu anda tentang mereka sedikit kemudian.

Format data adalah seperti berikut. Ini bukan hanya imej RGB, tetapi, secara kasarnya, log semua yang dilakukan pengguna. Word ialah sasaran kami, kod negara ialah tempat pengarang coretan itu berasal, cap masa ialah masa. Label yang diiktiraf hanya menunjukkan sama ada rangkaian mengenali imej daripada Google atau tidak. Dan lukisan itu sendiri adalah urutan, anggaran lengkung yang dilukis oleh pengguna dengan mata. Dan masa. Ini adalah masa dari mula melukis gambar.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Data dibentangkan dalam dua format. Ini adalah format pertama, dan yang kedua dipermudahkan. Mereka memotong masa dari sana dan menganggarkan set mata ini dengan set mata yang lebih kecil. Untuk ini mereka gunakan Algoritma Douglas-Pecker. Anda mempunyai set mata yang besar yang hanya menghampiri garis lurus, tetapi sebenarnya anda boleh menganggarkan garis ini dengan hanya dua mata. Ini adalah idea algoritma.

Data telah diedarkan seperti berikut. Segala-galanya seragam, tetapi ada beberapa yang terpencil. Apabila kami menyelesaikan masalah, kami tidak melihatnya. Perkara utama ialah tiada kelas yang sangat sedikit, kami tidak perlu melakukan pensampel berwajaran dan pensampelan data yang berlebihan.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Apakah rupa gambar tersebut? Ini ialah kelas "kapal terbang" dan contoh daripadanya dengan label yang diiktiraf dan tidak diiktiraf. Nisbah mereka adalah sekitar 1 hingga 9. Seperti yang anda lihat, datanya agak bising. Saya rasa ia adalah kapal terbang. Jika anda melihat tidak dikenali, dalam kebanyakan kes ia hanya bunyi bising. Seseorang juga cuba menulis "kapal terbang," tetapi nampaknya dalam bahasa Perancis.

Kebanyakan peserta hanya mengambil grid, menarik data daripada jujukan baris ini sebagai gambar RGB, dan melemparkannya ke dalam rangkaian. Saya melukis dengan cara yang lebih kurang sama: Saya mengambil palet warna, melukis baris pertama dengan satu warna, yang berada di permulaan palet ini, baris terakhir dengan yang lain, yang berada di hujung palet, dan di antara mereka Saya interpolasi di mana-mana menggunakan palet ini. Dengan cara ini, ini memberikan hasil yang lebih baik daripada jika anda melukis seperti pada slaid pertama - hanya dalam warna hitam.

Ahli pasukan lain, seperti Ivan Sosin, mencuba pendekatan yang sedikit berbeza untuk melukis. Dengan satu saluran dia hanya melukis gambar kelabu, dengan saluran lain dia melukis setiap lejang dengan kecerunan dari awal hingga akhir, dari 32 hingga 255, dan dengan saluran ketiga dia melukis kecerunan pada semua lejang dari 32 hingga 255.

Satu lagi perkara yang menarik ialah Alex Parinov memuat naik maklumat ke rangkaian menggunakan kod negara.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Metrik yang digunakan dalam pertandingan ialah Ketepatan Purata Purata. Apakah intipati metrik ini untuk persaingan? Anda boleh memberikan tiga ramalan, dan jika tiada ramalan yang betul dalam ketiga-tiga ini, maka anda mendapat 0. Jika ada yang betul, maka susunannya diambil kira. Dan hasil sasaran akan dikira sebagai 1 dibahagikan dengan susunan ramalan anda. Sebagai contoh, anda membuat tiga peramal, dan yang betul ialah yang pertama, kemudian anda membahagi 1 dengan 1 dan mendapat 1. Jika peramal itu betul dan susunannya ialah 2, kemudian bahagikan 1 dengan 2, anda mendapat 0,5. Nah, dll.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Dengan prapemprosesan data - cara melukis gambar dan sebagainya - kami telah memutuskan sedikit. Apakah seni bina yang kami gunakan? Kami cuba menggunakan seni bina gemuk seperti PNASNet, SENet, dan seni bina yang sudah klasik seperti SE-Res-NeXt, mereka semakin memasuki pertandingan baharu. Terdapat juga ResNet dan DenseNet.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Bagaimana kami mengajar ini? Semua model yang kami ambil telah dilatih di imagenet. Walaupun terdapat banyak data, 50 juta imej, tetapi tetap, jika anda mengambil rangkaian pra-latihan pada imagenet, ia menunjukkan hasil yang lebih baik daripada jika anda hanya melatihnya dari awal.

Apakah teknik pengajaran yang kami gunakan? Ini ialah Cosing Annealing dengan Warm Restart, yang akan saya bincangkan kemudian. Ini adalah teknik yang saya gunakan dalam hampir semua pertandingan saya baru-baru ini, dan dengan mereka ternyata melatih grid dengan baik, untuk mencapai minimum yang baik.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Seterusnya Kurangkan Kadar Pembelajaran di Dataran Tinggi. Anda mula melatih rangkaian, menetapkan kadar pembelajaran tertentu, terus mengajarnya, dan kerugian anda secara beransur-ansur menumpu kepada nilai tertentu. Anda menyemak ini, sebagai contoh, selama sepuluh zaman kerugian tidak berubah sama sekali. Anda mengurangkan kadar pembelajaran anda dengan beberapa nilai dan teruskan belajar. Ia turun sedikit lagi, menumpu pada tahap minimum, dan anda sekali lagi menurunkan kadar pembelajaran, dan seterusnya, sehingga rangkaian anda akhirnya menumpu.

Seterusnya ialah teknik yang menarik: Jangan mereputkan kadar pembelajaran, tambahkan saiz kumpulan. Terdapat artikel dengan nama yang sama. Apabila anda melatih rangkaian, anda tidak perlu mengurangkan kadar pembelajaran, anda hanya boleh meningkatkan saiz kelompok.

Teknik ini, dengan cara ini, digunakan oleh Alex Parinov. Dia bermula dengan kumpulan yang sama dengan 408, dan apabila rangkaiannya mencapai dataran tinggi, dia hanya menggandakan saiz kelompok, dsb.

Sebenarnya, saya tidak ingat nilai yang dicapai oleh saiz kelompoknya, tetapi apa yang menarik ialah terdapat pasukan di Kaggle yang menggunakan teknik yang sama, saiz kelompok mereka adalah kira-kira 10000. Sebenarnya, rangka kerja moden untuk pembelajaran mendalam, seperti PyTorch, sebagai contoh, membolehkan anda melakukan ini dengan mudah. Anda menjana kumpulan anda dan menyerahkannya kepada rangkaian bukan seperti sedia ada, secara keseluruhannya, tetapi membahagikannya kepada beberapa bahagian supaya ia sesuai dengan kad video anda, hitung kecerunan, dan selepas anda mengira kecerunan untuk keseluruhan kumpulan, kemas kini berat.

Ngomong-ngomong, saiz kelompok besar masih disertakan dalam pertandingan ini, kerana datanya agak bising, dan saiz kelompok besar membantu anda menganggarkan kecerunan dengan lebih tepat.

Pelabelan pseudo juga digunakan, kebanyakannya digunakan oleh Roman Soloviev. Dia mengambil sampel kira-kira separuh data daripada ujian dalam kelompok, dan melatih grid pada kelompok tersebut.

Saiz gambar itu penting, tetapi hakikatnya anda mempunyai banyak data, anda perlu berlatih untuk masa yang lama, dan jika saiz gambar anda agak besar, maka anda akan berlatih untuk masa yang sangat lama. Tetapi ini tidak banyak menambahkan kualiti pengelas akhir anda, jadi ia patut menggunakan beberapa jenis pertukaran. Dan kami hanya mencuba gambar yang tidak begitu besar saiznya.

Bagaimana semua itu dipelajari? Pertama, gambar bersaiz kecil diambil, beberapa zaman dijalankan pada mereka, ini mengambil masa yang agak lama. Kemudian gambar bersaiz besar diberikan, rangkaian dilatih, kemudian lebih banyak lagi, supaya tidak melatihnya dari awal dan tidak membuang banyak masa.

Mengenai pengoptimum. Kami menggunakan SGD dan Adam. Dengan cara ini adalah mungkin untuk mendapatkan model tunggal, yang memberikan kelajuan 0,941-0,946 pada papan pendahulu awam, yang agak baik.

Jika anda menggabungkan model dalam beberapa cara, anda akan mendapat sekitar 0,951. Jika anda menggunakan satu lagi teknik, anda akan mendapat markah akhir 0,954 di papan awam, sama seperti yang kami dapat. Tetapi lebih lanjut mengenai itu kemudian. Seterusnya saya akan memberitahu anda bagaimana kami memasang model, dan bagaimana kami berjaya mencapai kelajuan akhir sedemikian.

Seterusnya saya ingin bercakap tentang Cosing Annealing dengan Mulakan Semula Hangat atau Penurunan Kecerunan Stokastik dengan Mulakan Semula Hangat. Secara kasarnya, pada dasarnya, anda boleh menggunakan mana-mana pengoptimum, tetapi intinya adalah ini: jika anda hanya melatih satu rangkaian dan secara beransur-ansur ia menumpu ke tahap minimum, maka semuanya baik-baik saja, anda akan mendapat satu rangkaian, ia membuat kesilapan tertentu, tetapi anda boleh melatihnya sedikit berbeza. Anda akan menetapkan beberapa kadar pembelajaran awal, dan menurunkannya secara beransur-ansur mengikut formula ini. Anda menurunkannya, rangkaian anda mencapai tahap minimum, kemudian anda menyimpan pemberat, dan sekali lagi menetapkan kadar pembelajaran yang berada pada permulaan latihan, dengan itu pergi ke suatu tempat ke atas daripada minimum ini, dan sekali lagi menurunkan kadar pembelajaran anda.

Oleh itu, anda boleh melawati beberapa minimum sekaligus, di mana kerugian anda adalah, tambah atau tolak, sama. Tetapi hakikatnya ialah rangkaian dengan pemberat ini akan memberikan ralat yang berbeza pada tarikh anda. Dengan membuat puratanya, anda akan mendapat beberapa jenis anggaran, dan kelajuan anda akan menjadi lebih tinggi.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Mengenai cara kami memasang model kami. Pada permulaan pembentangan, saya berkata untuk memberi perhatian kepada jumlah data dalam ujian dan bilangan kelas. Jika anda menambah 1 kepada bilangan sasaran dalam set ujian dan membahagikan dengan bilangan kelas, anda akan mendapat nombor 330, dan ini telah ditulis di forum - bahawa kelas dalam ujian adalah seimbang. Ini boleh digunakan.

Berdasarkan ini, Roman Soloviev menghasilkan metrik, kami memanggilnya Skor Proksi, yang berkait rapat dengan papan pendahulu. Intinya ialah: anda membuat ramalan, ambil 1 teratas peramal anda dan kira bilangan objek untuk setiap kelas. Seterusnya, tolak 330 daripada setiap nilai dan tambahkan nilai mutlak yang terhasil.

Nilai berikut diperolehi. Ini membantu kami untuk tidak membuat papan pendahulu yang menyiasat, tetapi untuk mengesahkan secara tempatan dan memilih pekali untuk kumpulan kami.

Dengan ensemble anda boleh mendapatkan kelajuan sedemikian. Apa lagi yang boleh saya lakukan? Katakan anda menggunakan maklumat bahawa kelas dalam ujian anda adalah seimbang.

Pengimbangan adalah berbeza. Contoh salah satunya β€” mengimbangi daripada lelaki yang menduduki tempat pertama.

Apa yang kami buat? Pengimbangan kami agak mudah, ia dicadangkan oleh Evgeny Babakhnin. Kami mula-mula mengisih ramalan kami mengikut 1 teratas dan memilih calon daripada mereka - supaya bilangan kelas tidak melebihi 330. Tetapi untuk sesetengah kelas, anda mempunyai kurang daripada 330 peramal. Okey, mari kita susun juga mengikut 2 teratas dan 3 teratas , dan kami juga akan memilih calon.

Bagaimanakah pengimbangan kami berbeza daripada pengimbangan tempat pertama? Mereka menggunakan pendekatan berulang, mengambil kelas paling popular dan mengurangkan kebarangkalian untuk kelas itu dengan beberapa bilangan kecil sehingga kelas itu tidak lagi paling popular. Kami mengambil kelas paling popular seterusnya. Jadi mereka terus menurunkannya sehingga bilangan semua kelas menjadi sama.

Semua orang menggunakan pendekatan tambah atau tolak satu untuk melatih rangkaian, tetapi tidak semua orang menggunakan pengimbangan. Menggunakan pengimbangan, anda boleh pergi ke emas, dan jika anda bernasib baik, kemudian ke dalam wang.

Bagaimana untuk praproses tarikh? Semua orang memproses tarikh, tambah atau tolak, dengan cara yang sama - membuat ciri buatan tangan, cuba mengekod pemasaan dengan warna strok yang berbeza, dll. Alexey Nozdrin-Plotnitsky, yang menduduki tempat ke-8, bercakap tentang perkara ini.

Klasifikasi lukisan tulisan tangan. Laporkan dalam Yandex

Dia melakukannya secara berbeza. Dia berkata bahawa semua ciri buatan tangan anda ini tidak berfungsi, anda tidak perlu berbuat demikian, rangkaian anda harus mempelajari semua ini sendiri. Sebaliknya, dia menghasilkan modul pembelajaran yang mempraproses data anda. Dia melemparkan data asal ke dalamnya tanpa prapemprosesan - titik koordinat dan pemasaan.

Kemudian dia mengambil perbezaan berdasarkan koordinat, dan purata semuanya berdasarkan pemasaan. Dan dia menghasilkan matriks yang agak panjang. Dia menggunakan lilitan 1D beberapa kali untuk mendapatkan matriks bersaiz 64xn, di mana n ialah jumlah bilangan mata, dan 64 dibuat untuk menyuapkan matriks yang terhasil ke lapisan mana-mana rangkaian konvolusi, yang menerima bilangan saluran - 64. dia memperoleh matriks 64xn, maka daripada ini adalah perlu untuk mencipta tensor beberapa saiz supaya bilangan saluran adalah sama dengan 64. Dia menormalkan semua titik X, Y dalam julat dari 0 hingga 32 untuk mencipta satu tensor bersaiz 32x32. Saya tidak tahu mengapa dia mahu 32x32, ia berlaku begitu sahaja. Dan pada koordinat ini dia meletakkan serpihan matriks bersaiz 64xn ini. Jadi ia hanya berakhir dengan tensor 32x32x64 yang boleh anda letakkan lebih jauh ke dalam rangkaian saraf konvolusi anda. Itu sahaja yang saya ingin katakan.

Sumber: www.habr.com

Tambah komen