Next we build the stacked autoencoder network:
Auto-Encoders
In[117]:= AutoEncoders = {};
Trainers = {};
TrainedEncoders = {};
In[120]:= hiddenLayerSize = 10;
In[121]:= Do[If[i == 1,
AutoEncoders = {NetChain[{LogisticSigmoid, nvars, LogisticSigmoid,
hiddenLayerSize, LogisticSigmoid, nvars}]},
AppendTo[AutoEncoders,
NetChain[{LogisticSigmoid, hiddenLayerSize, LogisticSigmoid,
hiddenLayerSize/2, LogisticSigmoid, hiddenLayerSize}]]];
AppendTo[Trainers,
NetGraph[{AutoEncoders[[i]],
MeanSquaredLossLayer[]}, {1 -> NetPort[2, "Input"],
NetPort["Input"] -> NetPort[2, "Target"]}]], {i, 4}]
In[122]:= Do[If[i == 1, trainingData = inputData;
trainedAutoencoder =
NetTrain[Trainers[[i]], <|"Input" -> trainingData|>,
TargetDevice -> "GPU" ];
TrainedEncoders = {NetTake[NetExtract[trainedAutoencoder, 1], 5]};,
lastEncoder = TrainedEncoders[[i - 1]];
trainingData = lastEncoder[trainingData];
trainedAutoencoder =
NetTrain[Trainers[[i]], <|"Input" -> trainingData|>,
TargetDevice -> "GPU" ];
AppendTo[TrainedEncoders, NetExtract[trainedAutoencoder, 1]]];,
{i, 4}]