Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归分配给Tensorflow中的变量切片_Tensorflow_Variables_Slice_Assign - Fatal编程技术网

递归分配给Tensorflow中的变量切片

递归分配给Tensorflow中的变量切片,tensorflow,variables,slice,assign,Tensorflow,Variables,Slice,Assign,我想递归地为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].assig

我想递归地为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()
    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()
但这将返回一条错误消息:

    ---> 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
我知道'assign'返回的不是'Variable',因此在下一个循环中传递'a'将 再也找不到“变量”了

然后我试着:

    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()
    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变量片赋值吗?

这里有一些关于使用
tf.variable
assign()的见解

第一个失败的解决方案 当您执行
A.assign(B)
时,它实际上返回一个张量(即不是
tf.Variable
)。所以它在第一次迭代中起作用。从下一次迭代开始,您将尝试为
tf.Tensor
赋值,这是不允许的

第二个失败的解决方案 这又是一个非常糟糕的主意,因为您正在循环中创建变量。如果做得足够多,您的内存就会耗尽。但这甚至不会运行,因为您最终遇到了一个可怕的死锁。您正试图创建一个带有张量的变量,该张量将在图形执行时计算。要执行图形,需要变量

正确的方法 我能想到的最好的方法是
test\u loss
返回更新操作,并将
n
设置为TensorFlow占位符。在运行会话的每次迭代中,您都会将一个值传递给
n
(即当前迭代)


谢谢你的洞察力。我觉得在这种情况下,使用PyTorch是一个更好的范例(更“pythonic”)。我同意如果你有动态操作,你可以使用PyTorch。但您也可以尝试一下TF2。他们转向了急切执行,这意味着张量会立即执行。
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}))