gpt4 book ai didi

python - Tensorflow 循环中的切片分配

转载 作者:行者123 更新时间:2023-12-01 09:31:56 28 4
gpt4 key购买 nike

我有一个由 0 组成的 5x3 矩阵,我想在 while_loop 中用 1 来更新它。我想使用循环变量作为 scatter_nd_update 函数的索引参数。我的代码是这样的:

# Zeros matrix
num = tf.get_variable('num', shape=[5, 3], initializer=tf.zeros_initializer(), dtype=tf.float32)
# Looping variable
i = tf.constant(0, dtype=tf.int32)
# Conditional
c = lambda i, num: tf.less(i, 2)
def body(i, num):
# Update values
updates = tf.ones([1, 3], dtype=tf.float32)
num = tf.scatter_nd_update(num, [[i]], updates)
return tf.add(i, 1), num
i, num = tf.while_loop(c, body, [i, num])
# Session
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
num_out = sess.run(num)
print(num_out.shape)
print(num_out)

这会抛出一个错误:AttributeError: 'Tensor' object has no attribute 'handle' 并指向行 num = tf.scatter_nd_update(num, [[i]] ,更新)

当我通过使用不同的 i 值运行 num = tf.scatter_nd_update(num, [[i]], update) 两次而无需循环地运行此代码时,它就可以工作,并且得到一个矩阵2 行,但是当我在 while_loop 中尝试相同的操作时会发生此错误。

最佳答案

该问题围绕以下事实展开:tf.scatter_nd_update()需要一个变量来更改,而 tf.while_loop()使用张量作为循环变量。从根本上来说,tf.while_loop()设置图表时运行循环,而 tf.scatter_nd_update()是一个在网络运行时运行的操作

换句话说,您创建的网络将具有三个 num 张量:一个带有原始零,然后在另一个后面替换第一行,然后在另一个后面替换前两行被替换。要实现这一点,您可以使用此代码(经过测试),更多说明如下:

import tensorflow as tf
num = tf.zeros( shape = ( 5, 3 ), dtype = tf.float32 )
# Looping variable
i = tf.zeros( shape=(), dtype=tf.int32)
# Conditional
c = lambda i, num: tf.less(i, 2)
def body(i, num):
# Update values
updates = tf.ones([1, 3], dtype=tf.float32)
num_shape = num.get_shape()
num = tf.concat( [ num[ : i ], updates, num[ i + 1 : ] ], axis = 0 )
num.set_shape( num_shape )
return tf.add(i, tf.ones( shape=(), dtype = tf.int32 ) ), num
i, num = tf.while_loop( c, body, [ i, num ] )
# Session
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
num_out = sess.run( [ num ] )
print(num_out)

输出:

[array([[1., 1., 1.],
[1., 1., 1.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]], dtype=float32)]

首先,请注意我已将 num 从变量更改为张量。这将允许它在tf.while_loop()中用作循环变量。 。其次,分散操作在张量上没有很好的方法,所以我基本上将 num 分开(before-i 和 after-i ,并在其间插入update)。我们还必须设置 num 的形状,否则 tf.while_loop()会提示形状不确定(因为 tf.concat() ;有一种方法可以通过在 tf.while_loop() 中使用 shape_invariants 参数来解决这个问题,但这对于我们的情况来说更容易。)

关于python - Tensorflow 循环中的切片分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49886322/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com