Arsitektur CNN untuk regresi?

32

Saya telah mengerjakan masalah regresi di mana inputnya adalah gambar, dan labelnya adalah nilai kontinu antara 80 dan 350. Gambar-gambar tersebut dari beberapa bahan kimia setelah reaksi berlangsung. Warna yang muncul menunjukkan konsentrasi bahan kimia lain yang tersisa, dan itulah yang dihasilkan model - konsentrasi bahan kimia itu. Gambar dapat diputar, dibalik, dicerminkan, dan output yang diharapkan harus tetap sama. Analisis semacam ini dilakukan di laboratorium nyata (mesin yang sangat khusus menghasilkan konsentrasi bahan kimia menggunakan analisis warna seperti saya melatih model ini untuk dilakukan).

Sejauh ini saya hanya bereksperimen dengan model yang secara kasar didasarkan pada VGG (beberapa urutan blok konv-konv-konv-pool). Sebelum bereksperimen dengan arsitektur yang lebih baru (Inception, ResNets, dll.), Saya pikir saya akan meneliti apakah ada arsitektur lain yang lebih umum digunakan untuk regresi menggunakan gambar.

Dataset terlihat seperti ini:

masukkan deskripsi gambar di sini

Dataset berisi sekitar 5.000 sampel 250x250, yang telah saya ubah ukurannya menjadi 64x64 sehingga pelatihan lebih mudah. Setelah saya menemukan arsitektur yang menjanjikan, saya akan bereksperimen dengan gambar beresolusi lebih besar.

Sejauh ini, model terbaik saya memiliki kesalahan kuadrat rata-rata pada kedua set pelatihan dan validasi sekitar 0,3, yang jauh dari dapat diterima dalam kasus penggunaan saya.

Model terbaik saya sejauh ini terlihat seperti ini:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

Pertanyaan

Apa arsitektur yang sesuai untuk output regresi dari input gambar?

Edit

Saya telah mengulangi penjelasan saya dan menghapus keakuratan.

Edit 2

Saya telah merestrukturisasi pertanyaan saya jadi semoga jelas apa yang saya cari

rodrigo-silveira
sumber
4
Akurasi bukan ukuran yang dapat langsung diterapkan pada masalah regresi. Apa maksud Anda ketika Anda mengatakan keakuratan Anda adalah 30%? Akurasi benar-benar hanya berlaku untuk tugas klasifikasi, bukan regresi.
Nuklir Wang
1
Apa yang Anda maksud dengan "memprediksi dengan benar 30% dari waktu" ? Apakah Anda benar-benar melakukan regresi?
Firebug
1
Mengapa Anda menyebutnya regresi masalah? Apakah Anda tidak mencoba untuk mengklasifikasikan ke label? apakah label itu kardinal?
Aksakal
2
Saya tidak ingin hal yang sama persis seperti vgg. Saya melakukan sesuatu yang mirip vgg, artinya serangkaian konvoi yang diikuti oleh max pooling, diikuti oleh yang sepenuhnya terhubung. Sepertinya pendekatan umum untuk bekerja dengan gambar. Tetapi sekali lagi, itulah inti dari pertanyaan awal saya. Sepertinya semua komentar ini, meskipun memberi wawasan kepada saya, benar-benar kehilangan inti dari apa yang saya tanyakan.
rodrigo-silveira
1
Selain itu, kami mungkin dapat memberikan bantuan yang lebih baik jika Anda memberikan deskripsi masalah yang lebih baik. 1) Apa gambarnya? Apa resolusi mereka? Apa hubungan antara gambar dan respons Anda, ? Apakah hubungan ini rotasi-invariant, yaitu, jika saya memutar gambar lingkaran Anda dengan sembarang sudut θ , apakah saya berharap y perubahan? 2) Apakah Anda sadar bahwa 5000 gambar untuk melatih arsitektur VGG-net adalah kesengsaraan? Sudahkah Anda menghitung jumlah parameter arsitektur Anda? Apakah ada cara Anda bisa mendapatkan lebih banyak gambar? Jika Anda tidak bisa, maka mungkin Anda perlu ...y[80,350]θy
DeltaIV

Jawaban:

42

Pertama-tama saran umum: lakukan pencarian literatur sebelum Anda mulai membuat percobaan pada topik yang tidak Anda kenal. Anda akan menghemat banyak waktu.

Dalam hal ini, melihat makalah yang ada Anda mungkin telah memperhatikannya

  1. CNN telah digunakan beberapa kali untuk regresi: ini klasik tapi sudah lama (ya, 3 tahun sudah tua di DL). Makalah yang lebih modern tidak akan menggunakan AlexNet untuk tugas ini. Ini lebih baru, tetapi untuk masalah yang jauh lebih rumit (rotasi 3D), dan lagi pula saya tidak terbiasa dengannya.
  2. Regresi dengan CNN bukan masalah sepele. Melihat lagi pada makalah pertama, Anda akan melihat bahwa mereka memiliki masalah di mana mereka pada dasarnya dapat menghasilkan data yang tak terbatas. Tujuannya adalah untuk memprediksi sudut rotasi yang diperlukan untuk memperbaiki gambar 2D. Ini berarti bahwa saya pada dasarnya dapat mengambil set pelatihan saya dan menambahnya dengan memutar setiap gambar dengan sudut yang sewenang-wenang, dan saya akan mendapatkan set pelatihan yang lebih besar dan valid. Dengan demikian masalahnya tampak relatif sederhana, sejauh masalah Deep Learning pergi. Omong-omong, perhatikan trik augmentasi data lain yang mereka gunakan:

    Kami menggunakan terjemahan (hingga 5% dari lebar gambar), penyesuaian kecerahan dalam kisaran [−0.2, 0.2], penyesuaian gamma dengan γ ∈ [−0.5, 0.1] dan kebisingan piksel Gaussian dengan standar deviasi dalam kisaran [0 , 0,02].

    k

    yxα=atan2(y,x)>11%[180°,90°],[90°,0°],[0°,90°][90°,180°][45°,45°]

    2.6%

Jadi, apa yang bisa kita pelajari dari ini? Pertama-tama, 5000 gambar itu adalah kumpulan data kecil untuk tugas Anda. Makalah pertama menggunakan jaringan yang dipretrains pada gambar yang mirip dengan yang mereka ingin belajar tugas regresi: tidak hanya Anda perlu belajar tugas yang berbeda dari yang untuk itu arsitektur dirancang (klasifikasi), tetapi set pelatihan Anda tidak sama sekali tidak seperti perangkat pelatihan yang biasanya dilatih oleh jaringan ini (CIFAR-10/100 atau ImageNet). Jadi Anda mungkin tidak akan mendapat manfaat dari transfer pembelajaran. Contoh MATLAB memiliki 5000 gambar, tetapi mereka hitam dan putih dan secara semantik semuanya sangat mirip (well, ini bisa menjadi kasus Anda juga).

Lalu, seberapa realistiskah melakukan lebih baik dari 0,3? Pertama-tama kita harus mengerti apa yang Anda maksud dengan kerugian rata-rata 0,3. Apakah maksud Anda bahwa kesalahan RMSE adalah 0,3,

1Ni=1N(h(xi)yi)2

NN<5000h(xi)xiyiyi[80,350]0.12%

Juga, coba hitung jumlah parameter di jaringan Anda: Saya sedang terburu-buru dan saya mungkin membuat kesalahan konyol, jadi tentu saja periksa kembali perhitungan saya dengan beberapa summaryfungsi dari kerangka apa pun yang mungkin Anda gunakan. Namun, kira-kira saya akan mengatakan Anda memilikinya

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(perhatikan saya melewatkan parameter dari lapisan norma batch, tapi mereka hanya 4 parameter untuk lapisan sehingga mereka tidak membuat perbedaan). Anda memiliki setengah juta parameter dan 5000 contoh ... apa yang Anda harapkan? Tentu, jumlah parameter bukan indikator yang baik untuk kapasitas jaringan saraf (ini adalah model yang tidak dapat diidentifikasi), tapi tetap saja ... Saya tidak berpikir Anda bisa melakukan jauh lebih baik dari ini, tetapi Anda dapat mencoba beberapa hal:

  • menormalkan semua input (misalnya, skala ulang intensitas RGB dari setiap piksel antara -1 dan 1, atau gunakan standardisasi) dan semua output. Ini terutama akan membantu jika Anda memiliki masalah konvergensi.
  • y
  • Data augmentation: karena Anda mengatakan flipping itu, berputar dengan sudut yang sewenang-wenang atau mirroring gambar Anda harus menghasilkan output yang sama, Anda dapat meningkatkan ukuran data Anda mengatur banyak . Perhatikan bahwa dengan dataset yang lebih besar kesalahan pada set pelatihan akan naik: apa yang kita cari di sini adalah kesenjangan yang lebih kecil antara kehilangan set pelatihan dan kehilangan set tes. Juga, jika kehilangan set pelatihan meningkat banyak, ini bisa menjadi kabar baik: itu mungkin berarti bahwa Anda dapat melatih jaringan yang lebih dalam pada set pelatihan yang lebih besar ini tanpa risiko overfitting. Coba tambahkan lebih banyak layer dan lihat apakah sekarang Anda mendapatkan set pelatihan yang lebih kecil dan uji set loss. Akhirnya, Anda bisa mencoba juga trik augmentasi data lainnya yang saya kutip di atas, jika mereka masuk akal dalam konteks aplikasi Anda.
  • y[80,97],[97,124][0,27]
  • coba gunakan arsitektur modern (Inception atau ResNet) alih-alih yang vintage. ResNet sebenarnya memiliki lebih sedikit parameter daripada VGG-net. Tentu saja, Anda ingin menggunakan ResNets kecil di sini - Saya tidak berpikir ResNet-101 dapat membantu pada set data 5.000 gambar. Anda dapat menambah banyak set data, meskipun ....
  • Karena output Anda tidak berubah- ubah , ide bagus lainnya adalah menggunakan CNN ekuivalen grup , yang outputnya (bila digunakan sebagai pengklasifikasi) tidak berubah pada rotasi diskrit , atau CNN yang dapat dikendalikanyang hasilnya tidak tetap untuk rotasi berkelanjutan. Properti invarian akan memungkinkan Anda untuk mendapatkan hasil yang baik dengan augmentasi data yang jauh lebih sedikit, atau idealnya tidak sama sekali (untuk apa yang menyangkut rotasi: tentu saja Anda masih memerlukan jenis da lainnya). CNN equivariant grup lebih matang daripada CNN yang dapat steerable dari sudut pandang implementasi, jadi saya akan mencoba grup CNNs terlebih dahulu. Anda dapat mencoba klasifikasi-kemudian-regresi, menggunakan G-CNN untuk bagian klasifikasi, atau Anda dapat bereksperimen dengan pendekatan regresi murni. Ingatlah untuk mengubah layer paling atas.
  • bereksperimen dengan ukuran batch (yeah, yeah, saya tahu peretasan hyperparameters tidak keren, tapi ini adalah yang terbaik yang bisa saya lakukan dalam kerangka waktu terbatas & gratis :-)
  • akhirnya, ada arsitektur yang telah dikembangkan secara khusus untuk membuat prediksi yang akurat dengan kumpulan data kecil. Sebagian besar dari mereka menggunakan konvolusi melebar : salah satu contoh terkenal adalah jaringan saraf convolutional padat skala campuran . Implementasinya tidak sepele.
DeltaIV
sumber
3
Terima kasih atas jawaban terincinya. Saya sudah melakukan augmentasi data yang signifikan. Mencoba beberapa varian dari model awal (di mana variasi berarti bahwa jumlah filter diskalakan secara merata di seluruh model). Melihat peningkatan luar biasa. Masih ada cara untuk pergi. Saya akan mencoba beberapa saran Anda. Terima kasih lagi.
rodrigo-silveira
@ rodrigo-silveira, sama-sama, biarkan saya tahu caranya. Mungkin kita dapat berbicara dalam obrolan setelah Anda mendapatkan hasil.
DeltaIV
1
Jawaban yang bagus, lebih layak ^
Gilly
1
Terdiri dengan sangat baik!
Karthik Thiagarajan
1
Saya akan memberi Anda 10rb poin untuk ini jika saya bisa. Jawaban yang luar biasa
Boppity Bop