base_network
admin
2024-03-14 00:08:21

base_network

外界导入包 from utils import *

“”"Bi-LSTM Encoder

    Args:input_size: (int) vocab word2vec dimhidden_size: (int) hidden size in Bi-LSTMnum_layers: (int) num_layers in Bi-LSTMbi: (boolean) Bi-direction"""

初始化 Bi-LSTM参数

    self.input_size = input_sizeself.hidden_size = hidden_sizeself.num_layers = num_layersself.bi = bi

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, )# BiLSTMtotal_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 representif 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)passreturn out

代码解释

  • 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也看一看,都行啦,自己将其研究透彻都行啦的回事与打算
把模型看看,然后自己对比以下代码,经模型经过给其搞透彻。
全部
要学会掌握,都行啦的样子与打算
。慢慢的自己整理都行啦的回事与打算。

相关内容

热门资讯

解读新版中国共产党纪律处分条例...  历时14个月,重修后的《中国共产党纪律处分条例》10月21日正式发布。新条例将“妄议中央大政方针,...
最新或2023(历届)新修订的...  从原条例的3编、15章、178条、2.4万余字,到修订后的3编、11章、133条、1.7万余字,《...
最新或2023(历届)中国共产...   近日新修订的《中国共产党纪律处分条例》对外公布,引发各界关注。记者梳理了几条颇受关注的规定,解读...
每周研选| 开年市场新高后如何... A股市场自2025年12月17日以来持续上行,元旦之后更是放量大涨。1月9日上证指数成功站上4100...
最严党纪中国共产党纪律处分条例...  10月21日,中共中央印发了《中国共产党纪律处分条例》。该条例被不少党建专家称为“改革开放以来最全...