阿给—Unique 2023-02-27 13:07 采纳率: 0%
浏览 86
已结题

如何实现多步时空预测

在使用convlstm、PredRNN进行时空预测时,看到采用的网络结构为堆叠网络层,数据集为moving mnist等,输入长度为10,网络模型输出长度也为10;然而我想固定输入长度,输出长度可变,以对应短、中、长期预测。例如输出长度为10,想要预测长度为3、6或者9.
目前我所了解的方法有编码-解码架构,可以输出不同长度的序列;还可以通过将多步预测问题变为单步预测,即使用预测出的结果作为下一次的输入,进行预测,进而实现多步预测。
现在我想问问各位专家们还有没有其它方法来解决这个问题。

例如,如果基于moving mnist数据集,使用前十帧预测未来三帧。
采用Encoder-Decoder预测,在中间加入自注意力机制,能否提供一个相关的详细代码。
如果基于自回归模型,能否提供一个相关的代码。

  • 写回答

6条回答 默认 最新

  • CodeBytes 2023-02-27 13:42
    关注

    该回答引用ChatGPT

    如有疑问可以回复我

    您提到的编码-解码架构是一种常见的解决变长输出问题的方法。这种方法通常采用编码器网络将输入序列转换为一个固定长度的向量表示,然后将这个向量输入到解码器网络中,生成可变长度的输出序列。这种方法在循环神经网络(RNN)和卷积神经网络(CNN)中都有应用,例如seq2seq模型和Transformer模型。

    另外一种方法是使用递归预测,也称为自回归模型。这种方法是将多步预测问题转化为单步预测问题,即通过预测出当前时刻的输出,将其作为下一时刻的输入,然后再进行预测,以此类推,直到生成所需长度的输出序列。这种方法通常使用RNN或CNN来进行递归预测。

    需要注意的是,使用递归预测方法时,每次预测都会引入一定的误差,因此对于较长的预测序列,误差可能会不断累积导致性能下降。因此,应该权衡预测长度和精度之间的关系,以选择适当的预测长度。

    这里提供一个简单的编码-解码架构的实现,以用于变长输出的序列预测。该代码使用PyTorch框架,并以LSTM为例。在本例中,我们将输入序列视为长度为10的固定长度,将输出序列长度作为网络的一个可变参数,使其可以根据需要生成长度不同的输出序列。

    import torch
    import torch.nn as nn
    
    class Encoder(nn.Module):
        def __init__(self, input_size, hidden_size, num_layers):
            super(Encoder, self).__init__()
            self.hidden_size = hidden_size
            self.num_layers = num_layers
            self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
    
        def forward(self, x):
            h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
            c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
            out, _ = self.lstm(x, (h0, c0))
            return out[:, -1, :]
    
    class Decoder(nn.Module):
        def __init__(self, hidden_size, output_size, num_layers):
            super(Decoder, self).__init__()
            self.hidden_size = hidden_size
            self.num_layers = num_layers
            self.lstm = nn.LSTM(output_size, hidden_size, num_layers, batch_first=True)
            self.fc = nn.Linear(hidden_size, output_size)
    
        def forward(self, x, hidden):
            out, hidden = self.lstm(x, hidden)
            out = self.fc(out)
            return out, hidden
    
    class Seq2Seq(nn.Module):
        def __init__(self, input_size, hidden_size, output_size, num_layers):
            super(Seq2Seq, self).__init__()
            self.encoder = Encoder(input_size, hidden_size, num_layers)
            self.decoder = Decoder(hidden_size, output_size, num_layers)
    
        def forward(self, x, target_length):
            encoder_out = self.encoder(x.unsqueeze(0))
            decoder_hidden = (encoder_out.unsqueeze(0), torch.zeros_like(encoder_out).unsqueeze(0))
            decoder_input = torch.zeros(x.size(0), 1, x.size(1)).to(x.device)
            outputs = []
            for t in range(target_length):
                decoder_output, decoder_hidden = self.decoder(decoder_input, decoder_hidden)
                outputs.append(decoder_output)
                decoder_input = decoder_output
            outputs = torch.cat(outputs, dim=1)
            return outputs.squeeze(0)
    
    
    
    

    在这个实现中,编码器将输入序列x转换为一个固定长度的向量表示,然后将该向量作为初始状态输入到解码器中。解码器的输出被传递到一个全连接层进行转换,并且转换后的输出作为下一时刻的输入被传递到解码器中,以此类推生成可变长度的输出序列。在forward函数中,我们传递了一个target_length参数,用于指定输出序列的长度,因此这个模型可以根据需要生成不同长度的输出序列。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月7日
  • 修改了问题 3月1日
  • 创建了问题 2月27日

悬赏问题

  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源