2016-07-25 1 views
0

여기에서 max pool backward 구현과 약간 혼동 스럽습니다. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/maxpooling_op_gpu.cu.cc#L192Tensorflow에서 Max pool backward가 어떻게 진행됩니까?

여기서 그라디언트가 어떻게 계산되는지 설명 할 수 있습니까? max pool의 로컬 그라디언트와 마찬가지로 0과 1도 있으므로 grad_in의 값을 복사합니다. top_diff, top_offset, bottom_offset 매개 변수에 대한 설명이 있지만, 누군가 초심자 인 것을 설명 할 수 있습니까?

답변

2

최대 풀의 로컬 그래디언트는 01입니다. 그러나 동일한 최대 값이 인접한 두 패치에서 전파 된 경우 해당 그라디언트 값을 합하여 다시 최대 값 위치로 다시 저장해야합니다.

[x0 x1 x2] 

당신이 패치 크기 2와 보폭 1MaxPool을 실행하는 가정 및 가정 max(x0, x1) = x1max(x1, x2) = x1 그 예를 들어, 1-D 벡터를 고려한다. 그리고 출력은

[x1 x1] 

가의가 그라데이션 당신이 가리키는 코드에서 cudaAtomicAdd 함수 호출을 볼거야 그 다음 backpropped되어야하는 그라디언트

[0 g1+g2 0] 

된다 [g1 g2] 들어오는 생각한 것 아웃.

+0

안녕하세요, @keveman, 답장을 보내 주셔서 감사합니다. 이제 max unpool 연산을 수행하면, [x1 x1]과 argmax 행렬 [1 1]이 패치 크기와 언급 된 [0 x1 0]으로 풀리지 않게 될 것입니다. 어떻게하면 max 뒤로 풀려나? 이것은 역방향 최대 풀링에 대해 의미가 있나 : 'int image_id = (index/top_offset); CudaAtomicAdd (bottom_diff + index, top_diff [마스크 [인덱스] + image_id * top_offset]);' –

관련 문제