Python 单批欠装:罐装';t导致autoencoder过度拟合多批次1d数据。如何调试? TL;DR
我无法使用autoencoder对多个样本的批次进行过度拟合 完全连接的解码器似乎比conv解码器每批处理更多的样本,但当样本数增加时也会失败。 为什么会发生这种情况,以及如何调试这种情况?Python 单批欠装:罐装';t导致autoencoder过度拟合多批次1d数据。如何调试? TL;DR,python,deep-learning,pytorch,conv-neural-network,autoencoder,Python,Deep Learning,Pytorch,Conv Neural Network,Autoencoder,我无法使用autoencoder对多个样本的批次进行过度拟合 完全连接的解码器似乎比conv解码器每批处理更多的样本,但当样本数增加时也会失败。 为什么会发生这种情况,以及如何调试这种情况? 深入 我试图在大小为(n,1024)的1d数据点上使用自动编码器,其中n是批次中的样本数 我正试着把那一批装得过满 使用卷积解码器,我只能适应单个样本(n=1),当n>1时,我无法将损耗(MSE)降至0.2以下 蓝色:预期输出(=输入),橙色:重建。 单个样品,单个批次: 多个样品,单批,损失不会减少:
深入 我试图在大小为
(n,1024)
的1d数据点上使用自动编码器,其中n
是批次中的样本数
我正试着把那一批装得过满
使用卷积解码器,我只能适应单个样本(n=1
),当n>1
时,我无法将损耗(MSE)降至0.2以下
蓝色:预期输出(=输入),橙色:重建。
单个样品,单个批次:多个样品,单批,损失不会减少: 通过使用多个样本,我们可以看到网络学习了输入(=输出)信号的一般形状,但严重忽略了偏差
使用完全连接的解码器确实能够重建多个样本的批次:
相关代码: 编码器:
self._encoder = nn.Sequential(
# n, 1024
nn.Unflatten(dim=1, unflattened_size=(1, 1024)),
# n, 1, 1024
Conv1DBlock(in_channels=1, out_channels=8, kernel_size=15),
# n, 8, 512
Conv1DBlock(in_channels=8, out_channels=16, kernel_size=11),
# n, 16, 256
Conv1DBlock(in_channels=16, out_channels=32, kernel_size=7),
# n, 32, 128
Conv1DBlock(in_channels=32, out_channels=64, kernel_size=5),
# n, 64, 64
Conv1DBlock(in_channels=64, out_channels=128, kernel_size=3),
# n, 128, 32
nn.Conv1d(in_channels=128, out_channels=128, kernel_size=32, stride=1, padding=0), # FC
# n, 128, 1
nn.Flatten(start_dim=1, end_dim=-1),
# n, 128
)
conv解码器:
self._decoder = nn.Sequential(
nn.Unflatten(dim=1, unflattened_size=(128, 1)), # 1
Upsample1DBlock(in_channels=128, out_channels=64, factor=4), # 4
Upsample1DBlock(in_channels=64, out_channels=32, factor=4), # 16
Upsample1DBlock(in_channels=32, out_channels=16, factor=4), # 64
Upsample1DBlock(in_channels=16, out_channels=8, factor=4), # 256
Upsample1DBlock(in_channels=8, out_channels=1, factor=4), # 1024
nn.ReLU(True),
nn.Conv1d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=1),
nn.ReLU(True),
nn.Flatten(start_dim=1, end_dim=-1),
nn.Linear(1024, 1024)
)
FC解码器:
self._decoder = nn.Sequential(
nn.Linear(128, 256),
nn.ReLU(True),
nn.Linear(256, 512),
nn.ReLU(True),
nn.Linear(512, 1024),
nn.ReLU(True),
nn.Flatten(start_dim=1, end_dim=-1),
nn.Linear(1024, 1024)
)
另一个观察结果是,当批量大小增加更多时,比如说16,FC解码器也开始失败 在图中,我试图过度拟合16个样本批次中的4个样本
conv解码器可能有什么问题 如何调试或使conv解码器工作
- 我认为在你的情况下,不合身的主要原因是问题。您的网络是带有连接的简单自动编码器。因此,瓶颈中的代码应编码数据中有关偏差的足够信息,以便解码器进行学习
- 因此,如果使用ReLU激活功能,则负偏差数据信息可能会由于即将死亡的ReLU问题而丢失。解决方案是使用更好的激活函数,如LeakyReLU、ELU等
我认为培训代码也与该问题相关。请将它添加到问题中。@akshayk07我将添加它。同时,我会注意到,MNIST的培训使用了完全相同的培训代码和基础设施,并且可以用于过度培训和泛化,因此我怀疑它是否存在缺陷。即将消亡的relu确实是主要问题。然而,网络的深度不足以解决剩余连接的消失梯度问题,因为这不是问题所在。第二个问题是编码器的早期层中确实缺少通道。添加通道可以实现良好的收敛。
self._decoder = nn.Sequential(
nn.Linear(128, 256),
nn.ReLU(True),
nn.Linear(256, 512),
nn.ReLU(True),
nn.Linear(512, 1024),
nn.ReLU(True),
nn.Flatten(start_dim=1, end_dim=-1),
nn.Linear(1024, 1024)
)