递归分配给Tensorflow中的变量切片
我想递归地为Tensorflow(1.15)变量中的切片赋值 举例来说,这是可行的:递归分配给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
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}))