为什么这个 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的图像。我不认为你可以用这样的压缩恢复任何东西
我建议为您查找卷积架构
您好,我正在尝试了解以下 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的图像。我不认为你可以用这样的压缩恢复任何东西
我建议为您查找卷积架构