Autoencoder tidak dapat mempelajari fitur yang berarti


24

Saya memiliki 50.000 gambar seperti ini:

contoh data contoh data2

Mereka menggambarkan grafik data. Saya ingin mengekstrak fitur dari gambar-gambar ini sehingga saya menggunakan kode autoencoder yang disediakan oleh Theano (deeplearning.net).

Masalahnya adalah, autoencoder ini sepertinya tidak mempelajari fitur apa pun. Saya sudah mencoba RBM dan itu sama.

Dataset MNIST menyediakan fitur yang bagus tetapi data saya sepertinya tidak menghasilkan apa-apa. Saya lampirkan contoh di bawah ini:

Filter dibuat di MNIST:

filter mnist

Filter yang dibuat oleh pelatihan tentang data saya:

filter dari data saya

Saya telah menggunakan banyak permutasi yang berbeda dari ukuran lapisan tersembunyi dan zaman pelatihan tetapi hasilnya selalu sama.

Mengapa itu tidak berhasil? Mengapa autoencoder tidak dapat mengekstrak fitur dari gambar ini?

EDIT:

Bagi siapa pun yang memiliki masalah serupa. Solusinya sangat sederhana dan penyebabnya benar-benar bodoh. Saya hanya lupa untuk mengubah nilai piksel dari pengkodean RGB ke mengambang di rentang 0 - 1.

Nilai-nilai rescaling menyelesaikan masalah.

Jawaban:


15

Debugging jaringan saraf biasanya melibatkan tweaking hyperparameters, memvisualisasikan filter yang dipelajari, dan merencanakan metrik penting. Bisakah Anda membagikan hyperparameter apa yang telah Anda gunakan?

  • Apa ukuran batch Anda?
  • Berapa tingkat belajar Anda?
  • Apa jenis dari autoencoder yang Anda gunakan?
  • Sudahkah Anda mencoba menggunakan Denoising Autoencoder? (Nilai korupsi apa yang sudah Anda coba?)
  • Berapa banyak layer tersembunyi dan ukuran apa?
  • Apa dimensi gambar input Anda?

Menganalisis log pelatihan juga berguna. Plot grafik kehilangan rekonstruksi Anda (sumbu Y) sebagai fungsi zaman (sumbu X). Apakah kehilangan rekonstruksi Anda menyatu atau menyimpang?

Berikut ini adalah contoh dari autoencoder untuk klasifikasi gender manusia yang berbeda, dihentikan setelah 1500 zaman, memiliki hiperparameter disetel (dalam hal ini pengurangan dalam tingkat pembelajaran), dan memulai kembali dengan bobot yang sama yang menyimpang dan akhirnya bertemu.

Inilah yang konvergen: (kami menginginkan ini)

Vanilla "tidak dibatasi" dapat mengalami masalah di mana mereka hanya belajar pemetaan identitas. Itulah salah satu alasan mengapa komunitas telah menciptakan rasa Denoising, Jarang, dan Kontraktif.

Bisakah Anda memposting sebagian kecil dari data Anda di sini? Saya lebih dari bersedia menunjukkan hasil dari salah satu autoencoder saya.

Di samping catatan: Anda mungkin ingin bertanya pada diri sendiri mengapa Anda menggunakan gambar grafik di tempat pertama ketika grafik tersebut dapat dengan mudah direpresentasikan sebagai vektor data. Yaitu,

[0, 13, 15, 11, 2, 9, 6, 5]

Jika Anda dapat merumuskan kembali masalah seperti di atas, Anda pada dasarnya membuat kehidupan pembuat enkoder Anda lebih mudah. Pertama-tama tidak perlu mempelajari cara melihat gambar sebelum dapat mencoba mempelajari distribusi pembuatan.

Jawaban tindak lanjut (diberikan data.)

Berikut adalah filter dari 1000 unit tersembunyi, single layer Denoising Autoencoder. Perhatikan bahwa beberapa filter tampaknya acak. Itu karena saya berhenti berlatih begitu awal dan jaringan tidak punya waktu untuk mempelajari filter itu.

Berikut adalah hiperparameter yang saya latih:

batch_size = 4
epochs = 100
pretrain_learning_rate = 0.01
finetune_learning_rate = 0.01
corruption_level = 0.2

Saya berhenti pra-pelatihan setelah zaman ke-58 karena filternya cukup bagus untuk dikirim di sini. Jika saya jadi Anda, saya akan melatih Autoencoder 3-layer Stacked Denoising penuh dengan arsitektur 1000x1000x1000 untuk memulai.

Berikut adalah hasil dari langkah fine-tuning:

validation error 24.15 percent
test error 24.15 percent

Jadi pada pandangan pertama, tampaknya lebih baik daripada kebetulan, namun, ketika kita melihat pemecahan data antara kedua label kita melihat bahwa ia memiliki persen yang sama persis (75,85% menguntungkan dan 24,15% tidak menguntungkan). Jadi itu berarti jaringan telah belajar untuk hanya merespons "menguntungkan", terlepas dari sinyal. Saya mungkin akan melatih ini untuk waktu yang lebih lama dengan jaring yang lebih besar untuk melihat apa yang terjadi. Juga, sepertinya data ini dihasilkan dari beberapa jenis dataset keuangan yang mendasarinya. Saya akan merekomendasikan agar Anda melihat ke dalam Jaringan Syaraf Berulang setelah memformulasi ulang masalah Anda ke dalam vektor seperti yang dijelaskan di atas. RNNs dapat membantu menangkap beberapa dependensi temporal yang ditemukan dalam data deret waktu seperti ini. Semoga ini membantu.


Ukuran batch saya adalah 20. Tingkat belajar diatur pada 0,1. Saya sudah mencoba autoencoders kontraktual dan denoising tidak berhasil. Saya menggunakan satu lapisan tersembunyi. Saya sudah mencoba semuanya dari 50 hingga 1000 neuron. Saya mengubah skala gambar menjadi 25x25 - jadi mereka bahkan lebih kecil dari mnist. Untuk apa nilainya, saya lampirkan semua data saya di arsip ini: Bisakah Anda menunjukkan kepada saya hasil autoencoder dan data ini?
b93dh44


OK, saya sudah melatih jaringan dengan data itu. Lihat hasil edit dalam jawabannya.
sabalaba

Itu terlihat sangat menarik. Bisakah Anda memposting kode Anda? Saya benar-benar akan menghargainya. Saya pikir saya mungkin memiliki beberapa bug dalam kode saya yang mencegah jaringan dari pelatihan. Saya perhatikan Anda memiliki tahap fine-tuning? Saya pikir autoencoder saya hanya pretrains tanpa finetuning. Bisakah Anda menunjukkan kepada saya solusi Anda, jika Anda tidak keberatan?
b93dh44

Tidak dapat memposting kode saya karena ini adalah perusahaan saya, tetapi saya dapat mengarahkan Anda ke tutorial ini yang memiliki contoh kode untuk membuat Denoising Autoencoder: deeplearning.net/tutorial/dA.html . Semua saran hyperparameter akan berlaku untuk kode itu.
sabalaba

3

Saya tidak punya cukup perwakilan untuk berkomentar, jadi saya akan menjawabnya. Saya tidak tahu alasan pastinya:

  1. Pola di daerah kiri bawah terlihat mirip dengan contoh kedua Anda, dan pola di sudut kanan bawah tampak sangat mirip dengan contoh pertama Anda, ketika diperiksa dengan cermat. Pertanyaannya adalah, berapa banyak variasi dalam data sumber Anda? Jika semua 50.000 gambar adalah variasi dari pola yang sama, 3 peta fitur bermakna yang kami lihat ini cukup memadai bagi autoencoder untuk menjelaskan dan merekonstruksi semua data Anda.

  2. Kedua, Anda mungkin ingin melihat kesalahan rekonstruksi dan gambar yang direkonstruksi aktual. Seberapa baik hasilnya? Jika kesalahan rekonstruksi rendah, Anda mungkin memiliki pakaian yang berlebihan, mungkin karena resons yang dijelaskan di bawah ini (atau mungkin kombinasi dari 3 pola ini hanya cukup untuk menggambarkan semua data yang tertarik). Jika tidak, autoencoder tidak dapat mempelajari cara merekonstruksi data Anda dan Anda memerlukan autoencoder yang lebih besar atau algoritma pelatihan yang lebih baik.


1. Saya pikir ada banyak variasi dalam data ini. Masing-masing dari 50.000 grafik ini sedikit berbeda. Saya pikir tidak mungkin autoencoder dapat merekonstruksi semuanya berdasarkan hanya 3 filter. 2. Adakah tip untuk memperkirakan kesalahan rekonstruksi? Kode yang saya gunakan memberikan kesalahan tetapi jumlah yang sangat besar tidak banyak memberi tahu saya. Haruskah saya membandingkan kesalahan rekonstruksi dengan ukuran input atau jumlah lapisan tersembunyi?
b93dh44
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.