2016-07-25 55 views
0

我有点困惑与最大游泳池落后执行在这里:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/maxpooling_op_gpu.cu.cc#L192在Tensorflow中最大游泳池后退发生了什么?

任何人都可以解释如何在这里计算梯度。像max pool的局部梯度一样是0和1,所以他们只是复制来自grad_in的值?尽管有关于参数top_diff,top_offset,bottom_offset的评论,有人可以解释那些是什么(我是初学者)?

回答

2

你是对的最大池的本地梯度是0的和1的s。但是,如果相同的最大值是从两个相邻的贴片传播的,则相应的梯度值必须进行合计并反向安装到该最大值的位置。例如,考虑一个1-d载体:

[x0 x1 x2] 

假设您正在使用补丁大小2和步幅1运行MaxPool,并假设max(x0, x1) = x1max(x1, x2) = x1。然后输出将

[x1 x1] 

假设梯度进来就是[g1 g2],那么必须backpropped梯度是

[0 g1+g2 0] 

这就是你看到你所指出的代码cudaAtomicAdd函数调用出。

+0

嗨@keveman,谢谢你的回复。现在如果我要做一个最大的unpool操作,需要[x1 x1]和一个argmax矩阵[1 1]随着贴片大小放大到[0 x1 0],并且跨步提到,我应该怎样去最大化反向后退?这是否有意义的最大反向后退: 'int image_id =(index/top_offset); CudaAtomicAdd(bottom_diff + index,top_diff [mask [index] + image_id * top_offset]);' –