Tensorflow 什么是生成“a”的好方法;“对称阶梯”;或;相邻的;使用张量流的矩阵?

Tensorflow 什么是生成“a”的好方法;“对称阶梯”;或;相邻的;使用张量流的矩阵?,tensorflow,matrix,Tensorflow,Matrix,(更新我忘了说输入是批处理的)给定bool数组,例如,[[false,false,false,true,false,false],[false,true,false,false,false,true,false],其中“true”定义了单独序列的边界。我想生成一个相邻矩阵,表示由边界分隔的不同组。使用Tensorflow生成以下“对称阶梯”矩阵的好方法是什么 [[ [1 1 1 0 0 0 0 0 0] [1 1 1 0 0 0 0 0 0] [1 1 1 0 0

(更新我忘了说输入是批处理的)给定bool数组,例如,
[[false,false,false,true,false,false],[false,true,false,false,false,true,false]
,其中“true”定义了单独序列的边界。我想生成一个相邻矩阵,表示由边界分隔的不同组。使用Tensorflow生成以下“对称阶梯”矩阵的好方法是什么

    [[
    [1 1 1 0 0 0 0 0 0]
    [1 1 1 0 0 0 0 0 0]
    [1 1 1 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0]
    [0 0 0 0 1 1 0 0 0]
    [0 0 0 0 1 1 0 0 0]
    [0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 1 1]
    [0 0 0 0 0 0 0 1 1]
    ]
    [
    [1 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0]
    ]]
2018年6月15日更新: 实际上,我在这个问题上取得了一些进展,如果我能将输入信号从[false,false,false,true,false,false]转换为[1,1,1,0,2,2,0,3,3],我可以使用下面的Tensorflow代码得到一些结果。但我不确定是否有向量运算可以将[false,false,false,true,false,false,true,false]转换为[1,1,1,0,2,2,0,3]

import tensorflow as tf
sess = tf.Session()

x = tf.constant([1, 1, 1, 0, 2, 2, 0, 3, 3], shape=(9, 1), dtype=tf.int32)
y = tf.squeeze(tf.cast(tf.equal(tf.expand_dims(x, 1), x), tf.int32))
print(sess.run(y))
[[1 1 1 0 0 0 0 0 0]
 [1 1 1 0 0 0 0 0 0]
 [1 1 1 0 0 0 0 0 0]
 [0 0 0 1 0 0 1 0 0]
 [0 0 0 0 1 1 0 0 0]
 [0 0 0 0 1 1 0 0 0]
 [0 0 0 1 0 0 1 0 0]
 [0 0 0 0 0 0 0 1 1]
 [0 0 0 0 0 0 0 1 1]]
最终更新: 我从@Willem Van Onsem那里得到了很多灵感。 对于批处理版本,可以通过从@Willem Van Onsem solution修改一点来解决

import tensorflow as tf
b = tf.constant([[False, False, False, True, False, False, True, False, False], [False, True, False, False, False, False, False, False, False]], shape=(2, 9, 1), dtype=tf.int32)
x = (1 + tf.cumsum(tf.cast(b, tf.int32), axis=1))  * (1-b)
x = tf.cast(tf.equal(x, tf.transpose(x, perm=[0,2,1])),tf.int32) - tf.transpose(b, perm=[0,2,1])*b


with tf.Session() as sess:
  print(sess.run(x))
但我不确定是否有向量运算可以将
[False,False,False,True,False,False,False,False,False,False]
转换为
[1,1,1,0,2,2,0,3,3]

有下面的例子:

b = tf.constant([False, False, False, True, False, False, True, False, False], shape=(9,), dtype=tf.int32)
然后我们可以使用生成:

>>> print(sess.run(1+tf.cumsum(b)))
[1 1 1 2 2 2 3 3 3]
如果我们将这些值与
b
的反方向相乘,我们得到:

>>> print(sess.run((1+tf.cumsum(b))*(1-b)))
[1 1 1 0 2 2 0 3 3]
因此,我们可以将此表达式存储在变量中,例如
x

x = (1+tf.cumsum(b))*(1-b)
我想生成一个相邻矩阵,表示由边界分隔的不同组。使用Tensorflow生成以下“对称阶梯”矩阵的好方法是什么

    [[
    [1 1 1 0 0 0 0 0 0]
    [1 1 1 0 0 0 0 0 0]
    [1 1 1 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0]
    [0 0 0 0 1 1 0 0 0]
    [0 0 0 0 1 1 0 0 0]
    [0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 1 1]
    [0 0 0 0 0 0 0 1 1]
    ]
    [
    [1 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 1 1 1 1 1 0 0]
    [0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0]
    ]]
如果我们遵循您的方法,我们只需删除两个列表同时为
0
的点。我们可以通过以下方式做到这一点:

tf.cast(tf.equal(x, tf.transpose(x)),tf.int32) - tf.transpose(b)*b
所以这里我们使用你的方法,我们基本上广播
x
,和
x
的转置,检查元素相等,然后从中减去
b
的元素相乘。这将产生:

>>> print(sess.run(tf.cast(tf.equal(x, tf.transpose(x)),tf.int32) - tf.transpose(b)*b))
[[1 1 1 0 0 0 0 0 0]
 [1 1 1 0 0 0 0 0 0]
 [1 1 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 1 0 0 0]
 [0 0 0 0 1 1 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 1]
 [0 0 0 0 0 0 0 1 1]]

太棒了,谢谢你。我想知道输入是否可能不是单个向量?例如,b=tf.常量([[False,False,False,True,False,False,False],[False,False,False,True,False,False]],shape=(9,2),dtype=tf.int32)@Hypnoz:那么输出应该是什么呢?4d张量?实际上我认为它是3d张量。因为之前的输出是2d张量,现在我们只需要第一个维度作为批处理。我刚刚更新了问题。似乎tf.equal在这种情况下不起作用。@Hypnoz:ha,你是说原始问题的矢量化版本?@Willen我想我可能需要一个批量版本的答案。输入是[bastch_size,d,]bool张量,输出是[batch_size,d,d](在我的例子中,d=9)。我也在尝试这一点,但它似乎更难。