max pooling存在多个最大值时对应的索引应该如何选择?
池化内核存在多最大值时的索引标记规则
当kernel中存在多个等于最大值的数值时该如何处理?例如以下数值:
array([[0., 0.], [0., 0.]])
该组数值的最大值为0,此时对应的max indices存在两种可能的处理逻辑:
- 方案1:将所有最大值出现的位置都标记为True
array([[ True, True], [ True, True]])
- 方案2:仅标记最大值第一个出现的位置
array([[ True, False], [False, False]])
两种方案在现有框架和实现中都有使用:PyTorch默认采用最大值首次出现的位置标记方案,而部分自定义实现会采用全位置标记方案(核心逻辑为pos = np.where(result == view, 1, 0),会为所有最大值出现的位置标记为1)。
补充说明:前向传播阶段两种方案的输出没有区别,但在反向传播阶段会产生明显的梯度差异。例如如果上游梯度为
[[1,1],[1,1]],全标记方案下当前节点得到的梯度为[[1,1],[1,1]],首次标记方案下当前节点得到的梯度为[[1,0],[0,0]]。
内容的提问来源于stack exchange,提问作者Sam-gege
相关产品推荐
相关产品推荐

