一种新型池化层,可实现更快,更清晰的融合
在最大池化层(几乎用于所有最新的视觉任务,甚至某些NLP任务中使用)中,您丢弃了大约75%的激活。我想设计一种新型的池化层,以消除与之相关的一些问题。
问题是:
空间信息的丢失。当您丢弃75%的激活时,有关这些激活来自何处的信息将丢失。
最大共享不能使用来自多次激活的信息。
反向传播只会改善maxpooled激活,即使其他激活可能具有错误的值。
我想设计一种新型的池化层,以尽可能解决所有这些问题。在此过程中,我想出了一个非常简单的技巧来解决#2和#3。
想法和动机:
而不是采取4个激活的最大值,而是按升序对4个激活进行排序。将它们乘以4个权重[w1,w2,w3,w4],然后将这4个值相加。
这个想法的动机很简单:
这样,网络仍然能够学习良好的旧最大池,该池对应于[w1,w2,w3,w4] = [1
后面的层可以访问更多信息。因此,如果非最大激活可用于减少损失函数,则网络可以学习使用其他值。
渐变流过上一层中的所有4个值(相比之下,最大池化中只有1个)。
因此,我的直觉是,由于这些原因,这个想法会比最大池更好。这是极少见的DL实验之一,所有实验都按我的预期进行。
具体定义:
令合并之前的层的输出为张量T,大小为[B,H,W,C]。我定义了一个超参数pool_range,它可以是[1
我定义了一个大小为pool_range [w {1},.... w {pool_range}]的权重向量。需要说明的是,如果这些权重中的任何一个为负,则假设激活向量按强度排序并且我们采用加权平均值的假设将不成立。因此,我不直接使用权重,而是对权重向量取一个softmax并将结果与??激活向量相乘。为了测试添加softmax的重要性,我在杂乱无章的数据集上进行了一个玩具实验,有和没有softmax,pool_range = 3。以下是测试数据集上的结果。
杂散数据集测试数据的准确性和交叉熵的比较
显然,softmax是这里的赢家。
我也可以对不同的通道使用不同的权重,但是为了使它与max_pooling相当,我在通道之间使用了相同的4个权重。
实施细节:
我在tensorflow中编写该层的代码。tensorflow的top_k层在CPU上很快,但在GPU上却非常慢。因此,我没有使用它,而是编写了自己的排序例程来对4个浮点数进行排序。
结果:
我在许多不同的数据集和体系结构上尝试了这个想法,并且在所有数据集和体系结构上都超过了基线最大池化。所有实验均使用pool_range的所有四个值:1、2、3、4。pool_range = 1对应于最大池化。
题库