gpt4 book ai didi

python-2.7 - 如何在Tensorflow中进行切片分配

转载 作者:行者123 更新时间:2023-12-03 11:47:12 26 4
gpt4 key购买 nike

我发现Tensorflow提供了scatter_update()将值分配给0维中的张量切片。例如,如果张量T是三维的,则可以将值v[1, :, :]分配给T[i, :, :]

a = tf.Variable(tf.zeros([10,36,36]))   
value = np.ones([1,36,36])
d = tf.scatter_update(a,[0],value)

with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print a.eval()
sess.run(d)
print a.eval()


但是如何为 v[1,1,:]分配值 T[i,j,:]

a = tf.Variable(tf.zeros([10,36,36]))   
value1 = np.random.randn(1,1,36)
e = tf.scatter_update(a,[0],value1) #Error

with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print a.eval()
sess.rum(e)
print a.eval()


TF是否提供其他功能或执行此操作的简单方法?

最佳答案

我相信您需要的是ticket #206中讨论的assign_slice_update。但是,它尚不可用。

更新:现在已实现。请参阅jdehesa的答案:https://stackoverflow.com/a/43139565/6531137



assign_slice_update(或scatter_nd())可用之前,您可以构建所需行的块,其中包含您不想修改的值以及所需更新的值,如下所示:

import tensorflow as tf

a = tf.Variable(tf.ones([10,36,36]))

i = 3
j = 5

# Gather values inside the a[i,...] block that are not on column j
idx_before = tf.concat(1, [tf.reshape(tf.tile(tf.Variable([i]), [j]), [-1, 1]), tf.reshape(tf.range(j), [-1, 1])])
values_before = tf.gather_nd(a, idx_before)
idx_after = tf.concat(1, [tf.reshape(tf.tile(tf.Variable([i]), [36-j-1]), [-1, 1]), tf.reshape(tf.range(j+1, 36), [-1, 1])])
values_after = tf.gather_nd(a, idx_after)

# Build a subset of tensor `a` with the values that should not be touched and the values to update
block = tf.concat(0, [values_before, 5*tf.ones([1, 36]), values_after])

d = tf.scatter_update(a, i, block)

with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
sess.run(d)
print(a.eval()[3,4:7,:]) # Print a subset of the tensor to verify


该示例生成一个张量张量并执行 a[i,j,:] = 5。大多数复杂性在于获取我们不想修改的值, a[i,~j,:](否则, scatter_update()将替换这些值)。

如果要按要求执行 T[i,k,:] = a[1,1,:],则需要将上一示例中的 5*tf.ones([1, 36])替换为 tf.gather_nd(a, [[1, 1]])

另一种方法是创建一个掩码以从中 tf.select()所需元素并将其分配回变量,如下所示:

import tensorflow as tf

a = tf.Variable(tf.zeros([10,36,36]))

i = tf.Variable([3])
j = tf.Variable([5])

# Build a mask using indices to perform [i,j,:]
atleast_2d = lambda x: tf.reshape(x, [-1, 1])
indices = tf.concat(1, [atleast_2d(tf.tile(i, [36])), atleast_2d(tf.tile(j, [36])), atleast_2d(tf.range(36))])
mask = tf.cast(tf.sparse_to_dense(indices, [10, 36, 36], 1), tf.bool)

to_update = 5*tf.ones_like(a)
out = a.assign( tf.select(mask, to_update, a) )

with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
sess.run(out)
print(a.eval()[2:5,5,:])


就内存而言,它的效率可能较低,因为它需要两倍的内存来处理类似 ato_update变量,但是您可以轻松修改最后一个示例,以从 tf.select(...)节点获取梯度保留操作。您可能还会对以下另一个StackOverflow问题感兴趣: Conditional assignment of tensor values in TensorFlow

那些笨拙的扭曲应该替换为对适当的TensorFlow函数的调用(如果有)。

关于python-2.7 - 如何在Tensorflow中进行切片分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39157723/

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