Repositori ini berisi sejumlah teknik visualisasi jaringan saraf konvolusional yang diimplementasikan dalam Pytorch.
Catatan : Saya menghapus dependensi CV2 dan memindahkan repositori ke PIL. Beberapa hal mungkin rusak (walaupun saya menguji semua metode), saya akan sangat menghargai jika Anda dapat membuat masalah jika sesuatu tidak berhasil.
Catatan : Kode dalam repositori ini diuji dengan Torch versi 0.4.1 dan beberapa fungsi mungkin tidak berfungsi sebagaimana dimaksud dalam versi yang lebih baru. Meskipun seharusnya tidak terlalu berupaya untuk membuatnya bekerja, saya tidak punya rencana saat ini untuk membuat kode dalam repositori ini kompatibel dengan versi terbaru karena saya masih menggunakan 0.4.1.
Bergantung pada tekniknya, kode menggunakan Alexnet atau VGG pretrained dari Model Zoo. Beberapa kode juga mengasumsikan bahwa lapisan dalam model dipisahkan menjadi dua bagian; Fitur , yang berisi lapisan konvolusional dan classifier , yang berisi lapisan yang sepenuhnya terhubung (setelah convolutions flatting out). Jika Anda ingin port kode ini untuk menggunakannya pada model Anda yang tidak memiliki pemisahan seperti itu, Anda hanya perlu melakukan beberapa pengeditan pada bagian -bagian di mana ia memanggil model. Fitur dan model.classifier .
Setiap teknik memiliki file Python sendiri (misalnya gradcam.py ) yang saya harap akan membuat segalanya lebih mudah dipahami. misc_functions.py berisi fungsi seperti pemrosesan gambar dan rekreasi gambar yang dibagikan oleh teknik yang diimplementasikan.
Semua gambar diproses dengan rata-rata dan STD dari dataset Imagenet sebelum diumpankan ke model. Tidak ada kode yang menggunakan GPU karena operasi ini cukup cepat untuk satu gambar (kecuali untuk mimpi yang mendalam karena contoh gambar yang digunakan untuk itu sangat besar). Anda dapat menggunakan GPU dengan sedikit usaha. Contoh gambar di bawah ini mencakup angka dalam tanda kurung setelah deskripsi, seperti Mastiff (243) , angka ini mewakili ID kelas dalam dataset Imagenet.
Saya mencoba mengomentari kode sebanyak mungkin, jika Anda memiliki masalah yang memahaminya atau porting, jangan ragu untuk mengirim email atau membuat masalah.
Di bawah ini, ada beberapa hasil sampel untuk setiap operasi.
| Kelas Target: King Snake (56) | Kelas Target: Mastiff (243) | Kelas Target: Spider (72) | |
| Gambar asli | |||
| Backpropagasi vanilla berwarna | |||
| Sejahteraan vanilla backpropagation | |||
| Backpropagasi berpemandu berwarna (GB) | |||
| PERHATIAN BACKPROPAGATION PRAD (GB) | |||
| Backpropagation Backpropagation Negatif (GB) | |||
| Backpropagasi Backpropagasi Positif (GB) | |||
| Peta aktivasi kelas-tertimbang gradien (Lulusan) | |||
| Heatmap aktivasi kelas-tertimbang gradien (Lulusan) | |||
| Heatmap aktivasi kelas-tertimbang gradien pada gambar (Lulusan) | |||
| Peta Aktivasi Kelas Berberat Skor (Skor-cam) | |||
| Heatmap aktivasi kelas-tertimbang skor (Skor-cam) | |||
| Heatmap aktivasi kelas-tertimbang skor pada gambar (Skor-cam) | |||
| Peta aktivasi kelas kelas-tertimbang berpemandu berwarna (Pagar-L-Cam) | |||
| Peta aktivasi kelas-tertimbang gradien berpemandu (Pagar-L-Cam) | |||
| Gradien terintegrasi (tanpa penggandaan gambar) | |||
| Relevansi Layerwise (LRP) - Lapisan 7 | |||
| Relevansi Layerwise (LRP) - Lapisan 1 |
LayerCam [16] adalah modifikasi sederhana dari grad-cam [3], yang dapat menghasilkan peta aktivasi kelas yang andal dari lapisan yang berbeda. Untuk contoh yang disediakan di bawah ini, VGG16 terlatih digunakan.
| Peta Aktivasi Kelas | Panas aktivasi kelas | Panas aktivasi kelas pada gambar | |
| LayerCam (Lapisan 9) | ![]() | ![]() | ![]() |
| LayerCam (Lapisan 16) | ![]() | ![]() | ![]() |
| LayerCam (Lapisan 23) | ![]() | ![]() | ![]() |
| LayerCam (Lapisan 30) | ![]() | ![]() | ![]() |
Teknik lain yang diusulkan hanya mengalikan gradien dengan gambar itu sendiri. Hasil yang diperoleh dengan penggunaan beberapa teknik gradien di bawah ini.
| Lulusan vanilla X Gambar | |||
| Lulusan yang dipandu X Gambar | |||
| Lulusan terintegrasi X Gambar |
Lulusan Smooth menambahkan beberapa noise Gaussian ke gambar asli dan menghitung gradien beberapa kali dan rata -rata hasilnya [8]. Ada dua contoh di bagian bawah yang menggunakan vanilla dan dipandu backpropagation untuk menghitung gradien. Jumlah gambar ( n ) ke rata -rata lebih dipilih sebagai 50. σ ditampilkan di bagian bawah gambar.
| Vanilla Backprop | ||
| Backprop Terpandu | ||
Filter CNN dapat divisualisasikan ketika kami mengoptimalkan gambar input sehubungan dengan output dari operasi konvolusi spesifik. Untuk contoh ini saya menggunakan VGG16 pra-terlatih. Visualisasi lapisan dimulai dengan warna dasar dan filter arah pada level yang lebih rendah. Saat kami mendekati lapisan akhir, kompleksitas filter juga meningkat. Jika Anda menggunakan teknik eksternal seperti kabur, kliping gradien dll. Anda mungkin akan menghasilkan gambar yang lebih baik.
| Lapisan 2 (Konvisi 1-2) | |||
| Lapisan 10 (Conv 2-1) | |||
| Lapisan 17 (Konven 3-1) | |||
| Lapisan 24 (Konven 4-1) |
Cara lain untuk memvisualisasikan lapisan CNN adalah dengan memvisualisasikan aktivasi untuk input spesifik pada lapisan dan filter tertentu. Ini dilakukan pada [1] Gambar 3. Contoh di bawah ini diperoleh dari lapisan/filter VGG16 untuk gambar pertama menggunakan backpropagation yang dipandu. Kode untuk opeasi ini ada di layer_activation_with_guided_backprop.py . Metode ini sangat mirip dengan backpropagation yang dipandu tetapi alih -alih memandu sinyal dari lapisan terakhir dan target tertentu, ia memandu sinyal dari lapisan dan filter tertentu.
| Gambar input | Layer vis. (Filter = 0) | Filter vis. (Layer = 29) |
Saya pikir teknik ini adalah teknik paling kompleks dalam repositori ini dalam hal memahami apa yang dilakukan kode. Ini terutama karena regularisasi yang kompleks. Jika Anda benar -benar ingin memahami bagaimana ini diimplementasikan, saya sarankan Anda membaca halaman kedua dan ketiga dari makalah ini [5], khususnya, bagian regularisasi. Di sini, tujuannya adalah untuk menghasilkan gambar asli setelah lapisan ke -n. Semakin jauh kita masuk ke model, semakin sulit menjadi. Hasil dalam kertas ini sangat bagus (lihat Gambar 6) tetapi di sini, hasilnya dengan cepat menjadi berantakan saat kami beralih melalui lapisan. Ini karena penulis kertas menyetel parameter untuk setiap lapisan secara individual. Anda dapat menyetel parameter seperti yang diberikan di koran untuk mengoptimalkan hasil untuk setiap lapisan. Contoh terbalik dari beberapa lapisan Alexnet dengan gambar ular sebelumnya ada di bawah ini.
| Lapisan 0: conv2d | Layer 2: MaxPool2d | Lapisan 4: Relu |
| Lapisan 7: Relu | Lapisan 9: Relu | Lapisan 12: Maxpool2d |
Deep Dream secara teknis adalah operasi yang sama dengan visualisasi lapisan satu -satunya perbedaan adalah Anda tidak mulai dengan gambar acak tetapi menggunakan gambar nyata. Sampel di bawah ini dibuat dengan VGG19 , hasil yang diproduksi sepenuhnya tergantung pada filter sehingga semacam hit atau miss. Model yang lebih kompleks menghasilkan fitur level tinggi mode. Jika Anda mengganti VGG19 dengan varian awal , Anda akan mendapatkan bentuk yang lebih terlihat ketika Anda menargetkan lapisan konvensi yang lebih tinggi. Seperti visualisasi lapisan, jika Anda menggunakan teknik tambahan seperti kliping gradien, kabur dll. Anda mungkin mendapatkan visualisasi yang lebih baik.
| Gambar asli | |
| VGG19 Lapisan: 34 (Final Conv. Layer) Filter: 94 | |
| VGG19 Lapisan: 34 (Final Conv. Layer) Filter: 103 |
Operasi ini menghasilkan output yang berbeda berdasarkan model dan metode regularisasi yang diterapkan. Di bawah ini, ada beberapa sampel yang diproduksi dengan VGG19 yang dimasukkan dengan Gaussian Blur setiap iterasi lainnya (lihat [14] untuk detailnya). Kualitas gambar yang dihasilkan juga tergantung pada model, Alexnet umumnya memiliki artefak hijau (ish) tetapi VGGS menghasilkan (jenis) gambar yang lebih baik. Perhatikan bahwa gambar -gambar ini dihasilkan dengan CNN biasa dengan mengoptimalkan input dan bukan dengan GANS .
| Kelas Target: Worm Snake (52) - (VGG19) | Kelas Target: Spider (72) - (VGG19) |
Sampel di bawah ini menunjukkan gambar yang diproduksi tanpa regularisasi, regularisasi L1 dan L2 pada kelas target: Flamingo (130) untuk menunjukkan perbedaan antara metode regularisasi. Gambar -gambar ini dihasilkan dengan Alexnet pretrained.
| Tidak ada regularisasi | L1 regularisasi | L2 regularisasi |
Sampel yang diproduksi selanjutnya dapat dioptimalkan untuk menyerupai kelas target yang diinginkan, beberapa operasi yang dapat Anda masukkan untuk meningkatkan kualitas; Kabur, kliping gradien yang berada di bawah treshold tertentu, warna acak bertukar pada beberapa bagian, menanam acak gambar, memaksa gambar yang dihasilkan untuk mengikuti jalur untuk memaksa kontinuitas.
Beberapa teknik ini diimplementasikan di Generate_Regularized_Class_specific_samples.py (milik Alexstoken).
torch == 0.4.1
torchvision >= 0.1.9
numpy >= 1.13.0
matplotlib >= 1.5
PIL >= 1.1.7
Jika Anda menemukan kode dalam repositori ini berguna untuk penelitian Anda, pertimbangkan mengutipnya.
@misc{uozbulak_pytorch_vis_2022,
author = {Utku Ozbulak},
title = {PyTorch CNN Visualizations},
year = {2019},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/utkuozbulak/pytorch-cnn-visualizations}},
commit = {b7e60adaf64c9be97b480509285718603d1e9ba4}
}
[1] JT Springenberg, A. Dosovitskiy, T. Brox, dan M. Riedmiller. Berjuang untuk Kesederhanaan: Semua Convolutional Net , https://arxiv.org/abs/1412.6806
[2] B. Zhou, A. Khosla, A. Lapedriza, A. Oliva, A. Torralba. Belajar fitur yang dalam untuk lokalisasi diskriminatif , https://arxiv.org/abs/1512.04150
[3] RR Selvaraju, A. Das, R. Vedantam, M. Cogswell, D. Parikh, dan D. Batra. Grad-Cam: Penjelasan Visual dari Jaringan Dalam melalui Lokalisasi Berbasis Gradien , https://arxiv.org/abs/1610.02391
[4] K. Simonyan, A. Vedaldi, A. Zisserman. Jaringan Convolutional Jauh Di Dalam: Memvisualisasikan Model Klasifikasi Gambar dan Peta Saliency , https://arxiv.org/abs/1312.6034
[5] A. Mahendran, A. Vedaldi. Memahami representasi gambar yang dalam dengan membalikkannya , https://arxiv.org/abs/1412.0035
[6] H. Noh, S. Hong, B. Han, Pembelajaran Jaringan Dekonvolusi untuk Segmentasi Semantik https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/noh_learning_deconvolution_network_iccv_2015_pever.2015_pevor.2015_pevor.2015_paphor.2015_pever.2015_pever.2015_pever.2015_pever.2015_pever.2015_pever.2015_p di
[7] A. Nguyen, J. Yosinski, J. Clune. Jaringan saraf yang dalam mudah dibodohi: prediksi kepercayaan tinggi untuk gambar yang tidak dapat dikenali https://arxiv.org/abs/1412.1897
[8] D. Smilkov, N. Thorat, N. Kim, F. Viégas, M. Wattenberg. SmoothGrad: Menghapus kebisingan dengan menambahkan noise https://arxiv.org/abs/1706.03825
[9] D. Erhan, Y. Bengio, A. Courville, P. Vincent. Memvisualisasikan fitur lapisan atas dari jaringan yang dalam https://www.researchgate.net/publication/265022827_visualizing_higher-layer_features_of_a_deep_network
[10] A. Mordvintsev, C. Olah, M. Tyka. Inceptionism: masuk lebih dalam ke jaringan saraf https://research.goOgleblog.com/2015/06/Inceptionism-going-deeper-into-neural.html
[11] IJ Goodfellow, J. Shlens, C. Szegedy. Menjelaskan dan memanfaatkan contoh permusuhan https://arxiv.org/abs/1412.6572
[12] A. Shrikumar, P. Greenside, A. Shcherbina, A. Kundaje. Bukan hanya kotak hitam: mempelajari fitur -fitur penting melalui menyebarkan perbedaan aktivasi https://arxiv.org/abs/1605.01713
[13] M. Sundararajan, A. Taly, Q. Yan. Atribusi aksiomatik untuk jaringan dalam https://arxiv.org/abs/1703.01365
[14] J. Yosinski, J. Clune, A. Nguyen, T. Fuchs, Hod Lipson, Memahami Jaringan Saraf melalui Visualisasi Deep https://arxiv.org/abs/1506.06579
[15] H. Wang, Z. Wang, M. Du, F. Yang, Z. Zhang, S. Ding, P. Mardziel, X. Hu. SCORE-CAM: Penjelasan visual skor-weighted untuk jaringan saraf konvolusional https://arxiv.org/abs/1910.01279
[16] P. Jiang, C. Zhang, Q. Hou, M. Cheng, Y. Wei. LayerCam: Menjelajahi peta aktivasi kelas hierarkis untuk lokalisasi http://mmcheng.net/mftp/papers/21tip_layercam.pdf
[17] G. Montavon1, A. Binder, S. lauschkin, W. SameK, dan K. Muller. Propagasi Relevansi Lapisan-Lapis: Tinjauan Umum https://www.researchgate.net/publication/335708351_layer-wise_relevance_propagation_an_overview