Tensorflow 中的向量偏移(滚动)

Vector shift (Roll) in Tensorflow

比方说,我们确实想使用 Keras/TensorFlow 处理图像(或 ndim 向量)。 我们希望,为了奇特的正则化,将每个输入向左移动随机数量的位置(溢出部分重新出现在右侧)。

如何查看和解决:

1)

TensorFlow 的 numpy roll 函数有任何变化吗?

2)

x - 2D tensor
ri - random integer
concatenate(x[:,ri:],x[:,0:ri], axis=1) #executed for each single input to the layer, ri being random again and again (I can live with random only for each batch)

我不得不自己做这件事,不幸的是,我认为没有 tensorflow op 可以做 np.roll。你上面的代码看起来基本上是正确的,除了它不是按 ri 滚动,而是按 (x.shape[1] - ri) 滚动。

另外你需要小心选择你的随机整数,它来自 range(1,x.shape[1]+1) 而不是 range(0,x.shape[1]) ,如果 ri 为 0,则 x[:,0:ri] 将为空。

所以我建议的更像是(沿着维度 1 滚动):

x_len = x.get_shape().as_list()[1] 
i = np.random.randint(0,x_len) # The amount you want to roll by
y = tf.concat([x[:,x_len-i:], x[:,:x_len-i]], axis=1)

编辑:在 hannes 的正确评论后添加了缺失的冒号。

在 TensorFlow v1.15.0 及更高版本中,您可以使用 tf.roll,它的工作方式与 numpy roll 类似。 https://github.com/tensorflow/tensorflow/pull/14953。 要改进上述答案,您可以这样做:

# size of x dimension
x_len = tensor.get_shape().as_list()[1]
# random roll amount
i = tf.random_uniform(shape=[1], maxval=x_len, dtype=tf.int32)
output = tf.roll(tensor, shift=i, axis=[1])

对于从 v1.6.0 开始的旧版本,您将不得不使用 tf.manip.roll :

# size of x dimension
x_len = tensor.get_shape().as_list()[1]
# random roll amount
i = tf.random_uniform(shape=[1], maxval=x_len, dtype=tf.int32)
output = tf.manip.roll(tensor, shift=i, axis=[1])