【发布时间】:2019-04-23 22:57:43
【问题描述】:
我的问题是关于找到一种有效的(主要是在参数计数方面)方法来在 tensorflow(1.4)中实现滑动窗口,以便通过图像应用神经网络并生成每个像素的二维图(或区域)表示相应感受野(在这种情况下是滑动窗口本身)的网络输出。
在实践中,我尝试使用 tensorflow 实现 MTANN 或 PatchGAN,但我无法理解我找到的实现。
这两种架构可以简单描述为:
MTANN:将输入大小为 [1,N,N,1] 和输出大小 [ ] 的线性神经网络应用于大小为 [1,M,M,1] 的图像以生成地图大小为 [1,G,G,1],其中生成的地图的每个像素对应于对应的 NxN 块属于某个类别的可能性。
PatchGAN 鉴别器:更通用的架构,因为我可以理解跨越图像的网络输出地图本身而不是单个值,然后将其与相邻地图组合以生成最终地图。
虽然我找不到任何 MTANN 的 tensorflow 实现,但我找到了 PatchGAN implementation,即 considered as a convolutional network,但我不知道如何在实践中实现它。
假设我有一个预训练的网络,我得到了输出张量。我知道卷积是要走的路,因为卷积层在输入的局部区域上运行,而我正在尝试做的事情可以清楚地表示为卷积网络。但是,如果我已经拥有从给定的固定大小窗口生成子地图的网络怎么办?
例如我有一个张量
sub_map = network(input_patch)
它从 [1,8,8,3] 图像返回 [1,2,2,1] 映射(对应于输入大小为 8,滤波器大小为 3x3 的 3 层 FCN)。 如何在 [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),因为我当前的模型会逐步缩小图像并且由于大量参数而无法放入内存。
谁能帮助我更好地了解我所缺少的东西?
谢谢
【问题讨论】:
-
PatchGAN 只是一个没有全连接层的常规 CNN。卷积层不在乎——它们获取特征图并给出特征图。输入空间维度越大,输出空间维度也越大。
标签: tensorflow neural-network deep-learning computer-vision conv-neural-network