2017-04-19 211 views
0

你好,我是一个张量的新手,目前,我正在使用彩色图像,它是PCAS。如何将我的三维张量组合成张量流中的单张张量?

我已经提取了“红色”,“绿色”和“蓝色”形式的PCAS,并计算了与“红色”,“绿色”和“蓝色”组件相关的权重。

做完所有上述的东西后,我想把所有三个二维矩阵合并成一个三维矩阵。

对于张量流,它将是一个3D张量。

def multi(h0,ppca,mu,i,scope=None):

with tf.variable_scope(scope or"multi"): 
     return tf.matmul(ppca[:,:,0],h0[i,:,:,0]) + tf.reshape(mu[:,0],[4096,1]) , tf.matmul(ppca[:,:,1],h0[i,:,:,1]) + tf.reshape(mu[:,1],[4096,1]) ,tf.matmul(ppca[:,:,2],h0[i,:,:,2]) + tf.reshape(mu[:,2],[4096,1]) 

所以从上面的功能,我会得到所有三个不同的2D张量,并希望那些2D张量相结合,具有尺寸[4096,1,3]

单机3D张量

我该怎么做? 任何帮助是高度赞赏。

回答

3

你需要Concat的他们是这样的:

three_d_image = tf.concat(0, [[r], [g], [b]]) 

这告诉tensorflow到Concat的他们沿着x维并将每个张量视为矩阵。

做同样的而没有围绕R,G额外的支架,B张量将尝试将它们Concat的一个大的二维矩阵

+0

谢谢Dotan先生,但请在答案中做一个小修改。对于较新版本的tensorflow 1.0 –

+1

它是three_d_image = tf.concat([[r],[g],[b]],0)实际上,对于要求的内容,您不会在维度0上连接,因为它会输出一个张量形状[3,4096,1],并且使用这样的concat是不合适的。我宁愿做three_d_image = tf.stack([r,g,b],2) –

+0

对,你能告诉我tf.stack([r,g,b],2),tf.stack([ r,g,b],3)和tf.stack([r,g,b],1) –

0

其中一个解决方案是,您可以添加一个更多的空维度到您的2D,所以你将有3个矩阵的3D维[4096,1,1],然后你可以连接这3个矩阵轴2 tf.concat(2,matrices)给你[ 4096,1,3]

第二个解决方案可以为轴线1的CONCAT,tf.concat(1,matrices)那么它重塑到3D

1

一个清洁,简单的方法来做到这一点是使用tf.stack操作(TF包装在张量流的旧版本中),它将所有张量沿着新的维度连接起来。如果您希望您的新维度始终处于前面,则需要将轴参数设置为张量的维数。

three_d_image = tf.stack([r,g,b], axis=2) 
+0

这是我想的更好的答案。但它应该是axis = 0(这是默认设置) – Dotan

+0

感谢您的评论,他说他想要最终形状为[4096,1,3],所以axis = 2是必需的。 –