Tensorflow中的Max pool backward发生了什么?

Tensorflow中的Max pool backward发生了什么?,tensorflow,Tensorflow,我对这里的max pool向后实现有点困惑: 有人能解释一下这里梯度是如何计算的吗。就像最大池的局部梯度是0s和1s,所以他们只是从即将到来的grad_中复制值?尽管有关于参数top_diff、top_offset、bottom_offset的评论;谁能解释一下这些是什么(我是初学者) 关于最大池的局部坡度是0和1,您是对的。但是,如果相同的最大值是从两个相邻面片传播的,则必须将相应的梯度值相加并反向支撑到该最大值的位置。例如,考虑一维向量: [x0 x1 x2] 假设您使用面片大小2和跨距1

我对这里的max pool向后实现有点困惑:


有人能解释一下这里梯度是如何计算的吗。就像最大池的局部梯度是0s和1s,所以他们只是从即将到来的grad_中复制值?尽管有关于参数top_diff、top_offset、bottom_offset的评论;谁能解释一下这些是什么(我是初学者)

关于最大池的局部坡度是
0
1
,您是对的。但是,如果相同的最大值是从两个相邻面片传播的,则必须将相应的梯度值相加并反向支撑到该最大值的位置。例如,考虑一维向量:

[x0 x1 x2]
假设您使用面片大小
2
和跨距
1
运行
MaxPool
,并假设
max(x0,x1)=x1
max(x1,x2)=x1
。那么输出将是

[x1 x1]
假设引入的梯度是
[g1g2]
,那么必须支撑的梯度是

[0 g1+g2 0]

这就是您在指出的代码中看到的
cudaAtomicAdd
函数调用。

关于最大池的局部梯度是
0
1
,您是对的。但是,如果相同的最大值是从两个相邻面片传播的,则必须将相应的梯度值相加并反向支撑到该最大值的位置。例如,考虑一维向量:

[x0 x1 x2]
假设您使用面片大小
2
和跨距
1
运行
MaxPool
,并假设
max(x0,x1)=x1
max(x1,x2)=x1
。那么输出将是

[x1 x1]
假设引入的梯度是
[g1g2]
,那么必须支撑的梯度是

[0 g1+g2 0]

这就是您在指出的代码中看到的
cudaAtomicAdd
函数调用。

Hi@keveman,感谢您的回复。现在,如果我要做一个max unpol操作,它需要[x1-x1]和一个argmax矩阵[1],以你提到的面片大小和步幅将其解算到[0 x10],我应该如何向后进行max unpol操作?这对max unpol backward有意义吗:
int image\u id=(index/top\u offset);CudaAtomicAdd(底部差异+索引,顶部差异[遮罩[索引]+图像id*顶部偏移])你好@keveman,谢谢你的回复。现在,如果我要做一个max unpol操作,它需要[x1-x1]和一个argmax矩阵[1],以你提到的面片大小和步幅将其解算到[0 x10],我应该如何向后进行max unpol操作?这对max unpol backward有意义吗:
int image\u id=(index/top\u offset);CudaAtomicAdd(底部差异+索引,顶部差异[遮罩[索引]+图像id*顶部偏移])