CNN'de büyük boyutlu görüntüler nasıl kullanılır?


15

CNN'de kullanılmak üzere 2400 x 2400 boyutlarında 10K görüntü olduğunu varsayalım. Şimdi soru, alt örnekleme ayrıcalıklarının olmadığı büyük görüntü boyutlarının nasıl ele alınacağıdır.

Sistem gereksinimleri şunlardır: -

Ubuntu 16.04 64 bit RAM 16 GB GPU 8 GB HDD 500 GB

1) Eğitilecek bu kadar büyük görüntüleri işlemek için herhangi bir teknik var mı?
2) Hangi parti boyutunu kullanmak mantıklıdır?
3) Yapabileceğim herhangi bir önlem veya donanım kaynaklarında herhangi bir artış ve azalma var mı?

Yanıtlar:


14

Şimdi soru, alt örnekleme ayrıcalıklarının olmadığı büyük görüntü boyutlarının nasıl ele alınacağıdır

Aşağı örnekleme ile girdiyi CNN'ye geçirmeden önce ölçeklemek anlamına geldiğini varsayıyorum . Evrişimli katman , bir sonraki katmanlar için kaynakları kaydedecek olan büyük bir adım seçerek bir ağ içindeki görüntünün altörneklenmesine izin verir. Aslında, yapılması gereken budur, aksi takdirde modeliniz GPU'ya sığmaz.

1) Eğitilecek bu kadar büyük görüntüleri işlemek için herhangi bir teknik var mı?

Genellikle araştırmalar görüntüleri resonable bir boyuta ölçeklendirir. Ancak bu sizin için bir seçenek değilse, CNN'nizi kısıtlamanız gerekir. Erken katmanlarda altörneklemeye ek olarak, FC katmanından (normalde parametrelerin çoğunu alan) kurtulmanızı öneririm evrişimsel katman lehine . Ayrıca, GPU'nuza uymayacağı için verilerinizi her çağda yayınlamanız gerekir.

Bunların hiçbirinin, girişlerin çok büyük olması nedeniyle erken katmanlarda ağır hesaplama yükünü engellemeyeceğini unutmayın: evrişim pahalı bir işlemdir ve ilk katmanlar her ileri ve geri geçişte çok fazla performans gösterecektir . Kısacası, eğitim yavaş olacaktır.

2) Hangi parti boyutunu kullanmak mantıklıdır?

İşte başka bir sorun. Tek bir resim çeker2400x2400x3x4 (3 kanal ve piksel başına 4 bayt), bu da ~ 70Mb'dir, bu nedenle toplu iş boyutu 10'u bile ödeyemezsiniz. Daha gerçekçi olarak 5 olur. Belleğin çoğunun CNN parametreleri tarafından alınacağını unutmayın. Bu durumda 32-bit yerine 16-bit değerleri kullanarak boyutu küçültmenin mantıklı olduğunu düşünüyorum - bu şekilde partileri ikiye katlayabileceksiniz.

3) Yapabileceğim herhangi bir önlem veya donanım kaynaklarında herhangi bir artış ve azalma var mı?

Darboğazınız GPU hafızasıdır. Başka bir GPU satın alabiliyorsanız, alın ve ağı ikiye bölün. GPU belleğine kıyasla diğer her şey önemsizdir.


1
Teşekkür ederim. Bu cevapta verdiğiniz birkaç öneriyi zaten izledim. İyi cevap.
WaterRocket8236

5

Genellikle görüntüler için özellik kümesi piksel yoğunluğu değerleridir ve bu durumda oldukça büyük bir özellik kümesine yol açar; Ayrıca, önemli verileri kaybedebileceğiniz (aslında kaybedeceğiniz) için görüntüleri aşağı örneklemeniz de önerilmez.

[1] Ancak özellik kümesi boyutunu azaltmanıza yardımcı olabilecek bazı teknikler vardır, PCA (Prensip Bileşen Analizi) gibi yaklaşımlar, önemli özellik alt kümesinin seçiminde size yardımcı olur.

Ayrıntılı bilgi için http://spark.apache.org/docs/latest/ml-features.html#pca bağlantısına bakın. .

[2] Yapay Sinir Ağınızı eğitirken hesaplama giderlerini azaltmak dışında, her bir yinelemede eğitim için gerekli veri kümesinin boyutunu azaltacak olan Degrade İniş yaklaşımının geleneksel kullanımı yerine Stokastik Degrade İniş'i kullanabilirsiniz. Böylece tek bir yinelemede kullanılacak veri kümesi boyutunuz azalacak, böylece Ağı eğitmek için gereken süre azalacaktır.

Kullanılacak tam parti boyutu, eğitim veri seti ve test veri seti için dağılımınıza bağlıdır, daha genel bir kullanım 70-30'dur. Gerekli zamanı azaltmak için yukarıda belirtilen Stokastik yaklaşımı da kullanabilirsiniz.

Stokastik Degrade İniş için detay http://scikit-learn.org/stable/modules/sgd.html

[3] Donanım yükseltme için uygun görünmektedir, yine de gerekirse kullanım sınırına kadar ücretsiz hesap aboneliği alabileceğiniz AWS gibi bulut çözümlerine bakın.


Cevap için teşekkür ederim. Daha fazla bilgi alırsanız cevabı güncelleyin.
WaterRocket8236

Stokastik Degrade İnişteki bu bağlantı için teşekkürler ve AI'ye hoş geldiniz!
DukeZhou

2

Bu kadar büyük veriler belleğinize yüklenemez. Yapabileceklerinizi ikiye bölelim:

  1. Tüm görüntülerinizi daha küçük boyutlara yeniden ölçeklendirin. Bunları 112x112 piksele ölçeklendirebilirsiniz. Sizin durumunuzda, kare bir görüntünüz olduğu için kırpmaya gerek kalmayacak. Yine de, tüm bu görüntüleri bir hedefe RAM'inize yükleyemezsiniz.

  2. En iyi seçenek, verileri toplu olarak besleyecek bir jeneratör işlevi kullanmaktır. Lütfen Keras'ta kullanılan fit_generator kullanımına bakın . Model parametreleriniz GPU belleğine sığmayacak kadar büyük olursa, parametre numaranızı azaltmak için toplu normalleştirmeyi veya Artık model kullanmayı düşünün.


3
Neden 112x112 piksel boyutunda bir boyut seçesiniz? 2'lik bir güç değil, 2400'ün bir böleni değil.
Andi R

@AndiR. Işte burada. Giriş boyutu söz konusu olduğunda, herhangi bir boyut seçmek ücretsizdir. Bunun nedeni, ağda herhangi bir boyut uyuşmazlığı olması durumunda, sıfır dolgusu kullanılarak kolayca çözülebilmesidir. Dolayısıyla, girdinin boyutuna ilişkin sabit bir metodoloji yoktur. Dikkat edilmesi gereken şey, çok fazla örneklemenin giriş kalitesini etkilemediğinden emin olmaktır. Lütfen 112x112 boyutundan yararlanan bu makaleye bir göz atın. ( cv-foundation.org/openaccess/content_iccv_2015/papers/… )
rocksyne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.