gpt4 book ai didi

python-3.x - `return_sequences = False` 在 pytorch LSTM 中等效

转载 作者:行者123 更新时间:2023-12-04 00:56:29 26 4
gpt4 key购买 nike

在 tensorflow/keras 中,我们可以简单地设置 return_sequences = False对于分类/完全连接/激活(softmax/sigmoid)层之前的最后一个 LSTM 层,以摆脱时间维度。

在 PyTorch 中,我没有找到类似的东西。对于分类任务,我不需要序列到序列模型,而是像这样的多对一架构:

enter image description here

这是我的简单双 LSTM 模型。

import torch
from torch import nn

class BiLSTMClassifier(nn.Module):
def __init__(self):
super(BiLSTMClassifier, self).__init__()
self.embedding = torch.nn.Embedding(num_embeddings = 65000, embedding_dim = 64)
self.bilstm = torch.nn.LSTM(input_size = 64, hidden_size = 8, num_layers = 2,
batch_first = True, dropout = 0.2, bidirectional = True)
# as we have 5 classes
self.linear = nn.Linear(8*2*512, 5) # last dimension
def forward(self, x):
x = self.embedding(x)
print(x.shape)
x, _ = self.bilstm(x)
print(x.shape)
x = self.linear(x.reshape(x.shape[0], -1))
print(x.shape)

# create our model

bilstmclassifier = BiLSTMClassifier()

如果我观察每一层后的形状,
xx = torch.tensor(X_encoded[0]).reshape(1,512)
print(xx.shape)
# torch.Size([1, 512])
bilstmclassifier(xx)
#torch.Size([1, 512, 64])
#torch.Size([1, 512, 16])
#torch.Size([1, 5])

我该怎么做才能让最后一个 LSTM 返回一个形状为 (1, 16) 的张量而不是 (1, 512, 16) ?

最佳答案

最简单的方法是索引张量:

x = x[:, -1, :]

哪里 x是 RNN 输出。当然,如果 batch_firstFalse ,必须使用 x[-1, :, :] (或只是 x[-1] )改为索引到时间轴。事实证明,这与 Tensorflow/Keras 所做的相同。相关代码可以在 K.rnn中找到 here :
last_output = tuple(o[-1] for o in outputs)

请注意,此时的代码使用 time_major数据格式,所以索引在第一个轴上。另外, outputs是一个元组,因为它可以是多个层、状态/单元对等,但它通常是所有时间步长的输出序列。

然后在 RNN 中使用它类如下:
if self.return_sequences:
output = K.maybe_convert_to_ragged(is_ragged_input, outputs, row_lengths)
else:
output = last_output

所以总的来说,我们可以看到 return_sequences=False只是使用 outputs[-1] .

关于python-3.x - `return_sequences = False` 在 pytorch LSTM 中等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62204109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com