首页 Paddle框架 帖子详情
beam_search如何只输出一个最佳结果
收藏
快速回复
Paddle框架 问答深度学习模型训练炼丹技巧 3549 20
beam_search如何只输出一个最佳结果
收藏
快速回复
Paddle框架 问答深度学习模型训练炼丹技巧 3549 20
beam_search如何只输出一个最佳结果,配置网络我知道最后一个参数可以设置为1,那么执行如何执行?
另外有没有只输出最终softmax的概率,不用beam_search
0
收藏
回复
全部评论(20)
时间顺序
夜雨飘零1
#2 回复于2018-05

请提供更详细的信息。方便我们进行问题定位。

0
回复
c
chenbblei01
#3 回复于2018-05
请提供更详细的信息。方便我们进行问题定位。

我用的是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后的概率值,该调用什么函数

0
回复
l
lucywsq
#4 回复于2018-05

"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

0
回复
c
chenbblei01
#5 回复于2018-05
lucywsq #4
"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)

 

请问怎么解决

 

0
回复
c
chenbblei01
#6 回复于2018-05
lucywsq #4
"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 是不能使用GeneratedInput输入的,但是trg_embedding 应该怎么初始化呢,毕竟gru_decoder_with_attention里面第三个参数就是trg_embedding,应该初始化为起始标签,那么代码该如何实现呢,能否给出代码实现方法呢

0
回复
夜雨飘零1
#7 回复于2018-05

在图像识别中,infer接口输出的就是每个label的概率的。

0
回复
c
chenbblei01
#8 回复于2018-05
在图像识别中,infer接口输出的就是每个label的概率的。

是attention么?具体链接有没有

0
回复
l
lucywsq
#9 回复于2018-05

这个不是很明白,你的意思是解码过程中获取每一步的概率分布吗?这样的话,不建议使用beam seach layer,这里有一个python端实现的beam search,灵活度很大,你可以参考一下
https://github.com/PaddlePaddle/models/blob/develop/generate_sequence_by_rnn_lm/beam_search.py
速度上肯定和beam search layer有差异,但是灵活度很大

0
回复
c
chenbblei01
#10 回复于2018-05
lucywsq #9
这个不是很明白,你的意思是解码过程中获取每一步的概率分布吗?这样的话,不建议使用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输出这些概率,会发生崩溃

0
回复
A
AIStudio783311
#11 回复于2018-05

你可以看看上面的实现,根据自己的需求定制一下,链接里面的实现未必是很通用的,那个是针对语言模型实现的,其实主要是参照里面的思想,每一步decoder都通过调用infer来拿到概率值,然后beam search过程在python端实现

0
回复
c
chenbblei01
#12 回复于2018-05
你可以看看上面的实现,根据自己的需求定制一下,链接里面的实现未必是很通用的,那个是针对语言模型实现的,其实主要是参照里面的思想,每一步decoder都通过调用infer来拿到概率值,然后beam search过程在python端实现
展开

还是不明白该如何写代码。。。

0
回复
c
chenbblei01
#13 回复于2018-05
你可以看看上面的实现,根据自己的需求定制一下,链接里面的实现未必是很通用的,那个是针对语言模型实现的,其实主要是参照里面的思想,每一步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是不断生成的值,所以不知道怎么写

0
回复
c
chenbblei01
#14 回复于2018-05
lucywsq #9
这个不是很明白,你的意思是解码过程中获取每一步的概率分布吗?这样的话,不建议使用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的输出结果

0
回复
c
chenbblei01
#15 回复于2018-05
其实我只想要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是不断生成的值,所以不知道怎么写
展开


 #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的输出结果

0
回复
c
chenbblei01
#16 回复于2018-05
你可以看看上面的实现,根据自己的需求定制一下,链接里面的实现未必是很通用的,那个是针对语言模型实现的,其实主要是参照里面的思想,每一步decoder都通过调用infer来拿到概率值,然后beam search过程在python端实现
展开


 #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的输出结果

0
回复
A
AIStudio783311
#17 回复于2018-05

整个解码还是走的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)

    ....

只是一个示例程序哈,具体逻辑你可以研究一下上面贴出来的链接

0
回复
c
chenbblei01
#18 回复于2018-05

懂了,确实很麻烦,但是paddlepaddle如果能够给出最终对应的最佳序列的每个标签的概率就好了

0
回复
c
chenbblei01
#19 回复于2018-05
整个解码还是走的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)     .... 只是一个示例程序哈,具体逻辑你可以研究一下上面贴出来的链接
展开

可以说,我其实想要的是beam_search中最佳序列id所对应的gru_decoder_with_attention的输出结果

0
回复
王彬_LBS
#20 回复于2018-05

https://github.com/PaddlePaddle/Paddle/issues/9160

这个是当时的讨论,如果只输出一个,看讨论的意思,概率是1?

不过还是觉得paddlepaddle的代码有点bug,不能设置成输出1个程序就挂掉

0
回复
科技_改造世界
#21 回复于2023-05

18年的。。。

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户