我的问题是关于找到一种有效的(主要是在参数计数方面)的方法来实现张量流(1.4)中的滑动窗口,以便通过图像应用神经网络并为每个像素生成二维图(或区域)代表相应接收场(在本例中为滑动窗口本身)的网络输出。
在实践中,我正在尝试使用张量流实现MTANN或PatchGAN,但是我不理解我发现的实现。
这两种架构可以简要描述为:
MTANN:将具有输入大小[1,N,N,1]和输出大小[]的线性神经网络应用于大小[1,M,M,1]的图像以生成图大小为[1,G,G,1],其中所生成映射的每个像素对应于相应NxN色块属于某个类的可能性。
PatchGAN判别器:更一般的体系结构,因为我可以理解跨过图像的网络输出的是地图本身而不是单个值,然后将其与相邻地图组合以生成最终地图。
虽然我找不到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),因为我当前的模型会逐步缩小图像的尺寸,并且由于参数数量巨大而无法容纳在内存中。
有人可以帮助我更好地了解我的失踪吗?
谢谢
答案 0 :(得分:0)
我发现了由Andrew Ng提出的有趣的video,正是关于如何使用卷积层实现滑动窗口。 这里的问题是我在考虑将层数视为取决于固定输入/输出形状的变量,而应该相反。
原则上,保存的模型应仅包含每个级别的学习过滤器,只要过滤器形状与图层的输入/输出深度兼容即可。因此,将不同(即更大)的空间分辨率应用于网络输入会产生不同的输出形状,这可以看作是将神经网络应用于扫过输入图像的滑动窗口。