2016-07-25 56 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]);' –