2015-12-05 4 views
16

में बिलीनेर टेंसर उत्पाद मैं this paper को फिर से कार्यान्वित करने पर काम कर रहा हूं और मुख्य ऑपरेशन एक बिलीनेर टेंसर उत्पाद है। मुझे शायद ही पता है कि इसका क्या अर्थ है, लेकिन कागज में एक अच्छा छोटा ग्राफिक है, जिसे मैं समझता हूं।टेन्सोरफ्लो

enter image description here

कुंजी आपरेशन e_1 * डब्ल्यू * e_2 है, और मुझे पता है कि कैसे tensorflow में इसे लागू करने, क्योंकि बाकी आसान होना चाहिए चाहते हैं।

असल में, यह देखते हुए 3 डी टेन्सर डब्ल्यू, यह मैट्रिक्स में काट, और j'th टुकड़ा (एक मैट्रिक्स) के लिए, e_1 और e_2 द्वारा प्रत्येक पक्ष पर गुणा, एक अदिश है, जो है, जिसके परिणामस्वरूप परिणामी वेक्टर (इस ऑपरेशन के आउटपुट) में जेठ प्रविष्टि।

तो मैं डब्ल्यूe_1, एक घ आयामी वेक्टर, का एक उत्पाद प्रदर्शन करने के लिए चाहते हैं, घ एक्स डी एक्स कश्मीर टेन्सर, और e_2, एक और घ आयामी वेक्टर। क्या यह उत्पाद टेंसरफ्लो में संक्षेप में व्यक्त किया जा सकता है क्योंकि यह अब है, या मुझे किसी भी तरह अपना खुद का सेशन परिभाषित करना होगा?

पहले किए गए संपादन

इन tensors काम क्यों गुणा नहीं करता है, और वहाँ किसी तरह इसे और अधिक स्पष्ट रूप से इतना है कि यह काम करता है परिभाषित करने के लिए है?

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

वर्तमान

बाहर कर देता है कि दो 3D tensors गुणा या तो tf.matmul साथ काम नहीं करता है, इसलिए लेकिन tf.batch_matmul करता है। tf.batch_matmul 3 डी टेंसर और मैट्रिस भी करेगा। फिर मैंने 3 डी और वेक्टर की कोशिश की:

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

आप इसे एक सरल reshape के साथ कर सकते हैं। – mdaoust

+0

क्या आपने पेपर को लागू करने का अंत किया था? – Apurv

उत्तर

12

आप इसे एक साधारण reshape के साथ कर सकते हैं। दो मैट्रिक्स के पहले गुणों के लिए, आपके पास डॉट उत्पाद के लिए के * डी, लंबाई डी वैक्टर हैं।

यह पास होना चाहिए:

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

क्या ऐसा करने का कोई "क्लीनर" तरीका नहीं है?यह मुझे सौंदर्यशास्त्र से परेशान करता है कि मुझे इन सभी reshapes करना होगा, लेकिन अगर मुझे ऐसा करना है ... tensorflow में reshapes को कैसे लागू किया जाता है? क्या वे सभी मूल्यों को चारों ओर ले जाते हैं, या क्या यह मूल्यों को पढ़ने के लिए सिर्फ एक स्कीमा है? –

+0

मुझे लगता है कि वे शायद 'स्कीमा' उर्फ ​​की तरफ बदलते हैं, जैसे numpy में। यह [सुपर-शक्तिशाली] है (http://scikit-image.org/docs/dev/api/skimage.util.html#view-as- विन्डोज़)। वे [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) तय कर रहे हैं। 'ईन्सम (' मैं, जे, आईजेके ', ई, ई, डब्ल्यू) '! – mdaoust

+1

टेंसरफ्लो में रीशेप्स एक प्रतिलिपि के बिना एक ही डेटा का पुन: उपयोग करते हैं। लेकिन TensorFlow strides का उपयोग नहीं करता है - टेंसर हमेशा पंक्ति-प्रमुख क्रम में संग्रहीत होते हैं। – shoyer

0

आप एक रैंक 3 टेंसर, और जो एक 2 डी सरणी पैदावार और उसके बाद E1 के साथ परिणाम गुणा डब्ल्यू और e2 के बीच एक सदिश गुणन प्रदर्शन कर सकते हैं। निम्नलिखित समारोह टेन्सर उत्पाद और टेन्सर संकुचन के उपयोग इस उत्पाद (जैसे डब्ल्यू * E3) को परिभाषित करने

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 में दिए गए उदाहरणों का उपयोग करके इस गुणा सत्यापित कर सकते हैं बनाता है। उपर्युक्त फ़ंक्शन दूसरे और तीसरे अक्ष को अनुबंधित करता है, आपके मामले में मुझे लगता है कि आपको अनुबंध करना चाहिए (1, 2) क्योंकि डब्ल्यू को डी एक्स डी एक्स के रूप में परिभाषित किया गया है और मेरे मामले में के एक्स डी एक्स डी नहीं है।