2017-01-08 184 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,這是一個天才! :) –