2017-01-08 160 views
1

假设我有一个带有3个通道的(7,7,3)图像。 如何创建一个使用图像的矩阵A,使每一行只包含相邻像素的成对连接?我知道这可以很容易地在python中用for循环来完成,但我们如何在tensorflow图中做到这一点?矩阵A的从张量流张量中创建一个新的矩阵

例子:

[[pixel1 pixel2], 
[pixel1 pixel3], 
[pixel1 pixel4], 
.....so on ]] 

回答

3

你可以使用一些矩阵代数做到这一点。为了说明这个想法,假设你想为一维矢量做这个。

你可以用自身的位移版本堆向量获得对邻居

n = 5 
a = tf.range(n) 
left = tf.stack([a[1:], a[:n-1]]) 
left = tf.transpose(left) 

enter image description here

的通过斩去尾巴和重复用于不同的偏移,你可以得到左邻居和右邻居

right = tf.stack([a[:n-1], a[1:]]) 
right = tf.transpose(right) 

enter image description here

要再次忽略边缘效应,你可以砍下两端和堆栈到3级矩阵

stacked_neighbors = tf.stack([left[:-1], right[1:]]) 

enter image description here

我们交错邻居,我们可以使用一个技巧与转和重塑。

stacked_neighbors = tf.transpose(stacked_neighbors, [1, 0, 2]) 

enter image description here

由于数据存储在行优先顺序,重塑成比原来少尺寸,重塑变平左侧

过量尺寸
stacked_neighbors = tf.reshape(stacked_neighbors, [6,2]) 

enter image description here

+0

@Yarslav,这是一个天才! :) –