2016-05-01 29 views
8

Yoğun bir tabakayı bir kıvrımlı katmana dönüştürmek için ağırlıkların doğru eşlemesini bulmakta sorun yaşıyorum. Python, yoğun bir tabakayı bir konvolüsyon katmanına dönüştürmeyi öğretiyor

Bu

üzerinde çalışıyorum bir ConvNet bir alıntı: MaxPooling sonra

model.add(Convolution2D(512, 3, 3, activation='relu')) 
model.add(MaxPooling2D((2,2), strides=(2,2))) 
model.add(Flatten()) 
model.add(Dense(4096, activation='relu')) 

, girdi şekli (512,7,7) taşımaktadır. Ben doğru bir şekilde düzleştirilmiş ağırlıkları eşleştirmek için ağırlıklarını yeniden şekillendirmek gerekiyor bilmiyorum Ancak

model.add(Convolution2D(512, 3, 3, activation='relu')) 
model.add(MaxPooling2D((2,2), strides=(2,2))) 
model.add(Convolution2D(4096, 7, 7, activation='relu')) 

: Ben bu gibi görünmesi için kıvrımlı bir tabaka haline yoğun tabaka dönüşüm istiyoruz (4096,512,7,7) kıvrım tabakası için gerekli olan yapı? Şu anda, yoğun tabakanın ağırlıkları boyuttadır (25088,4096). Nöronlara ağırlıkların doğru haritalanmasını korurken, bu 25088 elementini bir şekilde (512,7,7) bir boyuta eşleştirmem gerekiyor. Şimdiye kadar, yeniden şekillendirmenin ve aktarmanın birçok yolunu denedim, ancak doğru haritalamayı bulamadım.

Bunun olacağını çalışıyorlar ne bir örnek:

weights[0] = np.transpose(np.reshape(weights[0],(512,7,7,4096)),(3,0,1,2)) 

ama doğru ağırlıkları eşleşmiyor. Her iki modelin çıktılarını karşılaştırarak eşlemenin doğru olup olmadığını doğruladım. Doğru yapıldığında, çıktının aynı olması beklenir.

cevap

6

Hala bir çözüm mü arıyorsunuz? İşte burada: sizin durumunuzda

new_conv_weights = dense_weights.transpose(1,0).reshape(new_conv_shape)[:,:,::-1,::-1] 

:

weights[0] = weights[0].transpose(1,0).reshape((4096,512,7,7))[:,:,::-1,::-1] 

zor kısmı dönüşüm filtreler saygısız olduğu [:,:, :: - 1, :: - 1]. Theano, konvolüsyonu korelasyonlu değil (caffe'nin aksine). matris içinde

1 2 3 4 5 
6 7 8 9 0 
1 2 3 4 5 

sonuç:

1 0 
0 0 

matrisine uygulanabilir:

1 2 3 4 
6 7 8 9 
:

7 8 9 0 
2 3 4 5 

bu bir korelasyon beklenebilir gibi Dolayısıyla, keras içinde filtre

İşler gibi çalışmak için bekleniyor, filtreleri 180 derece döndürmeniz gerekiyor. Bu sorunu kendim için çözdüm, umarım bu sizin ya da başkaları için yardımcı olacaktır. Şerefe.