while_loop中的层初始化:“控制流构造中的变量初始化器”

时间:2019-01-07 23:01:17

标签: python tensorflow keras

我遇到了一个问题,如果第一次在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),但是我正在尝试一种不同的初始化循环的方法为此。

0 个答案:

没有答案