Parametrisierung einer Mannigfaltigkeit
Verwenden Sie für die Parametrisierung einer Mannigfaltigkeit einen Autoencoder, also ein Netz mit einer „Bottleneck“-Schicht, das lernt, den ursprünglichen Input zu rekonstruieren.
Beziehen Sie Trainingsdaten aus einem Teil einer synthetischen zweidimensionalen Mannigfaltigkeit.
![Click for copyable input](assets.de/learn-a-parameterization-of-a-manifold/In_27.png)
manifold =
Table[AngleVector[{x, 0.9 Pi x}] +
x/20*RandomVariate[NormalDistribution[], 2], {x, 0, 1, 0.001}];
plot = ListPlot[manifold, PlotStyle -> Orange]
![](assets.de/learn-a-parameterization-of-a-manifold/O_22.png)
Erzeugen Sie ein Netz mit einer „Bottleneck“-Schicht, um die Parametrisierung einer Mannigfaltigkeit zu erlernen.
![Click for copyable input](assets.de/learn-a-parameterization-of-a-manifold/In_28.png)
net = NetChain[{25, Ramp, 1, 25, Ramp, 2}, "Input" -> 2]
![](assets.de/learn-a-parameterization-of-a-manifold/O_23.png)
Erzeugen Sie ein Verlustnetz, das einen Verlust basierend auf dem „Rekonstruktionsfehler“ berechnet – ein Bewertung der Fähigkeit des Netzes, einen Output zu produzieren, der identisch mit dem Input ist.
![Click for copyable input](assets.de/learn-a-parameterization-of-a-manifold/In_29.png)
lossNet =
NetGraph[{net, MeanSquaredLossLayer[]}, {1 -> 2,
NetPort["Input"] -> NetPort[2, "Target"]}]
![](assets.de/learn-a-parameterization-of-a-manifold/O_24.png)
Trainieren Sie das Verlustnetz mit der Mannigfaltigkeit und extrahieren Sie das Originalnetz aus dem Verlustnetz.
![Click for copyable input](assets.de/learn-a-parameterization-of-a-manifold/In_30.png)
lossNet =
NetTrain[lossNet, <|"Input" -> manifold|>, BatchSize -> 4096];
trained = NetExtract[lossNet, 1];
Visualisieren Sie, wie das Netz beliebige Punkte auf die Mannigfaltigkeit projiziert.
![Click for copyable input](assets.de/learn-a-parameterization-of-a-manifold/In_31.png)
{{xmin, xmax}, {ymin, ymax}} = CoordinateBounds[manifold, .2];
Show[plot,
StreamPlot[
trained[{x, y}] - {x, y}, {x, xmin, xmax}, {y, ymin, ymax}]]
![](assets.de/learn-a-parameterization-of-a-manifold/O_25.png)
Teilen Sie das Netz in ein „Encoder“- und ein „Decoder“-Netz (der Encoder parametrisiert Punkte mit einem einzigen Skalarwert, während der Decoder die Punkte aus dieser Parametrisierung rekonstruiert).
![Click for copyable input](assets.de/learn-a-parameterization-of-a-manifold/In_32.png)
decoder = Drop[trained, 3]
encoder = Take[trained, 3]
![](assets.de/learn-a-parameterization-of-a-manifold/O_26.png)
![](assets.de/learn-a-parameterization-of-a-manifold/O_27.png)
Färben Sie jeden Punkt in der originalen Mannigfaltigkeit nach deren Encoder-Parametrisierung.
![Click for copyable input](assets.de/learn-a-parameterization-of-a-manifold/In_33.png)
ListPlot[Style[#, Hue[First[0.3 + encoder[#]]/3]] & /@ manifold]
![](assets.de/learn-a-parameterization-of-a-manifold/O_28.png)
Ermitteln Sie den Parametrisierungsbereich, indem Sie den Encoder auf die Mannigfaltigkeit anwenden.
![Click for copyable input](assets.de/learn-a-parameterization-of-a-manifold/In_34.png)
{min, max} = MinMax[encoder[manifold]]
![](assets.de/learn-a-parameterization-of-a-manifold/O_29.png)
Zeigen Sie die Rekonstruktion über diesem Bereich gemeinsam mit der originalen Mannigfaltigkeit.
![Click for copyable input](assets.de/learn-a-parameterization-of-a-manifold/In_35.png)
Show[plot, ListLinePlot[Table[decoder[x], {x, min, max, .01}]]]
![](assets.de/learn-a-parameterization-of-a-manifold/O_30.png)