【发布时间】:2019-06-22 00:38:04
【问题描述】:
我正在尝试使用 PyTorch 构建一个非常简单的 LSTM 自动编码器。我总是用相同的数据训练它:
x = torch.Tensor([[0.0], [0.1], [0.2], [0.3], [0.4]])
我已经按照this 链接构建了我的模型:
inputs = Input(shape=(timesteps, input_dim))
encoded = LSTM(latent_dim)(inputs)
decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(input_dim, return_sequences=True)(decoded)
sequence_autoencoder = Model(inputs, decoded)
encoder = Model(inputs, encoded)
我的代码运行没有错误,但 y_pred 收敛到:
tensor([[[0.2]],
[[0.2]],
[[0.2]],
[[0.2]],
[[0.2]]], grad_fn=<StackBackward>)
这是我的代码:
import torch
import torch.nn as nn
import torch.optim as optim
class LSTM(nn.Module):
def __init__(self, input_dim, latent_dim, batch_size, num_layers):
super(LSTM, self).__init__()
self.input_dim = input_dim
self.latent_dim = latent_dim
self.batch_size = batch_size
self.num_layers = num_layers
self.encoder = nn.LSTM(self.input_dim, self.latent_dim, self.num_layers)
self.decoder = nn.LSTM(self.latent_dim, self.input_dim, self.num_layers)
def init_hidden_encoder(self):
return (torch.zeros(self.num_layers, self.batch_size, self.latent_dim),
torch.zeros(self.num_layers, self.batch_size, self.latent_dim))
def init_hidden_decoder(self):
return (torch.zeros(self.num_layers, self.batch_size, self.input_dim),
torch.zeros(self.num_layers, self.batch_size, self.input_dim))
def forward(self, input):
# Reset hidden layer
self.hidden_encoder = self.init_hidden_encoder()
self.hidden_decoder = self.init_hidden_decoder()
# Reshape input
input = input.view(len(input), self.batch_size, -1)
# Encode
encoded, self.hidden = self.encoder(input, self.hidden_encoder)
encoded = encoded[-1].repeat(5, 1, 1)
# Decode
y, self.hidden = self.decoder(encoded, self.hidden_decoder)
return y
model = LSTM(input_dim=1, latent_dim=20, batch_size=1, num_layers=1)
loss_function = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.0001)
x = torch.Tensor([[0.0], [0.1], [0.2], [0.3], [0.4]])
while True:
y_pred = model(x)
optimizer.zero_grad()
loss = loss_function(y_pred, x)
loss.backward()
optimizer.step()
print(y_pred)
【问题讨论】:
-
我想知道你为什么
repeat编码状态5次?在一些图像描述方法中,它们仅将编码版本作为第一个时间步传递,然后它们使用循环功能来生成向量的其余部分,直到它生成某种<stop>标记。也许试试这个? -
您是否正在尝试学习 5 项序列?我想知道您的 input_dim 是否应该 >1 以允许生成序列而不是单个 1-dim 浮点预测?
-
machinelearningmastery.com/lstm-autoencoders 使用
model.add(RepeatVector(n_in))并设法生成预期的序列。 -
是的,我正在尝试精简一个 n 项序列(在这种特殊情况下,n=5)。我不确定为什么
input_dim不应该是 1,因为我的输入序列只有 1 个特征。 -
Pytorch 的 LSTM 期望其所有输入为 3D tensors
标签: python machine-learning lstm pytorch