在前面的斗图篇我们提过这篇文章《Visualizing and understanding convolutional networks》,这是一片介绍反卷积和可视化的文章,今天我们就来详细看看这篇文章的一个开源实现——来自 GitHub - piergiaj/caffe-deconvnet: A deconvolutional network in caffe。
首先我们给出上面这篇论文的网络结构架构:
从结构中可以看出,网络首先进行前向计算,在前向计算中收集一些数据,然后将这些数据塞入反向网络中进行反向计算,从而得到最终的反卷积结果。
这其中还包括一些传统网络中没有的层结构——当然不是网络中带有参数的核心层了。以下这张图是这个网络的结构展示以及在前向计算过程中每个层的维度大小:
从这张图可以看出它就是一个经典的AlexNet结构的网络,但是这个层中有一些特殊的层,它们是:
- PoolingSwitches
- SliceHalf
这两个层有什么作用呢?实际上它就是一个Pooling层,只不过会多输出一些信息。对于max_pooling来说,它会输出正常的max_pooling值,以及对应的max_pooling的index。这个index信息将会被用在反向计算中。因为反向计算时我们要将diff传输到pooling层前指定的index上,这里要做一个记录。
其中PoolingSwitches就是记录max pooling的值和max pooling选中的index,而SliceHalf则将这两部分分成两个输出,属于SliceLayer的一个特殊实现。
反向计算就是把之前的参数再传输回去,在前面我们已经介绍过这其中的思想了。返回的网络结构如下图所示:
可以看出除了去掉了relu层,反向的结构和前向的结构完全一样。反向中的InvPooling层做了Pooling的的反向计算,其中利用到了前向计算中保存的index值。
其中的一些效果可以参见前面的斗图篇,这里就不多介绍了。链接是:
感兴趣的童鞋也可以自己尝试一下。
总体来说这个方法可以帮助我们观察出图像中的一些响应特点,在论文中作者还提出,他们通过可视化的方法发现了AlexNet中的一些不足,并提出了一些改进方法,也最终形成了在江湖上有一定影响力的ZF模型。
除了这种反卷积的可视化方法,其实还有其他的可视化方法。后面我们再慢慢介绍。