当前位置: 首页 > news >正文

信贷网站建设空调维修网站建设

信贷网站建设,空调维修网站建设,小程序会员系统怎么做,wordpress文章列表调用在上一篇文章中我们具体探讨了Beam search的思想以及Beam search的大致工作流程。根据对Beam search的大致流程我们已经清楚了,在这我们来具体实现一下Beam search并应用在我们的seq2seq任务中。 1. python中的堆(heapq) 堆是一种特殊的树形…

        在上一篇文章中我们具体探讨了Beam search的思想以及Beam search的大致工作流程。根据对Beam search的大致流程我们已经清楚了,在这我们来具体实现一下Beam search并应用在我们的seq2seq任务中。

1. python中的堆(heapq)

        堆是一种特殊的树形数据结构。堆分为大根堆和小根堆两种类型,其中:

  • 小根堆: 父节点的值小于或等于其子节点的值。
  • 大根堆: 父节点的值大于或等于其子节点的值。

堆的应用场景主要是以下两个:

        1. 堆排序,完成升序或降序排列;

        2. 优先级队列,其中元素按照优先级顺序排列,优先级越低越先出队。在每次插入元素时,堆会自动调整以确保最高(或最低)优先级的元素位于堆的根部。

2. Beam search的实现

2.1 Beam search的流程

我们通过构建堆来实现Beam search,主要流程:

        1. 构造 <SOS> 做为第一次输入信息保存在堆中;

        2. 取出堆中的数据,开始forward操作,获取当前时间步的输出output、hidden;

        3. 从output中选择top k个数据输出,做为下一个时间步的输入(其中Beam width = k);

        4. 把下一个时间步需要的输入数据保存在一个新的堆中;

        5. 获取新的堆中概率最大的数据,判断数据是否为 <EOS> 或者序列是否达到输出最大长度,如果符合则停止输出,若不符合则继续循环2~5。

2.2 构建beam

class Beam:def __init__(self):self.heap = list()self.beam_width = 3def add(self, probability, complete, seq, decoder_input, decoder_hidden):"""入队:param probability: 概率乘积:param complete: 句子是否输出完成:param seq: 句子 包含token的list:param decoder_input: 下一个时间步进行解码的输入:param decoder_hidden: 下一个时间步进行解码的hidden:return: """heapq.heappush(self.heap, [probability, complete, seq, decoder_input, decoder_hidden])# 如果数据的个数大于beam_width则弹出if len(self.heap) > self.beam_width:# heappop会根据优先级从小到大弹出,所以优先级最大的beam_widt会被保存在堆中# 当两个元素的probability的优先级相同时,则根据complete优先级弹出heapq.heappop(self.heap)def __iter__(self):return iter(self.heap)

现在我们完成了保存数据的数据结构。

使用Beam search进行评估

在decoder中我们先定义一个函数处理序列

    def _prepar_seq(self, seq):"""去除seq中的<SOS>和<EOS>的token"""if seq[0].item() == ws.SOS:seq = seq[1:]if seq[-1].item() == ws.EOS:seq = seq[:-1]seq = [i.item() for i in seq]return seq

接下来在decoder中使用beam search

    def beam_search(self, encoder_outputs, encoder_hidden):"""使用堆来完成beam search:param encoder_outputs: [batch_size, seq_len, encoder_hidden_size]:param encoder_hidden: [1, batch_size, encoder_hidden_size]"""batch_size = encoder_hidden.size(1)# 1. 构造第一次需要的输入数据,保存在堆中decoder_input = torch.LongTensor([[ws.SOS]*batch_size]).to(device)  # [batch_size, 1]# 要输入的hiddendecoder_hidden = encoder_hiddenprev_beam = Beam()prev_beam.add(1, False, [decoder_input], decoder_input, decoder_hidden)while True:cur_beam = Beam()# 2. 取出堆中的数据,进行forward_step操作,获得当前时间步的output, hiddenfor _probability, _complete, _seq, _decoder_input, _decoder_hidden in prev_beam:# 判断前一次的 _complete是否为True,如果是则不需要forward# 有可能为True,但是概率并不是最大if _complete == True:cur_beam.add(_probability, _complete, _seq, _decoder_input, _decoder_hidden)else:# 需要进行forward操作decoder_output_t, decoder_hidden = self.forward_step(_decoder_input, _decoder_hidden, encoder_outputs)# 3. 从output中选择最大的beam width个输出,作为下一次的inputvalue, index = torch.topk(decoder_output_t, config.beam_width)  # [batch_size, beam_width]for m, n in zip(value[0], index[0]):decoder_input = torch.LongTensor([[n]]).to(config.device)seq = _seq + [n]  # 更新句子序列probability = _probability * m  # 更新概率乘积if n.item() == config.chatbot_ws_by_word_target.SOS:complete = Trueelse:complete = False# 4. 把下个时间步需要的输入等数据保存在一个新的堆中cur_beam.add(probability, complete, seq, decoder_input, decoder_hidden)# 5. 获取新的堆中的优先级最高(概率最大)的数据,判断数据是否以EOS结尾或者是达到最大长度# 若是则停止迭代# 若不是则继续best_prob, best_complete, best_seq, _, _ = max(cur_beam)if best_complete == True or len(best_seq) - 1 == config.chatbot_target_max_seq_len + 1:return self._perpar_seq(best_seq)else:prev_beam = cur_beam

http://www.15wanjia.com/news/191215.html

相关文章:

  • 网站建设先做前台还是后台网站建设板块如何分类
  • 公司级做宣传图的网站产品网站建站
  • 网站查询关键词排名软件外贸SOHO建公司网站
  • 西昌有做网站的公司吗国外做家装的网站有哪些
  • 免费下载的网站yeti wordpress
  • 设计在线设计网站室内设计师接单网
  • 做外贸网站报价汉中网站网站建设
  • 盗版视频网站建设费用iis怎么搭建asp网站
  • 怎么在百度上面做网站网站设计用什么做
  • 技术社区网站开发在线做静态头像的网站
  • 网站做app的软件叫什么网站选择语言怎么做
  • 怎么在网上做彩票网站长春微网站
  • 商业网站备案流程如何架设内部网站
  • wordpress网站被自动跳转宁波易通宁波网站建设
  • mvc5网站开发之美搭建网站架构怎么做
  • vps网站管理助手wordpress 分类目录404
  • 一流导航设计网站网站建设公司行业现状
  • 十大免费模板网站微信网站平台怎么建立
  • 商务网站开发的工作任务好模板网站
  • 邯郸市网站建设多少钱app推广多少钱一个
  • 建设网站出什么科目网站内部链接如何进行优化建设
  • 大学网站建设的意义建商城网站多少钱
  • wordpress如何去除底部沈阳seo公司
  • 外贸型网站的特点杭州市建设银行网站
  • 兰州市建设工程招标投标中心网站进入不wordpress
  • 官方网站建设 磐石网络知名网站建设后台管理实训报告
  • 旅游商城网站建设如何进行公司网站的建设
  • 网店推广方案范文东营企业网站排名优化
  • 诚讯通网站做网站的一年能挣多少钱
  • 全影网的网站哪儿做dwordpress 新浪图片