Consider a simple Autoencoder neural net:
from torch import nn class AE(nn.Module): def __init__(self, x_dim, z_dim, h_dim=42): super().__init__() self.encoder = nn.Sequential( nn.Linear(dim_in, dim_h), nn.ReLU(), nn.Linear(dim_h, z_dim) ) self.decoder = nn.Sequential( nn.Linear(z_dim, h_dim), nn.ReLU(), nn.Linear(h_dim, x_dim), ) def forward(self, x): z = self.encoder(x) x = self.decoder(z) return x
In popular literature, it is generally implied that the output of
AE.encoder is solely responsible for encoding whereas
AE.decoder is solely responsible for the decoding.
Why is that?
If we consider that encoding is a more complex task than decoding, there is no actual guarantee that the network won't use the first three layers for encoding and only the last for decoding (or vice versa). This might especially be the case if we consider asymmetrical autoencoder architectures.