Fungsi kerugian untuk segmentasi semantik

10

Menyetujui penyalahgunaan istilah teknis. Saya sedang mengerjakan proyek segmentasi semantik melalui jaringan saraf convolutional (CNNs); mencoba untuk mengimplementasikan arsitektur tipe Encoder-Decoder, oleh karena itu output adalah ukuran yang sama dengan input.

Bagaimana Anda mendesain label? Apa fungsi kerugian yang harus diterapkan? Terutama dalam situasi ketidakseimbangan kelas berat (tetapi rasio antara kelas adalah variabel dari gambar ke gambar).

Masalahnya berkaitan dengan dua kelas (objek yang menarik dan latar belakang). Saya menggunakan Keras dengan backend tensorflow.

Sejauh ini, saya akan merancang keluaran yang diharapkan menjadi dimensi yang sama dengan gambar input, menerapkan pelabelan piksel-bijaksana. Lapisan akhir model memiliki aktivasi softmax (untuk 2 kelas), atau aktivasi sigmoid (untuk menyatakan probabilitas bahwa piksel tersebut milik kelas objek). Saya mengalami masalah dalam merancang fungsi obyektif yang cocok untuk tugas seperti itu, dengan tipe:

function(y_pred,y_true),

dalam perjanjian dengan Keras .

Tolong, cobalah untuk spesifik dengan dimensi tensor yang terlibat (input / output model). Setiap pemikiran dan saran sangat dihargai. Terima kasih !

Florin Lucaciu
sumber
Bacalah arxiv.org/pdf/1511.00561.pdf ini. "Kami menggunakan cross-entropy loss sebagai fungsi objektif untuk melatih jaringan."
Miss Palmer

Jawaban:

6

Cross entropy jelas merupakan jalan yang harus ditempuh. Saya tidak tahu Keras tetapi TF memiliki ini: https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

Berikut adalah makalah yang langsung mengimplementasikannya: Jaringan Konvolusional Sepenuhnya untuk Segmentasi Semantik oleh Shelhamer et al.

The kertas U-Net juga merupakan implementasi sangat sukses dari ide, menggunakan koneksi melompat hilangnya menghindari resolusi spasial. Anda dapat menemukan banyak implementasi ini di internet.

Dari pengalaman pribadi saya, Anda mungkin ingin memulai dengan jaringan encoder-decoder sederhana terlebih dahulu, tetapi jangan menggunakan langkah (atau langkah = 1), jika tidak, Anda kehilangan banyak resolusi karena upampling tidak sempurna. Pergi dengan ukuran kernel kecil. Saya tidak tahu aplikasi spesifik Anda tetapi bahkan jaringan layer 2-3 tersembunyi akan memberikan hasil yang sangat baik. Gunakan 32-64 saluran di setiap lapisan. Mulai sederhana, 2 lapisan tersembunyi, masing-masing 32 saluran, kernel 3x3, stride = 1 dan bereksperimen dengan parameter secara terpisah untuk melihat efeknya. Pertahankan dimensi selalu sama dengan dimensi input untuk pemula untuk menghindari hilangnya resolusi. Setelah itu Anda dapat mengaktifkan langkah dan upampling dan mengimplementasikan ide-ide seperti U-Net. U-Net bekerja sangat baik untuk segmentasi gambar medis.

αβ


sumber
Saya bukan ahli dalam domain ini, tetapi bukankah kelas harus eksklusif dalam pengaturan ini? Jika ya, bukankah kehilangan softmax menjadi pilihan yang lebih baik? tensorflow.org/api_docs/python/tf/nn/…
Harald Thomson
1
@ HaraldThomson, Segmentasi adalah masalah biner. Banyak orang menggunakan softmax untuk masalah biner, tetapi itu benar-benar tidak perlu dan berlebihan. Alih-alih memiliki dua node output, memiliki satu node output yang mewakili P (y = 1), kemudian gunakan cross-entropy.
Ricardo Cruz
2

Gunakan weighted Dice loss dan cross entropy loss. Kehilangan dadu sangat baik untuk segmentasi. Bobot yang dapat Anda mulai dengan frekuensi kelas terbalik yaitu, ambil sampel katakanlah 50-100, temukan jumlah rata-rata piksel yang dimiliki masing-masing kelas dan buat kelas itu bobot 1 / rata-rata. Anda mungkin harus menerapkan dadu sendiri tetapi sederhana. Selain itu Anda dapat melihat kerugian dadu terbalik dan kehilangan fokus

Rahul Deora
sumber
-1

Biarkan saya lebih spesifik pada awalnya, dan kemudian lebih umum. Saya minta maaf jika saya salah paham.

Saya pikir Anda berbicara tentang kebutuhan jaringan saraf autoencoder karena Anda menyebutkan encode dan decode, dan Anda menyebutkan ukuran input sama dengan ukuran output. Jika demikian, maka fungsi kerugian Anda didasarkan pada mereproduksi vektor input, namun juga mengompresi data menjadi vektor yang lebih pendek di lapisan tengah yang tersembunyi. Pilihannya adalah untuk mencapai kesalahan kuadrat rata-rata minimal (untuk regresi) atau rasio logloss atau kesalahan klasifikasi (untuk klasifikasi). Namun, CNN bukan sesuatu yang saya lihat digunakan dalam autoencoder, tapi saya pikir itu mungkin dan berguna untuk melakukannya dalam kasus-kasus di mana invariansi translasi penting, seperti deteksi tepi dan objek dalam gambar.

Lebih umum, Anda tampaknya membangun model pembelajaran mesin yang sangat kompleks sejak Anda menyebutkan CNN. CNN dan model pembelajaran dalam lainnya adalah beberapa model pembelajaran mesin paling kompleks yang ada.

Memilih dimensi, label, dan fungsi kehilangan lebih seperti pembelajaran mesin dasar. Saya pikir Anda mungkin berada di atas kepala Anda dengan pembelajaran yang mendalam. Apakah Anda mengambil kelas belajar mesin tua biasa?

Geoffrey Anderson
sumber
Apakah ini perlu? Sebagai contoh, lihat metode Pixon .
Carl
ini pendekatan yang valid: arxiv.org/pdf/1511.00561.pdf
Miss Palmer
"CNN dan model pembelajaran mendalam lainnya adalah beberapa model pembelajaran mesin paling kompleks yang ada." Saya cenderung tidak setuju. Model itu sendiri mungkin rumit tetapi hei sebenarnya sangat sederhana untuk digunakan dengan pemahaman teoritis yang sangat sedikit. Itulah alasan dari seluruh hype tentang DL, sedikit teori, model yang mudah ditulis dan akurasi yang sangat tinggi ...