2016-01-07 23 views
8

Ben TensorFlow bir konvolusyon filenin this example boyunca kodlama oldum ve ben ağırlıkların bu tahsisi ile nazar değilim:Tam bağlı katman ağırlığı boyutları

weights = { 

# 5x5 conv, 1 input, 32 outputs 
'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])), 

# 5x5 conv, 32 inputs, 64 outputs 
'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])), 

# fully connected, 7*7*64 inputs, 1024 outputs 
'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])), 

# 1024 inputs, 10 outputs (class prediction) 
'out': tf.Variable(tf.random_normal([1024, n_classes])) 

} 

nasıl bileceğiz ' wd1 'matris matrisi 7 x 7 x 64 satır olmalıdır?

Daha sonra ikinci konvolusyon tabakasının çıkışını yeniden şekillendirmek için kullanılan:

# Fully connected layer 
# Reshape conv2 output to fit dense layer input 
dense1 = tf.reshape(conv2, [-1, _weights['wd1'].get_shape().as_list()[0]]) 

# Relu activation 
dense1 = tf.nn.relu(tf.add(tf.matmul(dense1, _weights['wd1']), _biases['bd1'])) 

benim matematik olarak, havuzlama katman 2 (conv2 çıkışı) 4 x 4 x 64 nöronlar vardır.

Niçin [-1, 7 * 7 * 64] şeklini değiştiriyoruz? baştan çalışma

cevap

15

:

girişi, _X boyutu [28x28x1] (parti boyutu göz ardı edilerek) taşımaktadır. 28x28 gri tonlamalı bir görüntü.

birinci konvolüsyonel tabaka PADDING=same kullanır, bu yüzden, bir 14x14 uzamsal düzeni ile sonuçlanan, iki kat, her bir boyut azaltır sonra k=2 ile max_pool geçirilen bir 28x28 tabakası, verir. conv1'in 32 çıkışı vardır - bu nedenle örnek başına tam tensör şimdi [14x14x32].

Bu, [7x7x64] ile sonuçlanan 64 çıktısı olan 'da tekrarlanır.

tl; dr: Görüntü 28x28 olarak başlar ve her bir maxpool her bir boyutta iki kat artar. 28/2/2 = 7.

+1

de sadece ben tabakaların boyutluluk hakkında vardı korkunç bir yanlış anlamayı çözüldü. Tamamen "PADDING = aynı" göz ardı edildi ve öngörülebilir şekilde karıştı. Teşekkür ederim!! – jfbeltran

+0

Neden '_X' boyutunda [28x28x1] '? [28x28] değil mi? Neden fazladan x1'? – daniel451

+1

Konvolüsyon operatörleri, girişlerin yükseklik, genişlik ve derinliğe sahip olduğu bir grup beklerler. Son x1 sadece kozmetik bir yeniden şekillendirmedir. – dga

1

Bu soru, derin öğrenme konvolüsyonları hakkında iyi bir anlayışa sahip olmanızı gerektirir.

Temel olarak, her bir evrişim katmanı, modelinizin konvolüsyon piramit enine alanını azaltacaktır. Bu azalma, dönüşüm adımı ve max_pooling adımı tarafından yapılır. Ve işleri karmaşık hale getirmek için PADDING'e dayalı iki seçeneğimiz var.

Seçenek 1 - PADDING='SAME'

out_height = ceil(float(in_height)/float(strides[1])) 
out_width = ceil(float(in_width)/float(strides[2])) 

Seçenek 2 - HER büklüm ve maksimum havuzlama için PADDING='VALID'

out_height = ceil(float(in_height - filter_height + 1)/float(strides[1])) 
out_width = ceil(float(in_width - filter_width + 1)/float(strides[2])) 

Yeni out_height ve out_width hesaplamak zorunda kalacak diyoruz. Daha sonra, kıvrımların sonunda, son dönüşüm katmanınızın out_height, out_width ve derinliğini katlayın. Bu çarpmanın sonucu, ilk tam bağlı katınızın girişini oluşturan çıktı özellikli harita boyutudır.

Yani, örnekte muhtemelen iki kez, sadece PADDING='SAME', 1 bir büklüm adım ve 2 maksimum havuzlama adım vardı. Sonunda her şeyi 4'e bölmek zorunda kaldınız (1,2,1,2).

diğer bilgiler tensorflow API