如何在不破坏原始张量的情况下翻转张量流张量中的单个位?

时间:2020-10-12 23:32:48

标签: python numpy tensorflow

我有一个数组arr = tf.Variable(initial_value=[True, False, True], dtype=tf.bool) 现在,我需要翻转arr并将其在会话期间分配给新变量。我必须对循环中的每一位都执行此操作。

我可以在arr中进行就地替换,但会破坏原始张量arr 如下所示(不正确!)

import tensorflow as tf

arr = tf.Variable(initial_value=[True, False, True], dtype=tf.bool)
flipped_bit = tf.placeholder(dtype=tf.int32, shape=())
flipped_arr = tf.assign(arr[flipped_bit],
                        tf.math.logical_not(arr[flipped_bit]))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print('Original', sess.run(arr))
for i in range(0, 3):
    print('flipped arr', i, sess.run(flipped_arr, feed_dict={flipped_bit: i}))

现在,我有一个创建遮罩的解决方案,但是我们可以仅通过使用tensorflow来做到这一点吗?

我有解决方案。

import tensorflow as tf
import numpy as np

arr = tf.Variable(initial_value=[True, False, True],
                  trainable=False,
                  dtype=tf.bool)

mask = tf.placeholder(dtype=tf.bool, shape=arr.shape)
flipped_arr = tf.math.logical_xor(arr, mask)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print('Original', sess.run(arr))
for flip_bit in range(0, 3):
    mask_val = np.zeros(arr.shape)
    mask_val[flip_bit] = 1
    print('mask', mask_val)
    print(
        'flip_arr', flip_bit,
        sess.run(flipped_arr,
                 feed_dict={
                     flipped_bit: flip_bit,
                     mask: mask_val
                 }))

1 个答案:

答案 0 :(得分:0)

您可以在TF2中执行以下操作。我相信您可以在TF1中执行相同的操作。

arr = tf.constant([True, True, False], dtype=tf.bool)
flip = tf.constant([True, False, True], dtype=tf.bool)
flipped_arr = tf.math.logical_xor(arr, flip)

tf.print(arr, flipped_arr) # prints: [1 1 0] [0 1 1]