beam_search如何只输出一个最佳结果
收藏
beam_search如何只输出一个最佳结果,配置网络我知道最后一个参数可以设置为1,那么执行如何执行?
另外有没有只输出最终softmax的概率,不用beam_search
0
收藏
请登录后评论
请提供更详细的信息。方便我们进行问题定位。
我用的是attention解码,
beam_gen = paddle.layer.beam_search(
name=decoder_group_name,
step=gru_decoder_with_attention,
input=group_inputs,
bos_id=176,
eos_id=177,
beam_size=5,
num_results_per_sample=2)
1. 我设置num_results_per_sample为1的时候崩溃,提示list越界
2.假如我只想输出attention的softmax后的概率值,该调用什么函数
"1. 我设置num_results_per_sample为1的时候崩溃,提示list越界"
如果设置num_results_per_sample=1崩溃,可能有bug,这个可以后续取top 1的结果输出,不一定要依赖beam search
"2. 假如我只想输出attention的softmax后的概率值,该调用什么函数"
可以看一下这个函数的接口,infer函数里面可以指定output_layer
def infer(output_layer, parameters, input, feeding=None, field='value'):
https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/inference.py#L125
第二个问题,我在测试的时候,直接这样调用也是会崩溃的:
trg_embedding = paddle.layer.GeneratedInput(
size=dict_size+1,
embedding_name='_target_language_embedding',
embedding_size=512)
group_inputs.append(trg_embedding)
decoder = paddle.layer.recurrent_group(
name=decoder_group_name,
step=gru_decoder_with_attention,
input=group_inputs)
请问怎么解决
对了,在生成的时候,trg_embedding 是不能使用GeneratedInput输入的,但是trg_embedding 应该怎么初始化呢,毕竟gru_decoder_with_attention里面第三个参数就是trg_embedding,应该初始化为起始标签,那么代码该如何实现呢,能否给出代码实现方法呢
在图像识别中,infer接口输出的就是每个label的概率的。
是attention么?具体链接有没有
这个不是很明白,你的意思是解码过程中获取每一步的概率分布吗?这样的话,不建议使用beam seach layer,这里有一个python端实现的beam search,灵活度很大,你可以参考一下
https://github.com/PaddlePaddle/models/blob/develop/generate_sequence_by_rnn_lm/beam_search.py
速度上肯定和beam search layer有差异,但是灵活度很大
具体解释下哈,假设有100种标签,如果直接用beam_search直接就会获得最终的标签,比如a,
但我现在想要的输出结果是这100个标签的概率,比如a:0.900,b:0.0001,.....,是这个意思,但是
我直接使用上面的decoder输出这些概率,会发生崩溃
你可以看看上面的实现,根据自己的需求定制一下,链接里面的实现未必是很通用的,那个是针对语言模型实现的,其实主要是参照里面的思想,每一步decoder都通过调用infer来拿到概率值,然后beam search过程在python端实现
还是不明白该如何写代码。。。
其实我只想要gru_decoder_with_attention这一步输出的结果,这个定义如下:
def gru_decoder_with_attention(enc_vec, enc_proj, current_word):
decoder_mem = paddle.layer.memory(
name='gru_decoder', size=decoder_size, boot_layer=decoder_boot)
context = paddle.networks.simple_attention(
encoded_sequence=enc_vec,
encoded_proj=enc_proj,
decoder_state=decoder_mem)
decoder_inputs = paddle.layer.fc(
act=paddle.activation.Linear(),
size=decoder_size * 3,
bias_attr=False,
input=[context, current_word],
layer_attr=paddle.attr.ExtraLayerAttribute(
error_clipping_threshold=100.0))
gru_step = paddle.layer.gru_step(
name='gru_decoder',
input=decoder_inputs,
output_mem=decoder_mem,
size=decoder_size)
out = paddle.layer.fc(
size=target_dict_dim,
bias_attr=True,
act=paddle.activation.Softmax(),
input=gru_step)
return out
问题是这个current_word是不断生成的值,所以不知道怎么写
就这么说吧,
这个链接中的https://github.com/PaddlePaddle/book/blob/develop/08.machine_translation/train.py
beam_gen = paddle.layer.beam_search(
name=decoder_group_name,
step=gru_decoder_with_attention,
input=group_inputs,
bos_id=0,
eos_id=1,
beam_size=beam_size,
max_length=max_length)
我现在不想使用beam_search获取最终的几组备选标签序列,我想获取的是gru_decoder_with_attention的输出结果
#14chenbblei01回复于1分钟前
对#9 lucywsq回复
这个不是很明白,你的意思是解码过程中获取每一步的概率分布吗?这样的话,不建议使用beam seach layer,这里有一个python端实现的beam search,灵活度很大,你可以参考一下 https://github.com/PaddlePaddle/models/blob/develop/generate_sequence_by_rnn_lm/beam_search.py 速度上肯定和beam search layer有差异,但是灵活度很大
展开
就这么说吧,
这个链接中的https://github.com/PaddlePaddle/book/blob/develop/08.machine_translation/train.py
beam_gen = paddle.layer.beam_search(
name=decoder_group_name,
step=gru_decoder_with_attention,
input=group_inputs,
bos_id=0,
eos_id=1,
beam_size=beam_size,
max_length=max_length)
我现在不想使用beam_search获取最终的几组备选标签序列,我想获取的是gru_decoder_with_attention的输出结果
#14chenbblei01回复于1分钟前
对#9 lucywsq回复
这个不是很明白,你的意思是解码过程中获取每一步的概率分布吗?这样的话,不建议使用beam seach layer,这里有一个python端实现的beam search,灵活度很大,你可以参考一下 https://github.com/PaddlePaddle/models/blob/develop/generate_sequence_by_rnn_lm/beam_search.py 速度上肯定和beam search layer有差异,但是灵活度很大
展开
就这么说吧,
这个链接中的https://github.com/PaddlePaddle/book/blob/develop/08.machine_translation/train.py
beam_gen = paddle.layer.beam_search(
name=decoder_group_name,
step=gru_decoder_with_attention,
input=group_inputs,
bos_id=0,
eos_id=1,
beam_size=beam_size,
max_length=max_length)
我现在不想使用beam_search获取最终的几组备选标签序列,我想获取的是gru_decoder_with_attention的输出结果
整个解码还是走的beam search逻辑,但是你想输出gru_decoder_with_attention的output,应该是这样对吧。
现在问题是,你直接调用beam search逻辑的话,没办法很灵活拿到每一步的output,只能每一步调用一次infer,拿到gru_decoder_with_attention的output,然后在python端实现beam search逻辑,所以程序看起来像这样
while step_num < max_seq_len:
....
gru_decoder_with_attention_output = infer(output_layer=gru_decoder_with_attention_out)
beam_search(gru_decoder_with_attention_output)
....
只是一个示例程序哈,具体逻辑你可以研究一下上面贴出来的链接
懂了,确实很麻烦,但是paddlepaddle如果能够给出最终对应的最佳序列的每个标签的概率就好了
可以说,我其实想要的是beam_search中最佳序列id所对应的gru_decoder_with_attention的输出结果
https://github.com/PaddlePaddle/Paddle/issues/9160
这个是当时的讨论,如果只输出一个,看讨论的意思,概率是1?
不过还是觉得paddlepaddle的代码有点bug,不能设置成输出1个程序就挂掉
18年的。。。