问题更多是笼统的。从理论上讲,只要为所需的数学运算实现了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)并点击“最小化”按钮,还是可能失败/收敛非常慢?