• base_network


    base_network

    外界导入包 from utils import *

    “”"Bi-LSTM Encoder

        Args:
            input_size: (int) vocab word2vec dim
            hidden_size: (int) hidden size in Bi-LSTM
            num_layers: (int) num_layers in Bi-LSTM
            bi: (boolean) Bi-direction
        """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    初始化 Bi-LSTM参数

        self.input_size = input_size
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.bi = bi
    
    • 1
    • 2
    • 3
    • 4

    Model

    nn.LSTM(self.input_size,
    self.hidden_size,
    num_layers=self.num_layers,
    batch_first=True,
    bidirectional=self.bi)

    前向

    def forward(self, *input):
            self.rnn.flatten_parameters()
    
            x_emb, x_len, return_type = input  # (batch_size, max_len, word2vec_dim) (batch_size, )
    
            # BiLSTM
            total_length = x_len.max()
    
            x_packed = nn.utils.rnn.pack_padded_sequence(x_emb, x_len.cpu(), batch_first=True, enforce_sorted=False)
            out_lstm, hidden = self.rnn(x_packed)
            out, _ = nn.utils.rnn.pad_packed_sequence(out_lstm, batch_first=True, total_length=total_length)
    
            # vector represent
            if return_type == 'mean_pooling':
                out = out.sum(dim=1).div(x_len.float().unsqueeze(-1))  # (batch_size, num_directions * hidden_size)
            elif return_type == 'all_return':  # (batch_size, max_len, num_directions * hidden_size)
                pass
            return out
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    代码解释

    • self.rnn.flatten_parameters()
      重置参数数据指针,以遍使用更快的代码路径

    nn.utils.rnn.pack_padded_sequence

    在使用pytorch处理数据时,一般是采用batch的形式同时处理多个样本序列,而每个batch中的样本序列是不等长的,导致rnn无法处理。所以,通常的做法是先将每个batch按照最长的序列进行padding处理等长的形式
    (通常,将每个batch按照最长的序列进行padding处理等长的方式

    padding操作会带来一个问题,那就是对于多数进行padding过的序列,会导致rnn对它的表示多了很多无用的字符,我们希望的是在最后一个有用的字符后就可以输出该序列的向量表示,而不是在很多padding字符后

    这时候,pack操作就派上场了,可以理解成,它是将一个经过padding后的变长序列压紧****,压缩后就不含padding的字符0了。具体操作就是:

    • 第一步,padding后的输入序列先经过nn.utils.rnn.pack_padded_sequence,这样会得到一个PackedSequence类型的object,可以直接传给RNN(RNN的源码中的forward函数里上来就是判断输入是否是PackedSequence的实例,进而采取不同的操作,如果是则输出也是该类型。);
    • 第二步,得到的PackedSequence类型的object,正常直接传给RNN,得到的同样是该类型的输出
    • 第三步,再经过nn.utils.rnn.pad_packed_sequence,也就是对经过RNN后的输出重新进行padding操作,得到正常的每个batch等长的序列

    向量表示

    if return_type == ‘mean_pooling’:
    out = out.sum(dim=1).div(x_len.float().unsqueeze(-1)) # (batch_size, num_directions * hidden_size)
    elif return_type == ‘all_return’: # (batch_size, max_len, num_directions * hidden_size)
    pass
    return out

    会自己调整输出压缩至-1维度。

    慢慢的自己将其研究透彻,都行啦的回事与打算。
    明天自己把双向LSTM也看一看,都行啦,自己将其研究透彻都行啦的回事与打算
    把模型看看,然后自己对比以下代码,经模型经过给其搞透彻。
    全部
    要学会掌握,都行啦的样子与打算
    。慢慢的自己整理都行啦的回事与打算。

  • 相关阅读:
    【Docker学习系列】Docker学习1-docker安装
    全球名校AI课程库(8)| Berkeley伯克利 · 全栈深度学习训练营课程『Full Stack Deep Learnin』
    java-net-php-python-springboot办公自动化系统计算机毕业设计程序
    sdkman 的安装配置与 sdk 管理
    设计模式之迭代器模式
    [设计模式] 建造者模式
    fluent计算内存问题
    构建基于深度学习神经网络协同过滤模型(NCF)的视频推荐系统(Python3.10/Tensorflow2.11)
    记一次MySQL安装过程中遇到的问题
    Android 12.0 Launcher3 去掉Hotseat功能
  • 原文地址:https://blog.csdn.net/kuxingseng123/article/details/128155308