一个如何在张量流中沿宽度和高度尺寸交错4D张量?

时间:2019-01-26 22:56:45

标签: python tensorflow

或者:在张量流中分散多通道图像的不同相位...

我的问题如下:
我有所有相同尺寸的“图像”,在某种意义上,它们对应于目标图像的不同相位。我想用tf功能重建那张完整的图像。
事实证明,这比我最初预期的要简单得多,并且非常感谢您的帮助!

更详细的说明如下:
numpy中,人们可以通过简单的分配轻松地插入图像-

import numpy as np

im = np.random.random((1, 8, 8, 2))

phased_im_01 = im[:, ::2, 1::2, :]
phased_im_00 = im[:, ::2, ::2, :]
phased_im_10 = im[:, 1::2, ::2, :]
phased_im_11 = im[:, 1::2, 1::2, :]

rebuild_im = np.zeros((1, 8, 8, 2))
rebuild_im[:, ::2, ::2, :] = phased_im_00
rebuild_im[:, ::2, 1::2, :] = phased_im_01
rebuild_im[:, 1::2, ::2, :] = phased_im_10
rebuild_im[:, 1::2, 1::2, :] = phased_im_11

print(np.all(rebuild_im == im))

但是,众所周知,分配在tf中是不行的,通常使用tf.concattf.reshape(对于非常简单的情况)或tf.scatter_nd(对于更复杂的情况)结合使用案例)。我无法使用我尝试过的许多方法来实现与上述numpy功能相当的功能(例如,将张量置换为首先具有宽度尺寸,尝试scatter_nd,然后置换回,这是我之前成功使用的一种方法)其他问题)或任何SO解决方案(例如堆叠并重塑自己以致死亡)。

请清楚一点,我的实际用例有一个未知的批处理大小,数千个通道以及每个图像维度中的4个阶段。但是我只需要一个适用于上面简单玩具示例的解决方案;泛化在我身上;-)
感谢那里的任何帮助者((对不起,我只能描述我的努力而不能向他们展示。)它们只是一堆不成功的错误,最终演变成可怕的反复试验代码片段,直到最终放弃并来到这里寻求帮助,因此不会造成重大损失)。

可以根据需要添加说明。

1 个答案:

答案 0 :(得分:2)

要在TensorFlow中重现numpy示例,请尝试.input:active::placeholder { }

depth_to_space

ShlomiF所建议,更一般的示例是:

import tensorflow as tf

im = tf.random_normal((1, 8, 8, 2))

phased_im_01 = im[:, ::2, 1::2, :]
phased_im_00 = im[:, ::2, ::2, :]
phased_im_10 = im[:, 1::2, ::2, :]
phased_im_11 = im[:, 1::2, 1::2, :]

phases = tf.concat(
    (phased_im_00, phased_im_01, phased_im_10, phased_im_11), axis=3)
rebuild_im = tf.nn.depth_to_space(phases, block_size=2, data_format='NHWC')

dif = tf.reduce_sum(rebuild_im - im)  # 0.0

据我所知,import numpy as np import tensorflow as tf tf.enable_eager_execution() num_of_channels = 20 h = w = 256 num_of_phases = 4 im = np.random.random((1, h, w, num_of_channels)) phase_ims = [] for i in range(num_of_phases): for j in range(num_of_phases): phase_ims.append(im[:, i::num_of_phases, j::num_of_phases, :]) all_phases = tf.concat(phase_ims, axis=3) rebuild_im = tf.depth_to_space(all_phases, block_size=num_of_phases, data_format='NHWC') diff = tf.reduce_sum(rebuild_im - im) print(np.asarray(diff)) # --> 0.0 或定期改组的想法来自this paper。您可能在那里找到更多详细信息和可视化。