【发布时间】:2018-09-10 08:39:22
【问题描述】:
我正在使用 RNN (GRUCell) 开发 Tensorflow 估计器。 我使用 zero_state 来初始化第一个状态,它需要一个固定的大小。 我的问题是我希望能够使用估计器来预测单个样本(batchsize=1)。 当它加载序列化的估计器时,它抱怨我用于预测的批次大小与训练批次大小不匹配。
如果我用不同的批量大小重建估计器,我无法加载已序列化的内容。
有没有一种优雅的方式在估算器中使用 zero_state? 我看到一些解决方案使用变量来存储批量大小,但使用 feed_dict 方法。我不知道如何使它在估算器的上下文中工作。
这是我在估算器中简单测试 RNN 的核心:
cells = [ tf.nn.rnn_cell.GRUCell(self.getNSize()) for _ in range(self.getNLayers())]
multicell = tf.nn.rnn_cell.MultiRNNCell(cells, state_is_tuple=False)
H_init = tf.Variable( multicell.zero_state( batchsize, dtype=tf.float32 ), trainable=False)
H = tf.Variable( H_init )
Yr, state = tf.nn.dynamic_rnn(multicell, Xo, dtype=tf.float32, initial_state=H)
有人知道吗?
编辑:
好的,我在这个问题上尝试了各种方法。 我现在尝试过滤从检查点加载的变量以删除用作循环单元的内部状态的“H”。对于预测,我可以将其保留为所有 0 值。
到目前为止,我是这样做的: 首先我定义一个钩子:
class RestoreHook(tf.train.SessionRunHook):
def __init__(self, init_fn):
self.init_fn = init_fn
def after_create_session(self, session, coord=None):
print("--------------->After create session.")
self.init_fn(session)
然后在我的model_fn中:
if mode == tf.estimator.ModeKeys.PREDICT:
logits = tf.nn.softmax(logits)
# Do not restore H as it's batch size might be different.
vlist = tf.contrib.framework.get_variables_to_restore()
vlist = [ x for x in vlist if x.name.split(':')[0] != 'architecture/H']
init_fn = tf.contrib.framework.assign_from_checkpoint_fn(tf.train.latest_checkpoint(self.modelDir), vlist, ignore_missing_vars=True)
spec = tf.estimator.EstimatorSpec(mode=mode,
predictions = {
'logits': logits,
},
export_outputs={
'prediction': tf.estimator.export.PredictOutput( logits )
},
prediction_hooks=[RestoreHook(init_fn)])
我从https://github.com/tensorflow/tensorflow/issues/14713获取了这段代码
但它还没有工作。似乎它仍在尝试从文件中加载 H ...我检查它是否不在 vlist 中。 我仍在寻找解决方案。
【问题讨论】:
标签: python tensorflow rnn