总和技巧的梯度如何工作以获得 keras 中的最大池位置?



keras 示例目录包含堆叠 what-where 自动编码器 (SWWAE( 的轻量级版本,它们在 MNIST 数据上进行训练。(https://github.com/fchollet/keras/blob/master/examples/mnist_swwae.py(

在最初的SWWAE论文中,作者使用软函数计算什么和在哪里。 但是,在 keras 实现中,他们使用技巧来获取这些位置。 我想了解这个技巧。

这是技巧的代码。

def getwhere(x):
''' Calculate the 'where' mask that contains switches indicating which
index contained the max value when MaxPool2D was applied.  Using the
gradient of the sum is a nice trick to keep everything high level.'''
y_prepool, y_postpool = x
return K.gradients(K.sum(y_postpool), y_prepool)  # How exactly does this line work?

其中y_prepool是 MxN 矩阵,y_postpool是 M/2 x N/2 矩阵(假设大小为 2 像素的规范池(。

我已经验证了 getwhere(( 的输出是一个钉子矩阵,其中钉子指示最大值的位置(如果你愿意的话,是本地 argmax(。

有人可以构建一个小例子来演示如何使用这个"技巧"来演示getwhere的工作原理吗?

让我们专注于最简单的例子,而不真正谈论卷积,假设我们有一个向量

x = [1 4 2]

我们最大化池(有一个大窗户(,我们得到

mx = 4

从数学上讲,它是:

mx = x[argmax(x)]

现在,恢复池化使用的一个热面膜的"诀窍"是

magic = d mx / dx

Argmax 没有梯度,但它将相应的梯度"传递"到最大元素位置的向量中的元素,因此:

d mx / dx = [0/dx[1] dx[2]/dx[2] 0/dx[3]] = [0 1 0]

如您所见,非最大元素的所有梯度均为零(由于 Argmax(,并且"1"出现在最大值处,因为 dx/x = 1。

现在对于"适当的"maxpool,您有许多池化区域,连接到许多输入位置,因此采用池化值总和的类似梯度,将恢复所有索引。

但是请注意,如果您有严重重叠的内核,则此技巧将不起作用 - 您最终可能会得到比"1"更大的值。基本上,如果一个像素被 K 个内核最大池化,那么它将具有值 K,而不是 1,例如:

[1 ,2, 3]
x =  [13,3, 1]
[4, 2, 9]

如果我们用2x2窗口最大化游泳池,我们会得到

mx = [13,3]
[13,9]

渐变技巧给你

[0, 0, 1]
magic = [2, 0, 0]
[0, 0, 1]

相关内容

  • 没有找到相关文章

最新更新