我正在尝试编写一个自定义优化器,它必须解决凸优化问题。但是,从我在网上阅读的内容来看,我将用来解决凸优化问题的张量流while_loop不能基于输入来计算梯度,而只能基于while_loop内部定义的变量来计算梯度。
首先,这是正确的还是我可以基于损失和作为循环输入的参数来计算tensorflow.while_loop内部的梯度? 如果不是这种情况,我该怎么做?也许我可以根据输入来重建循环内的整个计算图吗?
以下代码是优化器内部代码的示例。
x = K.variable(x_val,dtype='float32',name='x')
loss = (x-5)**2
def cond(xp,x,loss,i):
return tf.logical_and( K.sum((x-xp)**2)>0.001, i<100)
def body(xp,x,loss,i):
g = K.gradients(loss,x)
g2 = K.gradients(g,x)
g_temp = g[0]/g2[0]
g_temp = tf.where(tf.is_nan(g_temp), tf.zeros_like(g_temp), g_temp)
x_n = x-g_temp
return x,x_n,loss,i+1
prev_x,x,g_temp,i = tf.while_loop(cond , body, [np.inf,x,loss,0] )
我得到的错误是: “ AttributeError:'NoneType'对象没有属性'op'”
计算梯度时会出现此情况(假设损耗和x不再相关,因此x不再是损耗的一部分,因此输出为“无”)
注意,损失只是虚假损失,因此“不能求解x”是不可行的。