Tensorflow 如何使用“动态”创建动态“rnn”;零状态;(推理失败)

Tensorflow 如何使用“动态”创建动态“rnn”;零状态;(推理失败),tensorflow,tensorflow-serving,Tensorflow,Tensorflow Serving,我一直在与“动态”合作创建一个模型 该模型基于80个时间段的信号,我想在每次运行之前将“初始_状态”归零,因此我设置了以下代码片段来实现这一点: state = cell_L1.zero_state(self.BatchSize,Xinputs.dtype) outputs, outState = rnn.dynamic_rnn(cell_L1,Xinputs,initial_state=state, dtype=tf.float32) 这对培训过程非常有用。问题是,一旦我进入推断,其中我的

我一直在与“动态”合作创建一个模型

该模型基于80个时间段的信号,我想在每次运行之前将“初始_状态”归零,因此我设置了以下代码片段来实现这一点:

state = cell_L1.zero_state(self.BatchSize,Xinputs.dtype)
outputs, outState = rnn.dynamic_rnn(cell_L1,Xinputs,initial_state=state,  dtype=tf.float32)
这对培训过程非常有用。问题是,一旦我进入推断,其中我的BatchSize=1,我会返回一个错误,因为rnn“状态”与新形状不匹配。所以我认为我需要根据输入的批量大小来生成“self.BatchSize”,而不是硬编码。我尝试了许多不同的方法,但没有一种有效。我不希望通过feed_dict传递一串零,因为它是一个基于批量大小的常量

以下是我的一些尝试。它们通常都会失败,因为在构建图形时输入大小未知:

state = cell_L1.zero_state(Xinputs.get_shape()[0],Xinputs.dtype)

另一种方法是,认为初始值设定项可能在运行时才被调用,但在图形构建时仍然失败:

init = lambda shape, dtype: np.zeros(*shape)
state = tf.get_variable("state", shape=[Xinputs.get_shape()[0], self.state_size],initializer=init)

有没有一种方法可以动态地创建这个恒定的初始状态,或者我需要用tensor服务代码通过feed_dict重置它?是否有一种聪明的方法可以在图中只执行一次,可能是使用tf.Variable.assign?

问题的解决方案是如何获得“批量大小”,从而使变量不被硬编码

这是给定示例中的正确方法:

Xinputs = tf.placeholder(tf.int32, (None, self.sequence_size, self.num_params), name="input")
state = cell_L1.zero_state(Xinputs.get_shape()[0],Xinputs.dtype)
问题在于使用“get_shape()[0]”,这将返回张量的“shape”,并将batch_size值取为[0]。文档似乎不太清楚,但这似乎是一个常量值,因此当您将图形加载到推理中时,该值仍然是硬编码的(可能仅在创建图形时计算?)

使用“tf.shape()”函数,似乎可以达到目的。这不会返回形状,而是一个张量。因此,这似乎在运行时更新得更多。使用此代码片段解决了训练批次为128的问题,然后将图形加载到TensorFlow服务推理中,处理的批次仅为1

Xinputs = tf.placeholder(tf.int32, (None, self.sequence_size, self.num_params), name="input")
batch_size = tf.shape(Xinputs)[0]
state = self.cell_L1.zero_state(batch_size,Xinputs.dtype)
这里是TensorFlow常见问题解答的一个很好的链接,它描述了这种方法“如何构建一个适用于可变批量的图形?”:

Xinputs = tf.placeholder(tf.int32, (None, self.sequence_size, self.num_params), name="input")
batch_size = tf.shape(Xinputs)[0]
state = self.cell_L1.zero_state(batch_size,Xinputs.dtype)