2015-12-05 14 views
16

私はthis paperを再実装するために取り組んでおり、キー操作は双一次テンソル積です。私はそれが何を意味するのかほとんど分かっていませんが、紙にはわかりやすい素敵なグラフィックがあります。TensorFlowの双一次テンソル積

enter image description here

キー操作がE_1 *のWの*のE_2である、と私は残り簡単なはずですので、tensorflowでそれを実装する方法を知りたいです。

基本的に、所定の三次元テンソルWは、行列にそれをスライスし、j番目のスライス(行列)のために、あるスカラー、その結果、E_1E_2によって各側面上に掛けますj番目のエントリを返します(この操作の出力)。

だから、別のd次元ベクトル、E_1の積を実行する、d次元ベクトル、 W 、D X D X Kテンソル、及びE_2。この製品は現在のようにTensorFlowで簡潔に表現できますか、何らかの形で自分のopを定義する必要がありますか? EARLIER

を編集し、なぜこれらのテンソルの仕事を乗算し、それが動作するように、より明示的に定義するためのいくつかの方法がありますしないのですか?

>>> 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) 
>>> 

エラーメッセージです

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

CURRENTLY

は、2つの3Dテンソルを掛けることのいずれかtf.matmulでは動作しないことが判明したので、しかしtf.batch_matmulありません。 tf.batch_matmulは3Dテンソルと行列も行います。次に、3Dとベクトルを試しました。

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

これは簡単な形で行うことができます。 – mdaoust

+0

論文を完成させましたか? – Apurv

答えて

12

これは簡単な形で行うことができます。 2つの行列乗算のうちの最初のものについては、k * d、長さdのベクトルが乗算されます。

これは近いはずである。

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

これを行うための「クリーナー」の方法はありませんか?それは、私がこれらのすべての形をやらなければならないということは、美的には気になりますが、それは私がしなければならないことなのです... テンソルフローはどのように再現されますか?彼らはすべての値を動かすのですか、それとも単に値を読み取るためのスキーマですか? –

+0

私は彼らがおそらくnumpyのような「スキーマ」の進歩を変えると思います。それは[超強力](http://scikit-image.org/docs/dev/api/skimage.util.html#view-as-windows)です。彼らは[conv2d](https://www.tensorflow.org/versions/master/api_docs/python/nn.html#conv2d)のドキュメントでこれを知っています。私は[216](https://github.com/tensorflow/tensorflow/issues/216)または[175](https://github.com/tensorflow/tensorflow/)までこれを簡単に言える方法はないと思います。問題/ 175)は修正されています。 'einsum( 'i、j、ijk'、E、E、W)'! – mdaoust

+1

TensorFlowの変形は、同じデータをコピーなしで再利用します。しかし、TensorFlowはストライドを使用しません。テンソルは常に行優先で格納されます。 – shoyer

0

あなたはランク3テンソルと2次元配列を生成して、E1で結果を掛けWとe2とのベクトル乗算を行うことができます。次の関数はテンソル積とテンソル収縮の使用は

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)) 

あなたはrefで提供されている例を使用して、この乗算を確認することができ、この製品(例えばWの*のE3)を定義することができます。上記の関数は2番目と3番目の軸を収縮させますが、Wが私の場合のようにd x d x kで定義されていてk x d x dではないので、(1、2)

関連する問題