我遇到了一个问题,如果第一次在Tensorflow while_loop中使用具有可训练参数的层,则会出现错误:
ValueError:变量lambda_1 / while / dense_1 / kernel /的初始化程序来自控制流结构(例如循环或条件)中。在循环或条件内创建变量时,请使用lambda作为初始化程序。
从搜索的角度来看,处理此问题的标准方法是在定义了任何变量的地方引入lambda,但是执行层并非如此。
from keras.layers import *
import tensorflow as tf
from keras.models import Model
dense_layer = Dense(1, input_shape=(1,))
def step(val):
avg_val = tf.expand_dims(tf.reduce_sum(val,axis=1),axis=1)
new_val = dense_layer(avg_val)
return concatenate([new_val, avg_val])
def cond(val):
return tf.less(K.shape(val)[1], 10)
def the_loop(src):
return tf.while_loop(cond, step, [src],
shape_invariants=[tf.TensorShape([None, None])])
src = Input(shape=[None])
out = Lambda(the_loop)(src)
model = Model(src, out)
那是一个(相当愚蠢的)MWE,但是它说明了这个问题-有什么建议吗?之前我已经解决了这个问题(在我更复杂的模型中),因为我需要使用这些层来计算用于初始化循环的值(在本例中为src),但是我正在尝试一种不同的初始化循环的方法为此。