如何使用张量流将神经网络扫过图像?

时间:2018-11-21 11:16:51

标签: tensorflow neural-network deep-learning computer-vision conv-neural-network

我的问题是关于找到一种有效的(主要是在参数计数方面)的方法来实现张量流(1.4)中的滑动窗口,以便通过图像应用神经网络并为每个像素生成二维图(或区域)代表相应接收场(在本例中为滑动窗口本身)的网络输出。

在实践中,我正在尝试使用张量流实现MTANNPatchGAN,但是我不理解我发现的实现。

这两种架构可以简要描述为:

  • MTANN:将具有输入大小[1,N,N,1]和输出大小[]的线性神经网络应用于大小[1,M,M,1]的图像以生成图大小为[1,G,G,1],其中所生成映射的每个像素对应于相应NxN色块属于某个类的可能性。

  • PatchGAN判别器:更一般的体系结构,因为我可以理解跨过图像的网络输出的是地图本身而不是单个值,然后将其与相邻地图组合以生成最终地图。

  • p>

虽然我找不到MTANN的任何张量流实现,但我找到了implementation的PatchGAN considered as a convolutional network,但我不知道如何在实践中实现它。

假设我有一个预训练的网络,我得到了输出张量。我知道卷积是要走的路,因为卷积层在输入的局部区域上操作,而我想做的事情可以清楚地表示为卷积网络。但是,如果我已经有了从固定大小的给定窗口生成子图的网络,怎么办?

例如我有张量

sub_map = network(input_patch)

从[1,8,8,3]图像(对应于输入大小为8的3层FCN,过滤器大小为3x3)返回[1,2,2,1]映射。 我该如何在[1,64,64,3]图像上扫描此网络,以生成由每个空间贡献组成的[1,64,64,1]地图,就像它在卷积中一样?

我已经考虑了以下解决方案:

  • 使用tf.image.extract_image_patches来显式提取深度维度中的所有图像补丁和通道,但是由于要从完整的卷积网络切换到PatchGAN鉴别器,我认为它将消耗太多资源受内存限制-最终映射的组成也不是那么简单。

  • 在获得网络之前添加一个卷积层,但是我无法弄清楚在这种情况下滤镜(及其尺寸)应如何保持在8x8图像上进行预训练的模型的工作,同时将其集成到适用于较大图像的模型。 对于我所能得到的,它应该类似于whole_map = tf.nn.convolution(input=x64_images, filter=sub_map, ...)之类的东西,但是我认为这不起作用,因为过滤器是一个取决于接受域本身的运算符。

最终的目标是以一种有效的方式将此小型网络应用于大图像(例如1024x1024),因为我当前的模型会逐步缩小图像的尺寸,并且由于参数数量巨大而无法容纳在内存中。

有人可以帮助我更好地了解我的失踪吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我发现了由Andrew Ng提出的有趣的video,正是关于如何使用卷积层实现滑动窗口。 这里的问题是我在考虑将层数视为取决于固定输入/输出形状的变量,而应该相反。

原则上,保存的模型应仅包含每个级别的学习过滤器,只要过滤器形状与图层的输入/输出深度兼容即可。因此,将不同(即更大)的空间分辨率应用于网络输入会产生不同的输出形状,这可以看作是将神经网络应用于扫过输入图像的滑动窗口。