Python ValueError:变量的初始值设定项来自控制流构造内部,例如循环或条件。使用lambda作为初始值设定项

Python ValueError:变量的初始值设定项来自控制流构造内部,例如循环或条件。使用lambda作为初始值设定项,python,multithreading,tensorflow,keras,tf.keras,Python,Multithreading,Tensorflow,Keras,Tf.keras,这是我在Keras的控制流中声明LSTM层时面临的问题的简化版本。行K.variable(kernel_init([3,3],dtype='float64')、dtype='float64',name='kernel')是。因此,该行不能更改。基于来自的RecomEndation,我尝试创建一个LSTM网络并得到相同的错误。我把它归结为下面的简化代码 下面的代码执行会导致错误 import tensorflow as tf from keras import backend as K def

这是我在Keras的控制流中声明LSTM层时面临的问题的简化版本。行
K.variable(kernel_init([3,3],dtype='float64')、dtype='float64',name='kernel')
是。因此,该行不能更改。基于来自的RecomEndation,我尝试创建一个LSTM网络并得到相同的错误。我把它归结为下面的简化代码

下面的代码执行会导致错误

import tensorflow as tf
from keras import backend as K

def cond(i):
  return i < 3

def body(i):
    kernel_init = lambda x, dtype='float64' : tf.random.normal(x, dtype=dtype)
    vars = K.variable(kernel_init([3,3], dtype='float64'),
                            dtype='float64',
                            name='kernel')
    print("succesfully variable declared")
    return (i+1,vars)

tf.while_loop(cond, body, [0])
将tensorflow导入为tf
从keras导入后端为K
def cond(一):
返回i<3
def正文(一):
kernel_init=lambda x,dtype='float64':tf.random.normal(x,dtype=dtype)
vars=K.variable(kernel_init([3,3],dtype='float64'),
dtype='float64',
name='kernel')
打印(“成功声明变量”)
返回(i+1,变量)
tf.while_循环(cond,body,[0])
ValueError:变量的初始值设定项,而/kernel/来自控制流构造内部,例如循环或条件。在循环或条件内创建变量时,请使用lambda作为初始值设定项


标记多线程,因为上面的代码最初在并行线程内运行。

为什么要多次声明内核?问题是它说的是,您不能在
tf内初始化变量。而_loop
,因为这是一个控制流操作。@Daniel,实际的while循环基于是否设置了事件,它会以一定的间隔重新加载经过训练的lstm,以在新数据上对其进行重新训练。@thushv89,但它也建议了一种替代方法,并在我在文章中链接的问题中给出了一个简单的例子。你不能只分配一个新值,而不是再次创建变量吗?这听起来很奇怪,完全违背了tensorflow遵循的静态图形思想。