2015-12-15 39 views
7

'da matris çarpma işlevinin kullanımı TensorFlow işlevinde tf.matmul() işlevinin kullanımı hakkında biraz kafam karıştı. Benim sorum, derin öğrenme teorisi hakkında daha fazla olabilir. Bir girdi X ve ağırlık matrisi W (sıfır önyargılı varsayılarak) olduğunu varsayalım, WX'i tf.matmul(W, X) tarafından yapılabilecek bir çıktı olarak hesaplamak istiyorum. Ancak, MNIST for beginners dersinde tersine çevrilir ve bunun yerine tf.matmul(X, W) kullanılır. Diğer yandan, bir sonraki öğreticide TensorFlow Mechanics 101, tf.matmul(W, X) kullanılmaktadır. Matris büyüklükleri çarpma için önemli olduğundan, bu sorunu açıklığa kavuşturabilir miyim diye merak ediyorum.TensorFlow

cevap

2

TensorFlow hakkında pek bir şey bilmiyorum, ama sezgisel olarak karışıklığın girdi veri gösterimi ile ilgili olduğunu hissediyorum. X girişini W ağırlığındaki bir sayı ile çarpmak istediğinizi söylediğinizde, her bir boyutu (özelliği) karşılık gelen ağırlıkla çarpıp toplamı almak istediğinizi kastediyorum. x numaralı bir girdiniz varsa, m boyutlarına sahipseniz, w (m) değerleriyle bir ağırlık vektörüne sahip olmalısınız (önyargıyı düşünürseniz m+1). Eğer bir matris X sıraları gibi farklı eğitim örneklerini temsil seçerseniz

Şimdi, cevap için w^T * X

+1

Bir toplu işte birden fazla eğitim örneğini istiyorsanız, ilk boyutu dahili boyut olarak dahili olarak ele alan tf.batch_matmul işlevini kullanmanız gerekir. Ağırlıkların bir vektör değil, bir matris olabileceğini unutmayın: Giriş özelliklerinin farklı ağırlıklarına bağlı olarak birden çok çıktı üretebilirsiniz. Bunu yanıtlamak için cevabımı güncelledim. – dga

+0

Teşekkürler @jMathew. Bence haklısın. Girişin (n_Features x n_Samples) olarak temsil edilmesi gerektiğini varsayıyordum, ancak örneklerin çoğunda başka bir yol gibi görünüyor. dga, W'nin bir vektör olup olmadığına ya da beslenmeye bağlı olup olmadığına dair hiçbir şey yoktur. – sergulaydore

5

Bence mekaniği 101 öğretici yanlış yorumlamak gerekir - ya da belirli bir çizgiyi işaret edebilir misiniz? Genel olarak, bir ağ katmanı için, ağırlıkların "içinden aktığı" girdileri düşünürüm. Bunu temsil etmek için, o katmanın çıktısını üretmek üzere tf.matmul(Inputs, Weights) yazarım. Bu çıktının buna ek olarak bir bias (b) eklenebilir ve bunun sonucu, relu gibi doğrusal olmayan bir fonksiyona beslenir ve bir sonraki katman için girdi olarak başka bir tf.matmul verilir. İkinci olarak, Ağırlıklar matrisinin birden fazla çıktı üretmek için boyutlandırılabileceğini unutmayın. Bu yüzden bir matris, sadece bir vektör değil. Örneğin, iki gizli birim istediyseniz ve beş girdi özelliğiniz varsa, bunun gibi bir şekil [5, 2] ağırlık matrisini kullanacaksınız (örneğin, gösterim kolaylığı için numpy'de gösterildiği gibi - aynı şeyi tensorflow'da da yapabilirsiniz):

import numpy as np 
a = np.array([1, 2, 3, 4, 5]) 
W = np.array([[.5, .6], [.7, .8], [.9, .1], [.2, .3], [.4, .5]]) 

>>> np.dot(a, W) 
array([ 7.4, 6.2]) 

Bu sahiptir güzel davranış daha sonra a için bir toplu boyut eklemek, yine çalıştığını: a = np.array [[1, 2, 3, 4, 5], [6, 7, 8, 9 0]]

>>> np.dot(a, W) 
array([[ 7.4, 6.2], 
     [ 20.9, 17.7]]) 
Bu tam olarak girişten gitmek tf.matmul kullandığınızda ne yaptığını olan gizli birimlere sahiptir

, veya gizli birimlerin bir katmanından diğerine.

+0

Teşekkür yapardınız sütun olarak onları temsil etmek için tercih yerine eğer, X * w gerçekleştirmek zorunda kalacak ama Hala kafam karıştı. Weights * Inputs'u hesaplamamız gerekiyor, o zaman neden tf.matmul (Weights, Inputs)? tf.matmul (a, W), W * a yerine * W üretir. – sergulaydore

+0

Bunu şu şekilde düşünüyorum: Matris matrisinize gelen 5 aktivasyonunuz olduğunu ve bu hesaplamadan 2 çıkış olmasını istediğinizi düşünün. Katman için "giriş boyutu" nuz 5'dir ve katmandan "çıktı" boyutunuz 2'dir. Ayrıca, bir toplu iş numarası B'niz vardır. Bunun doğal bir temsilini bulursanız, girdiniz: [B, 5] 'ilk boyut parti olmaktır. Ağırlık matrisinizi bir [5x2] matrisi olarak ayarlarsanız, o zaman herhangi bir parti boyutunu şu şekilde çarpabilirsiniz: '[B x 5] * [5 x 2] -> [B, 2]'. Tabii ki, her iki matrisleri de aktarabilir ve 'W_t * a_t' ile çarpabilirsiniz. – dga

+0

Maalesef burada tartışıldığı gibi: http://stackoverflow.com/a/34908326/281545 np.dot tf.matmul semantikleriyle eşleşmiyor - özellikle her iki işlenen de matris olmalıdır. Herhangi bir geçici çözüm var mı? –