2015-12-05 29 views
16

this paper'u yeniden uygulamak için çalışıyorum ve tuş işlemi bir bilye tensör ürünüdür. Bunun ne anlama geldiğini pek bilmiyorum ama kağıdın anladığı küçük bir grafik var.TensorFlyear Tensör Ürünü TensorFlow

enter image description here

anahtar operasyon E_1 * W * E-2 olduğunu ve dinlenme kolay olmalı, çünkü tensorflow bunu uygulamak için nasıl bilmek istiyorum.

Temel olarak, belirli bir 3D tensör W, matrisler içine dilim, ve j numaralı dilim (matris) için, bir skaler ile sonuçlanan, E_1 ve E-2 her tarafında çarpın sonuçtaki vektörde jth girişi (bu işlemin çıkışı).

Yani, W E_1, d boyutlu vektör, bir ürünü gerçekleştirmek için d x d x k tensörünü istiyor ve E-2, başka d boyutlu vektör. Bu ürün şimdi olduğu gibi TensorFlow'da açık bir şekilde ifade edilebilir mi, yoksa kendi işimi bir şekilde tanımlamalı mıyım?

ÖNCE

Neden bu tansörleri işi çarparak gelmez EDITS ve daha açık biçimde çalışmak tanımlamak için bir yol var mı?

>>> import tensorflow as tf 
>>> tf.InteractiveSession() 
>>> a = tf.ones([3, 3, 3]) 
>>> a.eval() 
array([[[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]], 

     [[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]], 

     [[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]], dtype=float32) 
>>> b = tf.ones([3, 1, 1]) 
>>> b.eval() 
array([[[ 1.]], 

     [[ 1.]], 

     [[ 1.]]], dtype=float32) 
>>> 

hata mesajı

ValueError: Shapes TensorShape([Dimension(3), Dimension(3), Dimension(3)]) and TensorShape([Dimension(None), Dimension(None)]) must have the same rank 

ANDA

iki 3D tensörleri çarparak ya tf.matmul ile çalışmıyor çıkıyor, bu yüzden ancak tf.batch_matmul yapar. tf.batch_matmul da 3D tensörler ve matrisler yapacak. Ardından 3D'yi ve bir vektörü denedim:

ValueError: Dimensions Dimension(3) and Dimension(1) are not compatible 
+0

Bunu basit bir yeniden şekillendirme ile yapabilirsiniz. – mdaoust

+0

Sonunda kağıdı uyguladınız mı? – Apurv

cevap

12

Bunu basit bir yeniden şekillendirme ile yapabilirsiniz. İki matris çarpanının ilki için, k * d, uzunluk d vektörleri ile nokta ürününe sahip olursunuz.

Bu yakın olmalıdır:

temp = tf.matmul(E1,tf.reshape(Wddk,[d,d*k])) 
result = tf.matmul(E2,tf.reshape(temp,[d,k])) 
+3

bunun "temiz" bir yolu yok mu?Tüm bu yeniden şekilleri yapmak zorunda olduğum için estetik olarak beni rahatsız ediyor, ancak yapmam gereken şey buysa ... Tensorflow'da yeniden şekillendirme nasıl yapılır? Bütün değerleri etrafa mı taşıyorlar yoksa sadece değerleri okumak için bir şema mı? –

+0

Sanırım büyük ihtimalle 'şema' adımlarını değiştiriyorlar. Bu [süper güçlü] (http://scikit-image.org/docs/dev/api/skimage.util.html#view-as-windows). Bunu, dokümanlar için [conv2d] (https://www.tensorflow.org/versions/master/api_docs/python/nn.html#conv2d) için işaret ediyorlar. Bunu [216] (https://github.com/tensorflow/tensorflow/issues/216) veya [175] (https://github.com/tensorflow/tensorflow/ adresine kadar) söylemenin daha kolay bir yolu olduğunu sanmıyorum. sorunlar/175) düzeltildi. einsum ('i, j, ijk', E, E, W) '! – mdaoust

+1

TensorFlow uygulamasında yeniden şekillendirmeler, aynı verileri bir kopya olmadan yeniden kullanır. Ancak TensorFlow, stridleri kullanmaz - tensörler her zaman sıralı sırada saklanır. – shoyer

0

Bir rütbe 3 tensörünü ve 2D dizi verir ve sonra e1 sonucu çarpın W ve e2 arasında bir vektör çarpma işlemini yapabilirsiniz. İzleyen fonksiyon, tensör ürün ve tensör kasılma kullanımı

import sympy as sp 

def tensor3_vector_product(T, v): 
    """Implements a product of a rank 3 tensor (3D array) with a 
     vector using tensor product and tensor contraction. 

    Parameters 
    ---------- 
    T: sp.Array of dimensions n x m x k 

    v: sp.Array of dimensions k x 1 

    Returns 
    ------- 
    A: sp.Array of dimensions n x m 

    """ 
    assert(T.rank() == 3) 
    # reshape v to ensure a 1D vector so that contraction do 
    # not contain x 1 dimension 
    v.reshape(v.shape[0],) 
    p = sp.tensorproduct(T, v) 
    return sp.tensorcontraction(p, (2, 3)) 

için ref sağlanan örnekleri kullanarak, bu çarpma doğrulayabilir, bu ürünün (örneğin, W * e3) tanımlamak için yapar. Yukarıdaki işlev ikinci ve üçüncü ekseni daraltır, sizin durumunuzda da (1, 2) sözleşme yapmanız gerektiğini düşünüyorum çünkü W benim durumumdaki gibi d x d x k ve k x d x d olarak tanımlanır.