我发现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()
Run Code Online (Sandbox Code Playgroud)
但是如何赋值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()
Run Code Online (Sandbox Code Playgroud)
是否有TF提供的其他功能或简单的方法?
我想复制以下numpy代码tensorflow.例如,我想为0之前具有值的所有张量索引分配一个1.
a = np.array([1, 2, 3, 1])
a[a==1] = 0
# a should be [0, 2, 3, 0]
Run Code Online (Sandbox Code Playgroud)
如果我写相似的代码tensorflow我得到以下错误.
TypeError: 'Tensor' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
方括号中的条件应该是任意的,如a[a<1] = 0.
有没有办法实现这种"条件分配"(缺少一个更好的名字)tensorflow?
我想根据索引在张量中分配值.
例如,根据池值和tf.nn.max_pool_with_argmax的相应索引输出,我想将这些池值重新放回到具有索引的原始拆分Tensor中.
我发现输出指数tf.nn.max_pool_with_argmax是扁平的.一个问题:如何将它们解开回Tensorflow中的坐标?
另一个问题:如果给出索引,如何将池化张量的每个值分配给Tensorflow中原始解析张量的位置?
非常感谢你.
我试图制作代码来实现这一点,但我可以使用numpy.我不知道如何tf.nn.max_pool_with_argmax在Tensorflow中分配到unpooling张量之后获得平坦的索引.
ksize = 3
stride = 1
input_image = tf.placeholder(tf.float32, name='input_image')
#conv1
kernel = tf.Variable(tf.truncated_normal([ksize, ksize, 3, 16],stddev=0.1),
name='kernel')
conv = tf.nn.conv2d(input_image, kernel, [1,stride,stride,1], padding='SAME')
biases = tf.Variable(tf.constant(0.0, shape = [16]), name = 'biases')
bias = tf.nn.bias_add(conv, biases)
conv1 = tf.nn.relu(bias, name='conv1')
#pool1
pool1, pool1_indices = tf.nn.max_pool_with_argmax(conv1, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1],
padding='SAME', name='pool1')
#upsample by assigning the values of pool1 to the position …Run Code Online (Sandbox Code Playgroud) 这个问题的两个部分:
(1)更新张量流中张量子集的最佳方法是什么?我看过几个相关的问题:
在Tensor中调整单值 - TensorFlow 以及 如何在Tensorflow中更新2D张量的子集?
我知道可以使用Variable.assign()(和/或scatter_update等)来分配Variable对象,但是对于我来说,tensorflow没有更直观的方式来更新Tensor的一部分似乎很奇怪宾语.我已经搜索了tensorflow api文档和stackoverflow很长一段时间了,似乎找不到比上面链接中提供的更简单的解决方案.这看起来特别奇怪,特别是考虑到Theano与Tensor.set_subtensor()具有相同的版本.我错过了什么,或者目前通过tensorflow api没有简单的方法吗?
(2)如果有更简单的方法,它是否可以区分?
谢谢!
假设我有以下张量t作为softmax函数的输出:
t = tf.constant(value=[[0.2,0.8], [0.6, 0.4]])
>> [ 0.2, 0.8]
[ 0.6, 0.4]
Run Code Online (Sandbox Code Playgroud)
现在我想将此矩阵t转换为类似于OneHot编码矩阵的矩阵:
Y.eval()
>> [ 0, 1]
[ 1, 0]
Run Code Online (Sandbox Code Playgroud)
我很熟悉c = tf.argmax(t)那会给我每行的指数t应该是1.但是从那里c开始Y似乎很难.
我已经尝试过转换t为tf.SparseTensor使用c然后使用tf.sparse_tensor_to_dense()来获取Y.但是这种转换涉及相当多的步骤并且对于任务来说似乎有点过头了 - 我甚至还没完成它,但我确信它可以工作.
有没有更合适/简单的方法来进行我失踪的转换.
我需要这个的原因是因为我在Python中有一个自定义的OneHot编码器,我可以在其中提供Y.tf.one_hot()不够广泛 - 不允许自定义编码.
相关问题:
我正在寻找一个“更新”功能,发生在张量t1,一些指标和值,并返回一个新的张量t2,这是t1但在相应改变的指标值。
这似乎是最基本的功能,但是我没有在文档中看到它。
我所看到的是tf.scatter_update,它Variable以某种方式更新了:,这正是我想要的。我可以想像构造一个Variablefor t2(这项工作吗?),但是t2不应认为它是有状态的变量,而是用任意初始值填充它。
或者,我可以手动构建一个Python的嵌套列表中添加的每个元素t1和t2独立,然后调用tf.convert_to_tensor。我可能是错的,但这似乎效率很低。
下面的代码添加一些特定位置的张量内指数(感谢@ mrry的答案在这里)。
indices = [[1, 1]] # A list of coordinates to update.
values = [1.0] # A list of values corresponding to the respective
# coordinate in indices.
shape = [3, 3] # The shape of the corresponding dense tensor, same as `c`.
delta = tf.SparseTensor(indices, values, shape)
Run Code Online (Sandbox Code Playgroud)
例如,鉴于此 -
c = tf.constant([[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]])
Run Code Online (Sandbox Code Playgroud)
它会在 [1, 1] 处加 1,结果是
[[0.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 0.0]])
Run Code Online (Sandbox Code Playgroud)
问题- …
我想检查批次中的偶数和奇数元素,并在需要时交换它们。我设法得到两个我想交织的张量:
def tf_oplu(x, name=None):
even = x[:,::2] #slicing into odd and even parts on the batch
odd = x[:,1::2]
even_flatten = tf.reshape(even, [-1]) # flatten tensors
#in row-major order to apply function across them
odd_flatten = tf.reshape(odd, [-1])
compare = tf.to_float(even_flatten<odd_flatten)
compare_not = tf.to_float(even_flatten>=odd_flatten)
#def oplu(x,y): # trivial function
# if x<y : # (x<y)==1
# return y, x
# else:
# return x, y # (x<y)==0
even_flatten_new = odd_flatten * compare + even_flatten * compare_not
odd_flatten_new = odd_flatten * …Run Code Online (Sandbox Code Playgroud)