机器翻译之Bahdanau注意力机制在Seq2Seq中的应用

目录

1.创建 添加了Bahdanau的decoder 

2. 训练

 3.定义评估函数BLEU

 4.预测

 5.知识点个人理解


1.创建 添加了Bahdanau的decoder 

import torch
from torch import nn
import dltools


#定义注意力解码器基类
class AttentionDecoder(dltools.Decoder):  #继承dltools.Decoder写注意力编码器的基类
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        
    @property    #装饰器, 定义的函数方法可以像类的属性一样被调用
    def attention_weights(self):
        #raise用于引发(或抛出)异常
        raise NotImplementedError  #通常用于抽象基类中,作为占位符,提醒子类必须实现这个方法。 


#创建 添加了Bahdanau的decoder
#继承AttentionDecoder这个基类创建Seq2SeqAttentionDecoder子类, 子类必须实现父类中NotImplementedError占位的方法
class Seq2SeqAttentionDecoder(AttentionDecoder):  
    #初始化属性和方法
    def __init__(self, vocab_size, embed_size, num_hiddens, num_layers, dropout=0, **kwargs):
        """
        vocab_size:此表大小,  相当于输入数据的特征数features,  也是输出数据的特征数
        embed_size:嵌入层的大小:将输入数据处理成小批量的数据
        num_hiddens:隐藏层神经元的数量
        num_layers:循环网络的层数
        dropout=0:不释放模型的参数(比如:神经元)
        """
        super().__init__(**kwargs)
        
        #初始化注意力机制的评分函数方法
        self.attention = dltools.AdditiveAttention(key_size=num_hiddens,
                                                   query_size=num_hiddens, 
                                                   num_hiddens=num_hiddens,
                                                   dropout=dropout)
        #初始化嵌入层:将输入的数据处理成小批量的tensor数据   (文本--->数值的映射转化)
        self.embedding = nn.Embedding(num_embeddings=vocab_size, embedding_dim=embed_size)
        #初始化循环网络
        self.rnn = nn.GRU(embed_size+num_hiddens, num_hiddens, num_layers, dropout=dropout)
        #初始化线性层  (输出层)
        self.dense = nn.Linear(num_hiddens, vocab_size)
        
    #初始化隐藏层的状态state   (计算state,需要编码器的输出结果、序列的有效长度)
    def init_state(self, enc_outputs, enc_valid_lens, *args):
        #enc_outputs是一个元组(输出结果,隐藏状态)
        #outputs的shape=(batch_size, num_steps, num_hiddens)
        #hidden_state的shape=(num_layers, batch_size, num_hiddens)
        outputs, hidden_state = enc_outputs
        #返回一个元组(,),可以用一个变量接收
        #outputs.permute(1, 0, 2)转换数据的维度是因为rnn循环神经网络的输入要求是先n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值