in tfops.py [0:0]
def shuffle_features(name, h, indices=None, return_indices=False, reverse=False):
with tf.variable_scope(name):
rng = np.random.RandomState(
(abs(hash(tf.get_variable_scope().name))) % 10000000)
if indices == None:
# Create numpy and tensorflow variables with indices
n_channels = int(h.get_shape()[-1])
indices = list(range(n_channels))
rng.shuffle(indices)
# Reverse it
indices_inverse = [0]*n_channels
for i in range(n_channels):
indices_inverse[indices[i]] = i
tf_indices = tf.get_variable("indices", dtype=tf.int32, initializer=np.asarray(
indices, dtype='int32'), trainable=False)
tf_indices_reverse = tf.get_variable("indices_inverse", dtype=tf.int32, initializer=np.asarray(
indices_inverse, dtype='int32'), trainable=False)
_indices = tf_indices
if reverse:
_indices = tf_indices_reverse
if len(h.get_shape()) == 2:
# Slice
h = tf.transpose(h)
h = tf.gather(h, _indices)
h = tf.transpose(h)
elif len(h.get_shape()) == 4:
# Slice
h = tf.transpose(h, [3, 1, 2, 0])
h = tf.gather(h, _indices)
h = tf.transpose(h, [3, 1, 2, 0])
if return_indices:
return h, indices
return h