我需要初始化一个棋盘格矩阵以在我的张量流图中合并两个特征图,我能够使用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/