使用Pytork为多个功能设置LSTM自动编码器
发布时间:2022-03-23 13:26:05 289
相关标签:
我正在建立一个LSTM自动编码器去噪信号,并将采取一个以上的功能,因为它的输入。
我已经按照如下方式设置了模型编码器部件,该部件适用于单特征输入(即仅具有一个特征的序列):
class Encoder(nn.Module):
def __init__(self, seq_len, n_features, num_layers=1, embedding_dim=64):
super(Encoder, self).__init__()
self.seq_len = seq_len
self.n_features = n_features
self.num_layers = num_layers
self.embedding_dim = embedding_dim
self.hidden_dim = 2 * embedding_dim
# input: batch_size, seq_len, features
self.lstm1 = nn.LSTM(
input_size=self.n_features,
hidden_size=self.hidden_dim,
num_layers=self.num_layers,
batch_first=True
) # output: batch size, seq_len, hidden_dim
# input: batch_size, seq_len, hidden_dim
self.lstm2 = nn.LSTM(
input_size=self.hidden_dim,
hidden_size = self.embedding_dim,
num_layers = self.num_layers,
batch_first=True
) # output: batch_size, seq_len, embedding_dim
def forward(self, x):
print(x)
x = x.reshape((1, self.seq_len, self.n_features))
print(x.shape)
x, (_, _) = self.lstm1(x)
print(x.shape)
x, (hidden_n, _) = self.lstm2(x)
print(x.shape, hidden_n.shape)
print(hidden_n)
return hidden_n.reshape((self.n_features, self.embedding_dim))
当我按如下方式测试此设置时:
model = Encoder(1024, 1)
model.forward(torch.randn(1024, 1))
1代表一个单一的特征,一切都很好。但是,当我执行以下操作时(其中2代表由2个功能组成的序列):
model = Encoder(1024, 2)
model.forward(torch.randn(1024, 2))
我得到以下错误:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
Input In [296], in ()
----> 1 model.forward(torch.randn(1024, 2))
Input In [294], in Encoder.forward(self, x)
36 print(hidden_n)
37 # print(hidden_n.reshape((self.n_features, self.embedding_dim)).shape)
---> 39 return hidden_n.reshape((self.n_features, self.embedding_dim))
RuntimeError: shape '[2, 64]' is invalid for input of size 64
|
这个hidden_n
形状显示为torch.Size([1, 1, 64])
.我想了解,如果我们有不止一个功能,例如2个,我们是否希望将该形状转换为1, 2, 64
这样隐藏状态对这两个特征都有权重?
有人能解释一下为什么重塑不喜欢我试图重组编码器输出的方式,以及我应该如何做,以便模型能够考虑任何特征尺寸。
我遗漏了什么/可能是误解了什么?
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报