Python 张量流不一致

Python 张量流不一致,python,tensorflow,keras,Python,Tensorflow,Keras,我正在用Python为tensorflow v1中的Keras构建一个优化器。优化器通过运行“get_updates”一次来获取更新列表,以执行培训中的每个迭代。完整的代码相当长,但以下内容足以理解发生了什么: def get_updates(self, params): self.saved_params = K.zeros((self.d,1), name='X_previous') P = tf.cond( self.repeat, lambda: self.saved_p

我正在用Python为tensorflow v1中的Keras构建一个优化器。优化器通过运行“get_updates”一次来获取更新列表,以执行培训中的每个迭代。完整的代码相当长,但以下内容足以理解发生了什么:

def get_updates(self, params):
   self.saved_params = K.zeros((self.d,1), name='X_previous')

    P = tf.cond( self.repeat, lambda: self.saved_params, lambda: self.flattenParams(params))
    self.updates.append(tf.print("P,params,repeat:",P, self.flattenParams(params), self.repeat ))

    self.updates.append(K.update( self.saved_params, P))
    return self.updates
“repeat”变量在代码中也发生了更改,但它取决于一些计数器和看起来工作正常的东西。奇怪的是,当我运行这段代码时,我得到了以下输出:

P,params,repeat: 0, 4034.73706, 0

这完全没有道理。如果repeat为0,则P应与参数相同。更奇怪的是,有时是相同的,有时是0。我尝试添加tf.control_依赖项([self.repeat,self.saved_params,P]):但没有任何改变。我已经尝试在任何地方添加控件依赖项,没有区别。这仍然是一种随机行为。还值得注意的是,self.repeat的初始值为False,因此默认情况下,P应与params相同,但第一次迭代P的值不知何故为0。这是怎么回事?

看来我刚刚搞乱了我在列表中添加更新的顺序(whoopsie),所以更新的顺序很奇怪。我仍然不确定为什么它不是一贯错误的,但我猜Tensorflow没有看到更新之间的联系,并且认为它可以同时进行更新。我添加了一些控件依赖项,并确保以更合理的顺序更新所有内容(我只是将更新放在函数末尾,没有过多考虑顺序,因为在我以前的优化器中,顺序并不重要)。
我在打印时仍然有一些奇怪的东西,我的索引计数器打印得很奇怪,但我很确定这只是打印功能出了问题,因为其他一切都正常工作。

您需要提供一个完整的示例,否则就不可能说什么了。这里可能有很多错误,我的猜测是您误解了TF1.x进行计算的方式(构建一次图形,重复执行),这会弄乱条件;我还想知道为什么你(从我所看到的)混合了TF和Keras代码,这通常是一个糟糕的idae。我会尝试看看我是否可以在一个较小的代码段中重新创建错误,现在它有几个文件,所以只在这里发布会有很多代码。我使用Keras优化器的代码作为参考,他们使用了K.update,因此我也在使用它。我认为Keras没有内置的“条件”,所以我必须使用tf.cond