मैं एक Tensorflow (1.15) चर में स्लाइस के लिए मूल्यों को पुनरावर्ती रूप से असाइन करना चाहता हूं।

उदाहरण के लिए, यह काम करता है:

    def test_loss():

        m = tf.Variable(1)
        n = 3

        A = tf.Variable(tf.zeros([10., 20., 30.]))
        B = tf.Variable(tf.ones([10., 20., 30.]))
        A = A[m+1:n+1, 10:12, 20:22].assign(B[m:n, 2:4, 3:5])

        return 1

    test_loss()
    Out: 1

तब मैंने कोशिश की:

    def test_loss():

        m = tf.Variable(1)
        #n = 3

        A = tf.Variable(tf.zeros([10., 20., 30.]))
        B = tf.Variable(tf.ones([10., 20., 30.]))

        for n in range(5):
            A = A[m+1:n+1, 10:12, 20:22].assign(B[m:n, 2:4, 3:5])

        return 1

    test_loss()

लेकिन यह एक त्रुटि संदेश देता है:

    ---> 10         A = A[m+1:n+1, 10:12, 20:22].assign(B[m:n, 2:4, 3:5])
    ...
    ValueError: Sliced assignment is only supported for variables

मैं समझ गया कि जो 'असाइन' रिटर्न 'वेरिएबल' नहीं है, इसलिए अगले लूप पास 'ए' में अब 'वेरिएबल' नहीं मिलेगा।

तब मैंने कोशिश की:

    def test_loss():

        m = tf.Variable(1)
        #n = 3

        A = tf.Variable(tf.zeros([10., 20., 30.]))
        B = tf.Variable(tf.ones([10., 20., 30.]))

        for n in range(5):
            A = tf.Variable(A[m+1:n+1, 10:12, 20:22].assign(B[m:n, 2:4, 3:5]))

        return 1

    test_loss()

और फिर मुझे मिला:

    InvalidArgumentError: Input 'ref' passed float expected ref type while building NodeDef...

कृपया किसी भी विचार के बारे में मैं Tensorflow चर स्लाइस के लिए मूल्यों को पुनरावर्ती रूप से असाइन कर सकता हूं?

0
Paulo Pacheco 18 नवम्बर 2019, 19:59

1 उत्तर

सबसे बढ़िया उत्तर

यहां tf.Variable और assign() का उपयोग करने के बारे में कुछ जानकारी दी गई है।

पहला समाधान जो विफल रहा

for n in range(5):
            A = A[m+1:n+1, 10:12, 20:22].assign(B[m:n, 2:4, 3:5])

जब आप A.assign(B) करते हैं, तो यह वास्तव में एक टेंसर देता है (यानी tf.Variable नहीं)। तो यह पहले पुनरावृत्ति पर काम करता है। अगले पुनरावृत्ति से, आप tf.Tensor को मान निर्दिष्ट करने का प्रयास कर रहे हैं, जिसकी अनुमति नहीं है।

दूसरा समाधान जो विफल रहा

for n in range(5):
            A = tf.Variable(A[m+1:n+1, 10:12, 20:22].assign(B[m:n, 2:4, 3:5]))

यह फिर से एक बहुत बुरा विचार है, क्योंकि आप लूप के भीतर चर बना रहे हैं। यह पर्याप्त करो और तुम स्मृति से बाहर हो जाओगे। लेकिन यह भी नहीं चलेगा, क्योंकि आप एक भयानक गतिरोध के साथ समाप्त हो गए हैं। आप कुछ टेंसर के साथ वैरिएबल बनाने की कोशिश कर रहे हैं जिसकी गणना ग्राफ़ के निष्पादित होने पर की जाएगी। और ग्राफ को निष्पादित करने के लिए, आपको वेरिएबल्स की आवश्यकता होती है।

ऐसा करने का सही तरीका

ऐसा करने का सबसे अच्छा तरीका मैं यह सोच सकता हूं कि test_loss अपडेट ऑपरेशन को वापस कर दें और आप n को TensorFlow प्लेसहोल्डर बना दें। और सत्र चलाते समय प्रत्येक पुनरावृत्ति पर, आप n (जो वर्तमान पुनरावृत्ति है) के लिए एक मान पास करते हैं।

def test_loss(n):

        m = tf.Variable(1)
        #n = 3

        A = tf.Variable(tf.zeros([10., 20., 30.]))
        B = tf.Variable(tf.ones([10., 20., 30.]))

        update = A[m+1:n+1, 10:12, 20:22].assign(B[m:n, 2:4, 3:5])        

        return update

with tf.Session() as sess:

    tf_n = tf.placeholder(shape=None, dtype=tf.int32, name='n')
    update_op = test_loss(tf_n)
    print(type(update_op))
    tf.global_variables_initializer().run()
    for n in range(5):
      print(1)
      #print(sess.run(update_op, feed_dict={tf_n: n}))

0
thushv89 19 नवम्बर 2019, 06:37