Tensorflow 什么是生成“a”的好方法;“对称阶梯”;或;相邻的;使用张量流的矩阵?
(更新我忘了说输入是批处理的)给定bool数组,例如,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
[[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)。我也在尝试这一点,但它似乎更难。