为什么这个 PyTorch AutoEncoder 的参数要这样硬编码?

Why are the parameters of this PyTorch AutoEncoder hardcoded this way?

您好,我正在尝试了解以下 PyTorch AutoEncoder 代码的工作原理。下面的代码使用了 28X28 的 MNIST 数据集。我的问题是如何选择 nn.Linear(128,3) 参数?

我有一个 512X512 的数据集,我想修改此 AutoEncoder 的代码以支持它。

class LitAutoEncoder(pl.LightningModule):

def __init__(self):
    super().__init__()
    self.encoder = nn.Sequential(nn.Linear(28 * 28, 128), nn.ReLU(), nn.Linear(128, 3))
    self.decoder = nn.Sequential(nn.Linear(3, 128), nn.ReLU(), nn.Linear(128, 28 * 28))

def forward(self, x):
    # in lightning, forward defines the prediction/inference actions
    embedding = self.encoder(x)
    return embedding

def training_step(self, batch, batch_idx):
    # training_step defined the train loop. It is independent of forward
    x, y = batch
    x = x.view(x.size(0), -1)
    z = self.encoder(x)
    x_hat = self.decoder(z)
    loss = F.mse_loss(x_hat, x)
    return loss

def configure_optimizers(self):
    optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)
    return optimizer

我假设输入图像数据是这种形状:x.shape == [bs, 1, h, w],其中 bs 是批量大小。然后,x首先被视为[bs, h*w],即[bs, 28*28]。这意味着图像中的所有像素都被展平为一维矢量。

然后在编码器中:

  • nn.Linear(28*28, 128) 接受大小为 [bs, 28*28] 的扁平化输入并输出大小为 [bs, 128]
  • 的中间结果
  • nn.Linear(128, 3): [bs, 128] -> [bs, 3]

然后在解码器中:

  • nn.Linear(3, 128): [bs, 3] -> [bs, 128]
  • nn.Linear(128, 28*28): [bs, 128] -> [bs, 28*28]

然后将最终输出与输入进行匹配。

如果您想为 512x512 图像使用确切的架构,只需将代码中出现的每个 28*28 更改为 512*512。然而,这是一个非常不可行的选择,原因如下:

  • 对于 MNIST 图像,nn.Linear(28*28, 128) 包含 28x28x128+128=100480 个参数,而对于您的图像 nn.Linear(512*512, 128) 包含 512x512x128+128=33554560 个参数。尺寸过大,可能导致过拟合
  • 中间数据[bs, 3]只使用了3个浮点数来编码一个512x512的图像。我不认为你可以用这样的压缩恢复任何东西

我建议为您查找卷积架构