Saya akan berasumsi dengan C1
,, C2
dll, maksud Anda lapisan konvolusional, dan P1
, P2
maksud Anda lapisan gabungan, dan FC
berarti lapisan yang terhubung sepenuhnya.
Kami dapat menghitung memori yang diperlukan untuk umpan maju seperti ini:
Satu gambar
Jika Anda bekerja dengan nilai float32, kemudian ikuti tautan yang disediakan di atas oleh @Alexandru Burlacu yang Anda miliki:
Input
: 50x50x3 = 7.500 = 7.5K
C1
: 50x50x32 = 80.000 = 80K
P1
: 25x25x32 = 20.000 = 20K
C2
: 25x25x64 = 40.000 = 40K
P2
: 12x12x64 = 9.216 = 9.2K <- Ini adalah masalah (dan perkiraan saya adalah perkiraan yang sangat bergelombang di sini). Daripada bekerja dengan 50, 25, '12 .5 ', akan lebih masuk akal untuk bekerja dengan kelipatan 32. Saya pernah mendengar bekerja dengan kelipatan 32 juga lebih efisien dari sudut pandang memori. Alasan ini adalah ide yang buruk adalah 2x2 pooling tidak membagi ruang dengan benar, sejauh yang saya tahu. Jangan ragu untuk mengoreksi saya jika saya salah.
FC
: 1x500 = 500 = 0,5K
Output
: 1 x 10 = 10 = 0,01 K (hampir tidak ada)
Total memori: 7.5K + 80K + 20K + 40K + 0.5K = 157.2K * 4 byte = 628.8 KB
Itu untuk satu gambar.
Minibatch
Jika Anda bekerja dengan ukuran minibatch 64, maka Anda membaca 64 ini sekaligus ke dalam memori dan melakukan operasi secara bersamaan, meningkatkan semuanya seperti ini:
Input
: 64x50x50x3 = 480.000 = 480K = 0.48M
C1
: 64x50x50x32 = 5.120.000 = 5.12M
P1
: 64x25x25x32 = 1.280.000 = 1.28M
C2
: 64x25x25x64 = 2.560.000 = 2.56M
P2
: 64x12x12x64 = 589.824 = 590K = 0,59M
FC
: 64x500 = 32.000 = 32K = 0,032M
Output
: 1x10x64 = 640 = 0.64K = 0.00064M (kami tidak peduli, ini kecil)
Total memori: 10M x 4 byte ~ 40MB (saya katakan perkiraan karena situs web juga mengatakan nilai perkiraan)
EDIT: Saya salah membaca situs webnya, maaf.
Menurut situs web, backward pass membutuhkan sekitar tiga kali lipat ini, karena kebutuhan untuk menyimpan:
aktivasi dan gradien terkait untuk setiap neuron - ini memiliki ukuran yang sama;
gradien bobot (parameter) yang ukurannya sama dengan parameter;
nilai momentum, jika Anda menggunakannya;
semacam memori lain-lain (saya tidak mengerti bagian ini)
C1
Anda di atas Anda memiliki50x50x32
tetapi itu hanya akan menjadi nilai-nilai untuk peta aktivasi lapisan, bagaimana dengan nilai-nilai yang dipelajari (32x3x3
) dalam kernel itu sendiri?Mungkin tautan ini akan memberi Anda penjelasan tentang cara menghitung penggunaan memori jaringan saraf arbitrer. Di bawah tautan dijelaskan penggunaan memori model VGGNet. Klik di sini dan gulirkan sedikit ke bawah))
sumber
Saat melatih convNet, total memori yang dibutuhkan meliputi:
Perkiraan kasar yang baik adalah jumlah parameter x 3 x 4 (jika Anda menggunakan float 32-bit) byte
Nah, sekarang ini bagaimana Anda menghitung jumlah parameter:
Sekarang jumlahkan semua parameter dan gunakan rumus yang saya sebutkan.
sumber