我有一个一维数据(浮点数),如下所示:
[-8。,18.,9.,-3。,12.,11.,-13。,38.,...]
我想用相等数量的零替换每个负元素。 对于上面的示例,我的结果将类似于以下内容:
[0。,0.,0.,0.,0.,0.,0.,0.,18.,9.,0.,0.,0.,12.,...]
我可以通过使用tf.py_func()在Tensorflow中做到这一点。 但是事实证明,如果我使用该方法,则该图不可序列化。
是否存在可以帮助我获得相同结果的本机tensorflow操作?
答案 0 :(得分:0)
这不是一项简单的任务!这是一个纯TensorFlow实现:
import tensorflow as tf
# Input vector
inp = tf.placeholder(tf.int32, [None])
# Find positive and negative indices
mask = inp < 0
num_inputs = tf.size(inp)
pos_idx, neg_idx = tf.dynamic_partition(tf.range(num_inputs), tf.cast(mask, tf.int32), 2)
# Negative values
negs = -tf.gather(inp, neg_idx)
total_neg = tf.reduce_sum(negs)
cum_neg = tf.cumsum(negs)
# Compute the final index of each positive element
pos_neg_idx = tf.cast(pos_idx[:, tf.newaxis] > neg_idx, inp.dtype)
neg_ref = tf.reduce_sum(pos_neg_idx, axis=1)
shifts = tf.gather(tf.concat([[0], cum_neg], axis=0), neg_ref) - neg_ref
final_pos_idx = pos_idx + shifts
# Compute the final size
final_size = num_inputs + total_neg - tf.size(negs)
# Make final vector by scattering positive values
result = tf.scatter_nd(final_pos_idx[:, tf.newaxis], tf.gather(inp, pos_idx), [final_size])
with tf.Session() as sess:
print(sess.run(result, feed_dict={inp: [-1, 1, -2, 2, 1, -3]}))
输出:
[0 1 0 0 2 1 0 0 0]
此解决方案中有一些“超出必要”的计算成本,即通过pos_neg_idx
计算正元素的最终索引,即O( n 2 < / sup>),而可以在O( n )中迭代完成。但是,我无法想到一种迭代地复制循环的方法,并且TensorFlow循环(使用tf.while_loop
)会很尴尬且缓慢。无论如何,除非您使用很大的向量(正值和负值均匀分布),否则这不是什么大问题。