Могу ли я вычислить любой операнд (например, регуляризацию полной вариации) с возможностью автоматической дифференциации Tensorflows? - PullRequest
0 голосов
/ 12 января 2019

Вопрос носит более общий характер. Теоретически, Tensorflow может получить градиент для любой каскадной функции, если для желаемой математической операции реализован bwd-путь.

Теперь я немного озадачен (ТВ) -регуляризацией, которую я реализовал в Tensorflow:

def tf_total_variation_regularization(toRegularize, BetaVals = [1,1,1], epsR = 1, epsC=1e-10):
    #% Ferreol Soulez et al. "Blind deconvolution of 3D data in wide field fluorescence microscopy
        aGradL_1 = (toRegularize - tf.roll(toRegularize, 1, 0))/BetaVals[0]
        aGradL_2 = (toRegularize - tf.roll(toRegularize, 1, 1))/BetaVals[1]
        aGradL_3 = (toRegularize - tf.roll(toRegularize, 1, 2))/BetaVals[2]

        aGradR_1 = (toRegularize - tf.roll(toRegularize, -1, 0))/BetaVals[0]
        aGradR_2 = (toRegularize - tf.roll(toRegularize, -1, 1))/BetaVals[1]
        aGradR_3 = (toRegularize - tf.roll(toRegularize, -1, 2))/BetaVals[2]
        print('We use circular shift for the TV regularizer')

    mySqrtL = tf.sqrt(tf_abssqr(aGradL_1)+tf_abssqr(aGradL_2)+tf_abssqr(aGradL_3)+epsR)
    mySqrtR = tf.sqrt(tf_abssqr(aGradR_1)+tf_abssqr(aGradR_2)+tf_abssqr(aGradR_3)+epsR)

    mySqrt = mySqrtL + mySqrtR; 

    if(1):
        mySqrt = tf.where(
                    tf.less(mySqrt , epsC*tf.ones_like(mySqrt)),
                    epsC*tf.ones_like(mySqrt),
                    mySqrt) # To avoid divisions by zero
    else:               
        mySqrt = tf.clip_by_value(mySqrt, 0, np.inf)    


    myReg = tf.reduce_sum(mySqrt)

    return myReg

Люди обычно вычисляют обратную задачу, основываясь на более сложных схемах оптимизации, таких как ISTA / FISTA или ADMM, используя проксимальные операторы, которые (пока?) Недоступны в Tensorflow. Яркий пример приведен в этом (публикация) [https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7384714], где авторы выводят проксимальный оператор для регуляризатора телевидения.

Итак, мой вопрос: могу ли я просто построить обратную задачу на основе формулировки наименьших квадратов и добавить ТВ-регуляризатор в Tensorflow, добавить оптимизатор (например, ADAM) и нажать кнопку минимизации, или это может привести к сбою / конвергенции? очень медленно?

...