LSTM网络中各层解读

构建深度神经网络最关键的部分之一是——当数据流经不同的层时,要对其有一个清晰的视图,这些层经历了维度的变化、形状的改变、扁平化和重新塑造……
 LSTM Network Architecture for Sentiment Analysis

结构顺序

每层解读:

  1. 把单词变为tokens;
  2. embedding 把每个token变成特定大小的embedding;
  3. LSTM 由隐藏状态维度和层数决定;
  4. 全连接层;
  5. 激活函数;
  6. 输出;

预处理

对数据进行了预处理,使得batch_size=50, 序列长度为200

dataiter = iter(train_loader)
x, y = dataiter.next()
x = x.type(torch.LongTensor)
print ('X is', x)
print ('Shape of X and y are :', x.shape, y.shape)

在这里插入图片描述
从X的形状可以看出,X是一个张量,为50行(=batch size)和200列(=sequence length)。

这个X将作为嵌入层的输入

Embedding layer

使用torch.nn.Embedding模块作嵌入。它需要两个参数:词汇表大小和嵌入的维数

from torch import nn
vocab_size = len(words)
embedding_dim = 30
embeds = nn.Embedding(vocab_size, embedding_dim)
print ('Embedding layer is ', embeds)
print ('Embedding layer weights ', embeds.weight.shape)

在这里插入图片描述

embeds_out = embeds(x)
print ('Embedding layer output shape', embeds_out.shape)
print ('Embedding layer output ', embeds_out)

在这里插入图片描述
从嵌入层的输出可以看出,它作为嵌入权值的结果创建了一个三维张量。现在它有50行,200列和30个嵌入维,也就是说,在我们的审查中,我们为每个标记化的单词添加了嵌入维。该数据现在将进入LSTM层

LSTM Layer

在定义LSTM层时,我们保持Batch First = True和隐藏单元的数量= 512。

# initializing the hidden state to 0
hidden=None
lstm = nn.LSTM(input_size=embedding_dim, hidden_size=512, num_layers=1, batch_first=True)
lstm_out, h = lstm(embeds_out, hidden)
print ('LSTM layer output shape', lstm_out.shape)
print ('LSTM layer output ', lstm_out)

在这里插入图片描述
通过查看LSTM层的输出,我们可以看到张量现在有50行,200列和512个LSTM节点。接下来,该数据被提取到全连接层
LSTM层的输出包括三个:Outputs: output, (h_n, c_n)
Outputs是整个模型的所有h参数的输出,张量大小为(N,L,D∗H)
h_n代表最后一个h的输出,张量大小为(D∗num_layers,N,H)
c_n代表最后一个c的输出,张量大小为(D∗num_layers,N,H)

Fully Connected Layer

对于全连通层,输入特征数= LSTM中隐藏单元数。输出大小= 1,因为我们只有二进制结果(1/0;正和负)

fc = nn.Linear(in_features=512, out_features=1)
fc_out = fc(lstm_out.contiguous().view(-1, 512))
print ('FC layer output shape', fc_out.shape)
print ('FC layer output ', fc_out)

注意,在将lstm输出放入fc层之前,必须将其压平。

fc = nn.Linear(in_features=512, out_features=1)
fc_out = fc(lstm_out.contiguous().view(-1, 512))
print ('FC layer output shape', fc_out.shape)
print ('FC layer output ', fc_out)

在这里插入图片描述

Sigmoid Activation Layer

这只是为了将所有的输出值从完全连接的层转换为0到1之间的值

sigm = nn.Sigmoid()
sigm_out = sigm(fc_out)
print ('Sigmoid layer output shape', sigm_out.shape)
print ('Sigmoid layer output ', sigm_out)

在这里插入图片描述

Final Output

这包括两个步骤:首先,重塑输出,使rows = batch大小

batch_size = x.shape[0]
out = sigm_out.view(batch_size, -1)
print ('Output layer output shape', out.shape)
print ('Output layer output ', out)

在这里插入图片描述
正如我们在网络体系结构中看到的那样——我们只希望在最后一个序列之后进行输出(在最后一个时间步之后)

print ('Final sentiment prediction, ', out[:,-1])

在这里插入图片描述

这些输出来自未经训练的网络,因此这些值可能还不表示任何内容。这只是为了说明,我们将使用这些知识来正确定义模型。

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
LSTM网络添加Attention层可以提高模型对输入序列的关注程度,使得模型能够更好地理解输入序列的重要信息。下面是在LSTM网络添加Attention层的一般步骤: 1. 对于每个时间步的LSTM隐藏状态,计算其与一个可学习的向量(通常称为query向量)之间的相似度,得到一个注意力权重向量。 2. 将注意力权重向量与LSTM隐藏状态向量相乘,并对结果进行求和,得到一个加权后的向量表示。 3. 将加权后的向量表示输入到下一个时间步的LSTM,继续进行处理。 具体实现方式可以参考以下步骤: 1. 定义Attention层的输入:LSTM隐藏状态序列。在Keras,可以使用`Input`函数来定义Attention层的输入,例如: ``` lstm_hidden_states = Input(shape=(None, lstm_hidden_size)) ``` 2. 定义Query向量。在Keras,可以使用`Dense`函数来定义Query向量,例如: ``` query = Dense(lstm_hidden_size, activation='tanh')(lstm_hidden_states) ``` 3. 计算注意力权重向量。在Keras,可以使用`Dot`函数来计算注意力权重向量,例如: ``` attention_weights = Dot(axes=(2, 1))([query, lstm_hidden_states]) attention_weights = Activation('softmax')(attention_weights) ``` 4. 将注意力权重向量与LSTM隐藏状态向量相乘并求和。在Keras,可以使用`Dot`函数和`Lambda`函数来实现注意力加权和的计算,例如: ``` attention_output = Dot(axes=(2, 1))([attention_weights, lstm_hidden_states]) attention_output = Lambda(lambda x: K.sum(x, axis=1))(attention_output) ``` 注意,这里使用了`K.sum`函数来对注意力加权和进行求和,因为在时间步上进行加权和是有意义的,而在特征维度上进行加权和则没有意义。 5. 将注意力加权和作为下一个时间步的输入。在Keras,可以使用`Concatenate`函数将注意力加权和与LSTM输出拼接在一起,例如: ``` lstm_output = Concatenate(axis=-1)([lstm_output, attention_output]) ``` 注意,这里使用了`axis=-1`来表示在最后一个维度上进行拼接,因为LSTM输出的最后一个维度是隐藏状态的维度,而注意力加权和的维度也是隐藏状态的维度,因此可以在这个维度上进行拼接。 6. 将Attention层嵌入到LSTM模型,并进行训练。在Keras,可以使用`Model`函数将Attention层和LSTM层组合成一个模型,例如: ``` lstm_input = Input(shape=(max_sequence_length, input_dim)) lstm_output = LSTM(lstm_hidden_size, return_sequences=True)(lstm_input) attention_output = ... # 定义Attention层的输出 lstm_output = Concatenate(axis=-1)([lstm_output, attention_output]) lstm_output = ... # 继续定义LSTM层和其他层的输出 model = Model(inputs=lstm_input, outputs=...) model.compile(...) model.fit(...) ``` 注意,这里使用了`return_sequences=True`来保留LSTM层的所有输出,因为需要将每个时间步的输出与Attention加权和进行拼接。同时,还需要定义其他层的输出,并使用`Model`函数将所有层组合成一个模型,然后使用`compile`函数和`fit`函数进行训练。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值