我需要初始化一个棋盘格矩阵以在我的张量流图中合并两个特征图,我能够使用TF旁边的numpy这样的已知形状来做到这一点

def checkerboard_concat(x1, x2):

    mask1 = np.ones((10,10,3))
    mask1[1::2,::2] = 0
    mask1[::2,1::2] = 0

    mask2 = np.zeros((10,10,3))
    mask2[1::2,::2] = 1
    mask2[::2,1::2] = 1

    return x1 * mask1 + x2 * mask2

但是我无法使用动态形状来完成此操作,我使用tf.shape()返回形状为(N,)的输出,但是我不知道如何动态评估它。

此外,我尝试使用tf.ones_like(x1),但无法使用下标将其更改为numpy数组

最佳答案

这是一个基于模和异或运算的解决方案:

import tensorflow as tf

def make_checkerboard(N):
    """
    Return a NxN checkerboard matrix M, i.e. with M(i,j) == True if (i+j) mod 2 == 1
    :param N:   Length of the checkerboard (can be dynamic)
    :return:    Boolean tensor of shape NxN
    """
    range_n = tf.range(N)
    odd_ind = tf.cast(tf.mod(range_n, 2), dtype=tf.bool)

    odd_rows = tf.tile(tf.expand_dims(odd_ind , -1), [1, N])
    odd_cols = tf.tile(tf.expand_dims(odd_ind ,  0), [N, 1])

    checker = tf.logical_xor(odd_rows, odd_cols)
    return checker

def checkerboard_concat(x1, x2, is_batch=True):

    dynamic_n = tf.shape(x1)[1 if is_batch else 0]
    mask2 = make_checkerboard(dynamic_n)
    mask2 = tf.expand_dims(mask2, -1)   # Expand masks to cover channels
    mask1 = tf.logical_not(mask2)

    return x1 * tf.cast(mask1, dtype=x1.dtype) + x2 * tf.cast(mask2, dtype=x2.dtype)


# Example:
tf.reset_default_graph()
sess = tf.InteractiveSession()

x1 = tf.ones((4,4,3), dtype=tf.int32)
x2 = tf.ones((4,4,3), dtype=tf.int32) * 2

x = checkerboard_concat(x1, x2, is_batch=False)
res = sess.run(x)
print(res[...,0])
# [[1 2 1 2]
#  [2 1 2 1]
#  [1 2 1 2]
#  [2 1 2 1]]

关于tensorflow - 如何在 tensorflow 中制作棋盘格矩阵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49675921/

10-10 14:44