我可以使用Tensorflows自动微分功能计算任何操作数(例如,总变化正则化)吗?

时间:2019-01-12 03:03:24

标签: python tensorflow machine-learning optimization autodiff

问题更多是笼统的。从理论上讲,只要为所需的数学运算实现了bwd路径,Tensorflow即可得出任何级联函数的梯度。

现在,我对在Tensorflow中实现的(TV)规范化有些困惑:

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)并点击“最小化”按钮,还是可能失败/收敛非常慢?

0 个答案:

没有答案