Tensorflow Strides Tartışma


115

Tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d'deki adımlar argümanını anlamaya çalışıyorum .

Dokümantasyon defalarca diyor

strides: Uzunluğu> = 4 olan inçlerin listesi. Giriş tensörünün her boyutu için kayan pencerenin adım sayısı.

Sorularım:

  1. 4+ tam sayının her biri neyi temsil ediyor?
  2. Konvnetler için neden [0] = adım [3] = 1 adımlara sahip olmaları gerekir?
  3. Gelen bu örnekte gördüğümüz tf.reshape(_X,shape=[-1, 28, 28, 1]). Neden -1?

Ne yazık ki, -1 kullanılarak yeniden şekillendirme için dokümanlardaki örnekler bu senaryoya çok iyi tercüme edilmiyor.

Yanıtlar:


224

Havuzlama ve evrişimli operasyonlar, giriş tensörü boyunca bir "pencere" kaydırır. tf.nn.conv2dÖrnek olarak kullanmak : Eğer giriş tensörünün 4 boyutu varsa:, [batch, height, width, channels]bu durumda evrişim height, widthboyutlar üzerinde 2B bir pencere üzerinde çalışır .

stridesboyutların her birinde pencerenin ne kadar kayacağını belirler. Tipik kullanım, ilk (toplu iş) ve son (derinlik) adımı 1'e ayarlar.

Çok somut bir örnek kullanalım: 32x32 gri tonlamalı bir giriş görüntüsü üzerinde 2 boyutlu bir evrişim çalıştırma. Gri tonlamalı diyorum çünkü o zaman giriş görüntüsünün derinliği = 1, bu da basit kalmasına yardımcı oluyor. Bu görüntü şöyle görünsün:

00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...

Tek bir örnek üzerinde 2x2 evrişim penceresi çalıştıralım (parti boyutu = 1). Evrişime 8 çıkış kanalı derinliği vereceğiz.

Evrişimin girdisi vardır shape=[1, 32, 32, 1].

Eğer belirtirseniz strides=[1,1,1,1]ile padding=SAME, daha sonra filtrenin çıkış olacaktır [1, 32, 32, 8].

Filtre önce aşağıdakiler için bir çıktı oluşturacaktır:

F(00 01
  10 11)

Ve sonra:

F(01 02
  11 12)

ve bunun gibi. Ardından ikinci sıraya geçerek şunları hesaplar:

F(10, 11
  20, 21)

sonra

F(11, 12
  21, 22)

[1, 2, 2, 1] adımını belirtirseniz, örtüşen pencereler oluşmaz. Hesaplayacak:

F(00, 01
  10, 11)

ve sonra

F(02, 03
  12, 13)

Adım, havuzlama operatörleri için benzer şekilde çalışır.

Soru 2: Konvnetler için neden [1, x, y, 1] adımlar atılıyor?

İlki toplu iştir: Genellikle grubunuzdaki örnekleri atlamak istemezsiniz veya ilk etapta bunları dahil etmemelisiniz. :)

Son 1, evrişimin derinliğidir: Aynı nedenden dolayı genellikle girdileri atlamak istemezsiniz.

Bunu conv2d operatör, daha geneldir olabilir diğer boyutlarla birlikte pencere slayt helezonlar oluşturmak, ama bu convnets tipik bir kullanım değil. Tipik kullanım, onları mekansal olarak kullanmaktır.

Neden -1 -1'e yeniden şekillendirmek , "tam tensör için gereken boyuta uyacak şekilde gerektiği gibi ayarlayın" diyen bir yer tutucudur. Bu, kodun girdi parti boyutundan bağımsız olmasını sağlamanın bir yoludur, böylece ardışık düzeninizi değiştirebilir ve kodun her yerinde parti boyutunu ayarlamanız gerekmez.


5
@derek çünkü (metinden) "Evrişime 8'lik bir çıkış kanalı derinliği vereceğiz."
Evrişimi kurarken

17

Girişler 4 boyutludur ve şu şekildedir: [batch_size, image_rows, image_cols, number_of_colors]

Adımlar, genel olarak, uygulama operasyonları arasında bir örtüşmeyi tanımlar. Conv2d durumunda, evrişimli filtrelerin ardışık uygulamaları arasındaki mesafenin ne olduğunu belirtir. Belirli bir boyuttaki 1 değeri, operatörü her satıra / sütuna uyguladığımız anlamına gelir; 2 değeri, her saniye anlamına gelir, vb.

Re 1) Evrişimler için önemli olan değerler 2. ve 3.dür ve sıralar ve sütunlar boyunca evrişimli filtrelerin uygulanmasındaki örtüşmeyi temsil ederler. [1, 2, 2, 1] değeri, filtreleri her ikinci satıra ve sütuna uygulamak istediğimizi söylüyor.

Re 2) Teknik sınırlamaları bilmiyorum (CuDNN gereksinimi olabilir) ancak tipik olarak insanlar satırlar veya sütun boyutları boyunca adım kullanır. Bunu parti boyutu üzerinde yapmak mantıklı değildir. Son boyuttan emin değilim.

Yeniden 3) Boyutlardan biri için -1 ayarlamak, "tensördeki toplam eleman sayısı değişmeyecek şekilde ilk boyut için değeri ayarlayın" anlamına gelir. Bizim durumumuzda -1, batch_size'ye eşit olacaktır.


11

1-dim durumdaki adımın ne yaptığı ile başlayalım.

Sizin input = [1, 0, 2, 3, 0, 1, 1]ve kernel = [2, 1, 3]evrişimin sonucunun, [8, 11, 7, 9, 4]çekirdeğinizi girdi üzerinde kaydırarak, eleman bazında çarpma yaparak ve her şeyi toplayarak hesaplandığını varsayalım . Bunun gibi :

  • 8 = 1 * 2 + 0 * 1 + 2 * 3
  • 11 = 0 * 2 + 2 * 1 + 3 * 3
  • 7 = 2 * 2 + 3 * 1 + 0 * 3
  • 9 = 3 * 2 + 0 * 1 + 1 * 3
  • 4 = 0 * 2 + 1 * 1 + 1 * 3

Burada bir öğe kayıyoruz, ancak hiçbir şey başka bir sayı kullanarak sizi durduramaz. Bu sayı senin adımın. Bunu, her s-inci sonucunu alarak 1-adımlı evrişimin sonucunu altörneklemek olarak düşünebilirsiniz.

Giriş boyutu i , çekirdek boyutu k , adım s ve dolgu p'yi bilerek, evrişimin çıktı boyutunu şu şekilde kolayca hesaplayabilirsiniz:

görüntü açıklamasını buraya girin

İşte || operatör, tavan işlemi anlamına gelir. Havuzlama katmanı için s = 1.


N-dim durum.

1-dim büyüklüğünün matematiğini bilmek, n-dim durumu, her bir karartmanın bağımsız olduğunu gördükten sonra kolaydır. Yani her boyutu ayrı ayrı kaydırırsınız. İşte 2-d için bir örnek . Tüm boyutlarda aynı adımı atmanız gerekmediğine dikkat edin. Yani bir N-dim giriş / çekirdek için N adım sağlamalısınız.


Artık tüm sorularınızı yanıtlamak çok kolay:

  1. 4+ tam sayının her biri neyi temsil ediyor? . conv2d , pool size bu listenin her boyut arasındaki ilerlemeleri temsil ettiğini söyler. Adımlar listesinin uzunluğunun çekirdek tensörünün rankıyla aynı olduğuna dikkat edin.
  2. Konvnetler için neden [0] adımlı adımlar 3 = 1 olmalıdır? . İlk boyut parti boyutu, son boyut ise kanallardır. Ne toplu işi ne de kanalı atlamanın bir anlamı yok. Yani onları 1. Genişlik / yükseklik için bir şeyi atlayabilirsiniz ve bu yüzden 1 olmayabilir.
  3. tf.reshape (_X, şekil = [- 1, 28, 28, 1]). Neden -1? tf.reshape sizin için kapsamıştır:

    Şeklin bir bileşeni özel değer -1 ise, bu boyutun boyutu hesaplanır, böylece toplam boyut sabit kalır. Özellikle, bir [-1] şekli 1-D'ye düzleşir. Şeklin en fazla bir bileşeni -1 olabilir.


2

@dga açıklamak için harika bir iş çıkardı ve ne kadar yardımcı olduğunu yeterince minnettar olamıyorum. Benzer şekilde, stride3B evrişimin nasıl çalıştığına dair bulgularımı paylaşmak isterim .

Conv3d'deki TensorFlow belgelerine göre, girişin şekli şu sırada olmalıdır:

[batch, in_depth, in_height, in_width, in_channels]

Değişkenleri aşırı sağdan sola bir örnek kullanarak açıklayalım. Giriş şeklinin olduğunu varsayarsak input_shape = [1000,16,112,112,3]

input_shape[4] is the number of colour channels (RGB or whichever format it is extracted in)
input_shape[3] is the width of the image
input_shape[2] is the height of the image
input_shape[1] is the number of frames that have been lumped into 1 complete data
input_shape[0] is the number of lumped frames of images we have.

Aşağıda adımın nasıl kullanıldığına dair özet bir belge bulunmaktadır.

strides: Uzunluğu> = 5 olan inçlerin listesi. Uzunluk tensörü 1-D 5. Her giriş boyutu için kayan pencerenin adım sayısı. Sahip olmalıstrides[0] = strides[4] = 1

Pek çok çalışmada belirtildiği gibi, adımlar basitçe bir pencere veya çekirdeğin en yakın öğeden kaç adım uzağa atladığı anlamına gelir, bir veri çerçevesi veya piksel (bu arada açıklanmıştır).

Yukarıdaki belgelerden, 3 boyutlu bir adım şu adımlara benzeyecektir = (1, X , Y , Z , 1).

Belgeler bunu vurgulamaktadır strides[0] = strides[4] = 1.

strides[0]=1 means that we do not want to skip any data in the batch 
strides[4]=1 means that we do not want to skip in the channel 

adımlar [X], toplu çerçevelerde kaç atlama yapmamız gerektiği anlamına gelir. Örneğin, 16 karemiz varsa, X = 1, her kareyi kullan anlamına gelir. X = 2, her ikinci kareyi kullan anlamına gelir ve devam eder

adım [y] ve adım [z] @dga tarafından yapılan açıklamayı takip eder, bu yüzden o bölümü tekrarlamayacağım.

Bununla birlikte, keras'ta, uzamsal boyutun adım [x], adımların [y] ve adımların [z] olduğu her bir uzamsal boyut boyunca evrişimin adımlarını belirterek yalnızca 3 tamsayıdan oluşan bir demet / liste belirtmeniz gerekir. strides [0] ve strides [4] zaten varsayılan olarak 1 olarak ayarlanmıştır.

Umarım birisi bunu faydalı bulur!

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.