2015-12-29 15 views
11

İnternet üzerindeki çeşitli örneklere dayanarak yaklaşık olarak AlexNet'i uygulayarak TensorFlow'u öğrenmeye çalışıyorum. Temel olarak, AlexNet örneğini 224x224 RGB görüntüler (28x28 gri tonlamalı görüntüler yerine) almak için here örneğini genişletmek ve çevrimiçi bulduğum diğer AlexNet uygulamaları başına bir kaç katman eklemek, çekirdek boyutlarını, adımları değiştirmek vb. TensorFlow hatası: günlükler ve etiketler aynı boyutta olmalıdır

eşleşmeyen şekil türü hataların bir numara ile çalıştın mı, ama bu beni şaşırtan:

tensorflow.python.framework.errors.InvalidArgumentError: logits and labels must be same size: logits_size=dim { size: 49 } dim { size: 10 } labels_size=dim { size: 1 } dim { size: 10 } 
    [[Node: SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"](Softmax, _recv_Placeholder_1_0/_13)]] 
    [[Node: gradients/Mean_grad/range_1/_17 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_457_gradients/Mean_grad/range_1", tensor_type=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

49 boyut özellikle şaşırtıcıdır. I 2'ye artırmak halinde ayıklama, benim parti boyutu I

sess.run(optimizer, feed_dict={x: batchImages, y: batchLabels, keepProb: P_DROPOUT}) 

geçmek x ve y I

elde şeklini log sonra 49 98.

olur, şu anda 1

x shape: (1, 150528) 
y shape: (1, 10) 

Beklendiği gibi: 150528 = 224 * 224 RGB piksel ve etiketlerimi temsil eden tek bir sıcak vektör.

Bunu anlamak için herhangi bir yardımı takdir eder!

Güncelleme: Burada arıza sergileyen kodu:

https://gist.github.com/j4m3z0r/e70096d0f7bd4bd24c42

cevap

12

Kodunuzu Gist olarak paylaştığınız için teşekkür ederiz. şekiller anlaşmak yapmak için gerekli olan iki değişiklik vardır:

  1. hattı:

    fc1 = tf.reshape(pool5, [-1, wd1Shape[0]]) 
    

    ... toplu boyutta hatalı 49 sorumludur.giriş Aşağıdaki x 256 1 x 7 x 7, ve wd1Shape[0] 256. olası bir yerine geçer, çünkü x 256 49 olmak yeniden şekillendirilir geçerli:

    pool5Shape = pool5.get_shape().as_list() 
    fc1 = tf.reshape(pool5, [-1, pool5Shape[1] * pool5Shape[2] * pool5Shape[3]]) 
    

    ... fc1 şeklini verecek olan 1 x

  2. 12544. Bu değişikliği yaptıktan sonra, 'wd1' ağırlık matrisi (x 4096 256) boyutu fc1 düğüm sayısı aynı değildir.

    'wd1': tf.Variable(tf.random_normal([12544, 4096])), 
    

    diğer ağırlıkları değiştirmek isteyebilirsiniz rağmen ... veya bu matrisin boyutunu azaltmak için ek havuzu gerçekleştirin: Bunu şöyle matrisin tanımı değişebilir.

+0

Müthiş. Teşekkürler. Bence bununla çalışabilirim. Çok takdir edildi. – j4m3z0r

+0

Takip eden soru: Bu örnekte TensorFlow'un daha bilgilendirici bir şekilde başarısız olması için bir yol var mı? TF'nin, tam olarak işaretlediğiniz hatta uyumsuz şekiller olduğunu anlayabiliyormuş gibi görünüyor. – j4m3z0r

+0

Bence sorun, joker karakter olarak davranan ve (bu durumda) önde gelen boyut hakkında bilgi kaybeden yeniden şekillendirmede -1 değeridir. Bu, TensorFlow'un programı çalıştırmadan gerçek şekli bilmesini zorlaştırır ve tek bir örneği daha küçük 49 örneğe böldüğünüz geçerli programlar bile olabilir. Bundan kaçınmak için toplu büyüklükte değişmez dönüşümleri daha iyi ifade etme yöntemlerine ihtiyacımız var ('tf.expand_dims()' ve 'tf.squeeze()' yardımcı olabilir fakat belki de bu durumda bir 'tf.flatten_dims()' ye ihtiyacımız var. – mrry

0

Eğer bunu kullanıyor gerçek kod vermedi göz önüne alındığında tam olarak neyin yanlış olduğunu söylemek zor. İşte

böyle sorunların giderilmesi açısından bazı genel ipuçları verilmiştir:

  • davanız dense2 içinde sorunuyla ilgili yerlere print(tensor.get_shape()) (Ekle, dışarı, _weights [ 'dışarı'], _biases [ 'dışarı' ] şüpheliler).

  • Matris çoğaltımlarınızın doğru sırada olduğundan emin olun (ör. _weights ['out'] ile yoğun2), batch_size x 10 matrisiyle sonuçlanmalıdır).

Eğer bağlantılı AlexNet kod değiştirilirse, muhtemelen değişmiştir sonraki satırlar:

dense1 = tf.reshape(norm3, [-1, _weights['wd1'].get_shape().as_list()[0]]) # Reshape conv3 output to fit dense layer input 
dense1 = tf.nn.relu(tf.matmul(dense1, _weights['wd1']) + _biases['bd1'], name='fc1') # Relu activation 
dense2 = tf.nn.relu(tf.matmul(dense1, _weights['wd2']) + _biases['bd2'], name='fc2') # Relu activation 
out = tf.matmul(dense2, _weights['out']) + _biases['out'] 

Muhtemelen dense2 ait şekil sizin durumunuzda [49, 1024] 'dır. dense2.get_shape() numaralı bir baskı ekleyerek kontrol edebilirsiniz. Tüm tensörler için şekilleri 49 olana kadar yazdırabiliyorsunuz. Sadece ne değiştirdiğini tahmin edebilirim, ama yeniden şekillenmelerden biri olabilir.

+0

Not için teşekkürler. Ben bağımsız ve sorunun gösterir burada bir özü yükledim: https://gist.github.com/j4m3z0r/e70096d0f7bd4bd24c42 Haklısınız: max havuzu katman boyutu 7x7 ile biter = 49. – j4m3z0r

+0

Tamam, biraz ilerleme: çeşitli kıvrımlardan sonra daha fazla maxpool katmanının eklenmesi 49'u 4'e indirir, ki bu mantıklıdır: daha yüksek çözünürlüklü girdiden başlıyoruz, bu yüzden girdinin orantısal alt örneklemesine neden olmak için daha fazla MaxPool katmanına ihtiyacımız var. . – j4m3z0r

+0

İlk boyut parti boyutu olmalı, yani 4 olsa bile - hala yanlış. Bence bu problem fc1 = tf.reshape (pool5, [-1, wd1Shape [0]]) 'dır. -1 yaptığınız zaman - havuzun geri kalan kısmını oldukça fazla yakalar. -1 ile 1'i (toplu boyutunuzu) değiştirmeyi deneyin ve bir uyumsuzluk olup olmadığını görün ve wd1Shape [0] 'dan yeniden biçimlendirmenin ne olması gerektiğini düzeltin. – ilblackdragon

0

Bu sorun, sınıf değişkeniniz ve etiketiniz eşleşmediğinden kaynaklanır.

örn: - Kodunuzda , Sen 10 olarak sınıf değişkeni ilan Ama eğer sınıf değişkeni ve aynı boyut etiket yapılan kez etiket 10.

olmayabilir. Bu sorun çözülecek.