【问题标题】:Confused about stacked tensor input to Multilayer perceptron in Pytorch对 Pytorch 中多层感知器的堆叠张量输入感到困惑
【发布时间】:2021-09-30 05:59:54
【问题描述】:

我有一个格式为 sequence_len x C x H x W = [10, 3, 16, 16] 的输入序列(假设批量大小 = 1)。这些是 10 张图像堆叠在一个火炬张量中。我希望将其传递给 MLP 并从 MLP 获得接下来的 10 个作为预测。 MLP 的结构有一个隐藏层,有 32 个单元。 如果我将维度 1 - [10, 768] 的输入展平

我当前的代码如下所示:

class MLP3(nn.Module):
    
    def __init__(self, ip_layers):
        super().__init__()
        self.layers = nn.Sequential(
        nn.Linear(ip_layers, 32),
        nn.ReLU(),
        nn.Linear(32, 32),
        nn.ReLU(),
        nn.Linear(32, 10)
    )

    def forward(self, x):
        #forward
        return self.layers(x)

但是,我无法传递整个张量,并且不确定如何从 MLP 获得 10 个输出。任何帮助将不胜感激。 TIA

【问题讨论】:

  • 我会对你说实话。由于很多原因,您无法做到这一点。有些与代码有关,有些与你对深度学习的理解有关。因此,在您尝试在代码中实现它之前,您应该阅读很多主题。像ConvolutionsLSTMsVAETemporal Coherence 等等。另外,顺便提一下,您分享的问题来自一个相对先进的深度学习领域。
  • @AbhishekPrajapat 我认为这是可能的,如果我将数据重塑为 [batchsize*sequence_len, 3, 16, 16] 分别处理每个输入并获得所需数量的输出。因为 MLP 或 CNN 不像 LSTM 或 RNN 那样关心序列。
  • 是的,这在技术上是可行的,但是当我说这不可能时,我的意思是这样做你根本无法获得任何结果。但是,如果您仍然想这样做,那么我会写一个答案。
  • @AbhishekPrajapat 这里的挑战是,我在 CNN 和 LSTM 之间有这个 MLP。 LSTM 需要一个 batch_size,这在 MLP/CNN 的情况下会导致混淆

标签: python deep-learning pytorch mlp


【解决方案1】:

要最终获得 10 个输出,您必须使用多通道模型。为此,您必须在 __init__ 函数中定义 base_model 并修改您的其他数据集和 forward 函数并为每个类写入损失。我会为你写一个样板文件

class SDataset(torch.nn.utils.Dataset):
  def __init__(self):
    ....
  def __getitem__(self, idx):
    ....
    '''
    Till now everything was the same as before.
    Now the below thing is something that you have to change.
    '''
    outimg1 = self.image_seq[idx+1]
    outimg2 = self.image_seq[idx+2]
    .
    .
    outimg10 = self.image_seq[idx+10]

    return X, (outimg1, outimg2 ..... outimg10)

型号

class Predictor(torch.nn.Module):
  def __init__(self):
    super(Predictor, self).__init__()
    self.base_model = somebasemodel
    self.out1 = # Takes input from base_model and output an image
    self.out2 = # ....
    .
    .
    self.out10 = # ...

  def forward(self, x):
    features = self.base_model(x)
    res1 = self.out1(features)
    .
    .
    res10 = self.out10(features)
    return res1, res2, .... res10

训练步骤

inputs, outputs = batch
preds = model(inputs)
optimizer.zero_grad()
loss1 = criterion(preds[0], outputs[0])
.
.
loss10 = criterion(preds[9], outputs[9])
total_loss = loss1 + loss2 + ... + loss10
total_loss.backward()
optimizer.step()

到此为止。

【讨论】:

  • 这不是最好的方法,但感谢您的努力。 Torch.nn.Linear 接受张量输入,只需设置正确的批大小,即可在输出中获得序列。
猜你喜欢
  • 2020-01-02
  • 2021-04-06
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2017-09-27
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多