вопросы о возможной реализации cudnn lrn - PullRequest
0 голосов
/ 20 февраля 2019

уравнение lrn выглядит следующим образом:

 y = x * pow(lrn_k + lrn_alpha/lrn_size * sum(Xj * Xj), -lrn_beta)

обратный API lrn cudnn равен

cudnnStatus_t cudnnLRNCrossChannelBackward(
cudnnHandle_t                    handle,
cudnnLRNDescriptor_t             normDesc,
cudnnLRNMode_t                   lrnMode,
const void                      *alpha,
const cudnnTensorDescriptor_t    yDesc,
const void                      *y,
const cudnnTensorDescriptor_t    dyDesc,
const void                      *dy,
const cudnnTensorDescriptor_t    xDesc,
const void                      *x,
const void                      *beta,
const cudnnTensorDescriptor_t    dxDesc,
void                            *dx)

Я считаю, что нет рабочего пространства для сохранения масштаба, который реализован в caffe,это

    scale = lrn_k + lrn_alpha/lrn_size * sum(Xj * Xj)

эта переменная полезна для того, чтобы вычислить lrn в обратном направлении.Поэтому я думаю, что, возможно, в обратном ядре будет просто вычислять из y, x и lrn_beta, чтобы вычислить эту переменную, уравнение выглядит примерно так:

   y/x = pow(scale, -lrn_beta)
   y/x = pow2(-lrn_beta * log2(scale))
   log2(scale) = -1/lrn_beta * log2(y/x)
   scale = pow2(-1/lrn_beta * log2(y/x))

, когда я использую эти уравнения для вычисления масштаба, cudaядро генерирует NAN, есть ли другой метод, который вычисляет lrn в обратном направлении без сохранения значения масштаба в прямом направлении?И почему мой метод не стабилен?

1 Ответ

0 голосов
/ 22 февраля 2019

проверил ptx, для этого обратного прохода еще нужно вычислить масштаб, который рассчитывается вперед.

...