【发布时间】:2018-05-27 11:35:02
【问题描述】:
我正在研究 seq2seq RNN,在给定种子标签的情况下生成标签的输出序列。在推理步骤中,我想生成仅包含唯一标签的序列(即跳过已添加到输出序列中的标签)。为此,我创建了一个采样器对象,它试图记住已添加到输出中的标签并将它们的 logit 值减少到-np.inf。
这是采样器代码:
class InferenceSampler(object):
def __init__(self, out_weights, out_biases):
self._out_weights = tf.transpose(out_weights)
self._out_biases = out_biases
self._n_tracks = out_weights.shape[0]
self.ids_mask = tf.zeros([self._n_tracks], name="playlist_mask")
def __call__(self, decoder_outputs):
_logits = tf.matmul(decoder_outputs, self._out_weights)
_logits = tf.nn.bias_add(_logits, self._out_biases)
# apply mask
_logits = _logits + self.ids_mask
_sample_ids = tf.cast(tf.argmax(_logits, axis=-1), tf.int32)
# update mask
step_ids_mask = tf.sparse_to_dense(_sample_ids, [self._n_tracks], -np.inf)
self.ids_mask = self.ids_mask + step_ids_mask
return _sample_ids
推理图的代码如下:
self._max_playlist_len = tf.placeholder(tf.int32, ())
self._start_tokens = tf.placeholder(tf.int32, [None])
sample_fn = InferenceSampler(out_weights, out_biases)
with tf.name_scope("inf_decoder"):
def _end_fn(sample_ids):
return tf.equal(sample_ids, PAD_ITEM_ID)
def _next_inputs_fn(sample_ids):
return tf.nn.embedding_lookup(
track_embs,
sample_ids
)
_start_inputs = tf.nn.embedding_lookup(
track_embs,
self._start_tokens
)
helper = tf.contrib.seq2seq.InferenceHelper(
sample_fn=sample_fn,
sample_shape=[],
sample_dtype=tf.int32,
start_inputs=_start_inputs,
end_fn=_end_fn,
next_inputs_fn=_next_inputs_fn
)
decoder = tf.contrib.seq2seq.BasicDecoder(
rnn_cell,
helper,
rnn_cell.zero_state(tf.shape(self._start_tokens)[0], tf.float32),
output_layer=projection_layer
)
outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(
decoder,
maximum_iterations=self._max_playlist_len
)
self.playlists = outputs.sample_id
不幸的是,结果仍然有重复的标签。此外,当我尝试访问 sample_fn.ids_mask 时,我收到一条错误消息:ValueError: Operation 'inf_decoder/decoder/while/BasicDecoderStep/add_1' has been marked as not fetchable.
我做错了什么?以及创建这样的sample_fn 是否合法?
【问题讨论】:
-
你为什么在call中重复
_sample_ids = tf.cast(tf.argmax(_logits, axis=-1), tf.int32)?您已经使用旧掩码计算了 _sample_ids,我认为如果您在最后一次迭代中再次计算,您将在掩码中包含所有 -inf -
糟糕...我会再检查一次。但我认为这是复制粘贴到 SO 的问题。
-
所以,我重新检查了代码,是复制粘贴的问题。它仍然不起作用。我更新了问题。
标签: python tensorflow recurrent-neural-network rnn sequence-to-sequence