@StatsSorceress TL; DR:
Kendim için gerekli belleği hesaplayıp hesaplayamayacağımı görmek için bu aktiviteden geçiyorum:
Aktivasyonlar: 532.752 * 2 * 4 / (1024 ^ 2) = 4.06 MB
Parametreler: 19.072.984 * 4 / (1024 ^ 2) * 3 = 218.27 MB
Çeşitli: 128 * 9.000 * 4 / (1024 ^ 2) = 4.39 MB
Toplam Bellek: (4.06 * 128 ) + 218.27 + 4.39 = 742.34 MB
( Eğer yanılıyorsam birisi beni bu konuda düzeltin. FYI, sen zaten 128 ile çeşitli çarptın, bu yüzden yukarıdaki 128 ile çarpmadım )
Sizi bu makaleye ve ilgili videoya yönlendireceğim . Neler olduğunu daha iyi anlamama yardımcı oldular.
NOT: Tahminler için bir ağ kullanmak için gereken bellek, iki nedenden dolayı eğitim için gerekenden çok daha azdır:
- Tahmin ederken, bir görüntüyü yalnızca ağ üzerinden ileriye doğru göndeririz, geriye doğru değil (bu nedenle X 3 belleğini çarpmayız; aşağıya bakın)
- Görüntü başına bir tahmin vardır (bu nedenle, bir görüntü için gereken belleği toplu bir boyutla çarpmamıza gerek yoktur çünkü tahminlerde toplu iş kullanmıyoruz).
Süreç (Eğitilecek Bellek)
- Tek bir görüntü üzerinde çalışmak için gereken belleği hesaplayın
- Bu sayıyı toplu işinizdeki resim sayısıyla çarpın
( UNUTMAYIN: Mini-gruplama, verilerimizin bir alt kümesini aldığımızı, alt kümedeki her resim için degradeleri ve hataları hesapladığımızı, daha sonra bunları ortalayıp ortalamanın yönünde adım attığımızı söylüyor. etkinleştirme sayısı, toplu işteki görüntü sayısı ile çarpılır. ).
ADIM 1: 1 Görüntü için Bellek
Bir görüntüyü eğitmek için aşağıdakiler için bellek ayırmalısınız:
Model Parametreleri:
Ağırlıklar ve önyargılar her bir katman, bunların en gradyanlar ve bunların ivme değişkenleri (Adam, Adagrad, RMSProp vb optimize kullanılırsa)
Bunun için belleği yaklaşık olarak tahmin etmek için, ağırlıkları ve önyargıları saklamak için gereken belleği hesaplayın ve bunu 3 ile çarpın (yani "3 ile") çünkü ağırlıkları ve önyargıları saklamak için gereken bellek miktarının (kabaca) eşit olduğunu söylüyoruz. degradeler ve momentum değişkenleri için gerekli olanlar)
DENKLEMLER:
konvolusyonları:
ağırlıklar (n) = derinlik (n) * (kernel_width * kernel_height) * derinlik (n-1)
önyargı (n) = derinlik (n)
Tam Bağlı (Yoğun) Katmanlar:
ağırlıklar (n) = çıkışlar (n) * girişler (n)
önyargı (n) = çıktılar (n)
burada n , geçerli katman ve n-1 , bir önceki katmandır ve çıkışlar , FC katmanındaki çıkışların sayısıdır ve girişler , FC katmanına giriş sayısıdır (eğer önceki katman tam bağlı bir katman değilse, giriş sayısı düzleştirilmiş katmanın boyutuna eşittir).
NOT: Yalnızca ağırlık ve önyargıların hafızası, ayrıca bir görüntü için aktivasyon hafızası (aşağıya bakınız), tahminler için ihtiyacınız olan toplam hafıza miktarıdır (kıvrımlar ve diğer bazı şeyler için hafıza için bazı ek yükler hariç).
- Aktivasyonlar (bunlar Caffe'deki "Lekeler" dir):
(Terimleri burada gevşekçe kullanıyorum, yanımda ol)
Bir evrişim katmanındaki her evrişim " görüntüdeki piksel sayısı " aktivasyonlarını (yani bir resmi tek bir evrişimden geçirirseniz, " m " aktivasyonlarından oluşan tek bir özellik haritası alırsınız , burada " m " ", görüntü / giriş).
Tamamen bağlı katmanlar için, ürettiğiniz aktivasyon sayısı çıktınızın boyutuna eşittir.
konvolusyonları:
aktivasyonlar (n) = image_width * image_height * image_num_channels
Tam Bağlı (Yoğun) Katmanlar:
aktivasyonlar (n) = çıkışlar (n)
Girişinizin gerçekten yalnızca ağın başlangıcındaki bir resim olduğunu unutmayın. Kıvrımlardan sonra, başka bir şeye dönüşür (özellik haritaları). Bu nedenle, daha kesin olması için "image_width", "image_height" ve "image_num_channels" ifadelerini "input_width", "input_height" ve "layer_depth" ile değiştirin. (Bu konsepti görüntüler açısından düşünmek benim için daha kolay.)
Ayrıca her katmandaki (geri geçişte kullanılan) etkinleştirme hatasını da depolamamız gerektiğinden, depolama alanımızda yer açmamız gereken toplam varlık sayısını elde etmek için etkinleştirme sayısını 2 ile çarpıyoruz. Etkinleştirme sayısı, toplu işteki görüntü sayısı ile artar, bu nedenle bu sayıyı toplu iş boyutu ile çarparsınız.
2.ADIM: Toplu Eğitim için Bellek
Ağırlık ve önyargı sayısını (3 kez) ve aktivasyon sayısını (seri boyutunun 2 katı) toplayın. Bunu 4 ile çarpın ve toplu işi eğitmek için gerekli bayt sayısını elde edin. GB olarak cevap almak için 1024 ^ 2'ye bölebilirsiniz.