发件人 : https://debuggercafe.com/implementing-deep-autoencoder-in-pytorch/定义了以下自动编码器
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
# encoder
self.enc1 = nn.Linear(in_features=784, out_features=256)
self.enc2 = nn.Linear(in_features=256, out_features=128)
self.enc3 = nn.Linear(in_features=128, out_features=64)
self.enc4 = nn.Linear(in_features=64, out_features=32)
self.enc5 = nn.Linear(in_features=32, out_features=16)
# decoder
self.dec1 = nn.Linear(in_features=16, out_features=32)
self.dec2 = nn.Linear(in_features=32, out_features=64)
self.dec3 = nn.Linear(in_features=64, out_features=128)
self.dec4 = nn.Linear(in_features=128, out_features=256)
self.dec5 = nn.Linear(in_features=256, out_features=784)
def forward(self, x):
x = F.relu(self.enc1(x))
x = F.relu(self.enc2(x))
x = F.relu(self.enc3(x))
x = F.relu(self.enc4(x))
x = F.relu(self.enc5(x))
x = F.relu(self.dec1(x))
x = F.relu(self.dec2(x))
x = F.relu(self.dec3(x))
x = F.relu(self.dec4(x))
x = F.relu(self.dec5(x))
return x
net = Autoencoder()
从Autoencoder
类中,我们可以看到 784 个特征经过一系列变换并转换为 16 个特征。
每一层的变换(in_features
到out_features
(是:
784 to 256
256 to 128
128 to 64
64 to 32
32 to 16
我们为什么要执行这一系列操作?例如,我们为什么不执行以下操作序列?
784 to 256
256 to 128
或者也许
784 to 512
512 to 256
256 to 128
或者可能只是在两层中编码:
784 to 16
在多个图层(而不是单个图层(上缩小尺寸是否允许在最终表示中存储更多细节?例如,如果我们只使用变换 $784 \rightarrow 16$,这是否会导致某些细节不被编码?如果是这样,为什么会这样?
嗯,是的。在多层上减少尺寸使模型能够学习比其他方式更多的信息。你也可以用它做一个实验;将自动编码器更改为更浅,看看它学习了什么表示形式!
无论如何,用更简单的术语来考虑它:假设你有一个回归系统。与 y = a0 + a1.x 等简单的线性变换相反,使用更高次多项式近似任务的回归具有更大的近似能力,因为缺乏更好的项。这就是为什么它们容易过度拟合的原因;他们过于完美地近似训练数据,因此以后很难泛化。但是,根据经验,过度拟合模型可能被认为是比欠拟合模型更可取的方案:因为您可以正则化过拟合模型以更好地泛化,但欠拟合模型可能根本无法近似您的任务。
现在让我们考虑一个深度神经网络。神经网络的核心也是一个高度复杂的函数,可以帮助您估算任务。如果您有一个将 784 个输入要素映射到 16 个输出要素的线性图层,则它基本上是在执行一个简单的变换:ReLU(X.W+B)
.但是,如果您通过多个层,则转换将变为类似ReLU((ReLU((ReLU(X.W1+B1)).W2+B2)).W3+B3)
等等。这是一个更复杂的函数,具有更高的近似功率,这意味着它有可能更好地近似你的任务,并学习更好的表示。这个概念适用于一般的深度学习,尤其适用于卷积层。您会注意到,大多数深度学习模型架构基本上都是层或块一个接一个地重复堆叠。