我对在Pytorch中使用LSTM相当陌生,我正在尝试创建一个模型,该模型获得一个大小为42的张量和62的序列(因此每个大小为42的62张量a)。
这意味着我在一个序列中有62个张量。每个张量的大小为42。(形状为[62,42]。称此输入张量。
我想以此预测一个张量为1的张量,该张量为8(即大小为1的张量和8个序列)。
这意味着在每个大小为1的序列中有8个张量。将此标签张量称为。
这些张量之间的联系是这样的:
输入张量由列组成:
A1 A2 A3 ...... A42
而标签张量如果更像:
A3
我要显示的是,如果需要,标签张量可以在所有位置填充零而不是A3的值,因此它的长度可以达到42。
我怎样才能做到这一点?因为根据我从Pytorch文档中读取的内容,我只能以相同的比率进行预测(1点预测为1),而我想根据42的张量进行预测,其中62的序列为1的张量和8的序列。
可以吗?我是否需要将预测张量从1填充到大小42?
谢谢!
一个好的解决方案是使用seq2seq
最佳答案
如果我正确理解了您的问题,那么在给定长度为62的序列的情况下,您希望预测长度为8的序列,就您的输出顺序而言很重要,如果您正在进行某些时间序列预测,就是这种情况。在这种情况下,使用seq2seq模型将是一个不错的选择,这是此link的教程。 Globbaly,您需要实现编码器和解码器,以下是这种实现的示例:
class EncoderRNN(nn.Module):
def __init__(self, input_dim=42, hidden_dim=100):
super(EncoderRNN, self).__init__()
self.hidden_size = hidden_size
self.lstm = nn.LSTM(input_dim, hidden_dim)
def forward(self, input, hidden):
output, hidden = self.lstm(input, hidden)
return output, hidden
def initHidden(self):
return torch.zeros(1, 1, self.hidden_size, device=device)
class DecoderRNN(nn.Module):
def __init__(self, hidden_dim, output_dim):
super(DecoderRNN, self).__init__()
self.hidden_dim = hidden_dim
self.lstm = nn.LSTM(hidden_dim, hidden_dim)
self.out = nn.Linear(hidden_dim, output_dim)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input, hidden):
output, hidden = self.lstm(input, hidden)
output = self.softmax(self.out(output[0]))
return output, hidden
def initHidden(self):
return torch.zeros(1, 1, self.hidden_size, device=device)
如果您的8个输出的顺序不重要,则可以在LSTM层之后简单地添加一个线性层,其线性单位为8个单位。在这种情况下,您可以直接使用此代码
class Net(nn.Module):
def __init__(self, hidden_dim=100, input_dim=42, output_size=8):
super(Net, self).__init__()
self.hidden_dim = hidden_dim
self.lstm = nn.LSTM(input_dim, hidden_dim, batch_first=True)
# The linear layer that maps from hidden state space to tag space
self.fc = nn.Linear(hidden_dim, output_size_size)
def forward(self, seq):
lstm_out, _ = self.lstm(seq)
output = self.fc(lstm_out)
return output
关于deep-learning - 用pytorch创建LSTM模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59520620/