Aprenda una parametrización de una variedad
Aprenda una parametrización de una variedad junto con los datos de entradas correspondientes usando un autoencoder, una red con una capa de "cuello de botella" que reconstruya la entrada original.
Muestree datos de entrenamiento desde una parte de una variedad sintética de dos dimensiones.
manifold =
Table[AngleVector[{x, 0.9 Pi x}] +
x/20*RandomVariate[NormalDistribution[], 2], {x, 0, 1, 0.001}];
plot = ListPlot[manifold, PlotStyle -> Orange]
Cree una red con una capa de "cuello de botella" con el fin de aprender una parametrización de una variedad.
net = NetChain[{25, Ramp, 1, 25, Ramp, 2}, "Input" -> 2]
Cree una red de pérdida que calcule una pérdida basada en el "error de reconstrucción", una medida del grado en que la red puede producir una salida que es idéntica a su entrada.
lossNet =
NetGraph[{net, MeanSquaredLossLayer[]}, {1 -> 2,
NetPort["Input"] -> NetPort[2, "Target"]}]
Entrene la red de pérdida en la variedad y extraiga la red original a partir de la red de pérdida.
lossNet =
NetTrain[lossNet, <|"Input" -> manifold|>, BatchSize -> 4096];
trained = NetExtract[lossNet, 1];
Visualice cómo la red proyecta puntos arbitrarios en la variedad.
{{xmin, xmax}, {ymin, ymax}} = CoordinateBounds[manifold, .2];
Show[plot,
StreamPlot[
trained[{x, y}] - {x, y}, {x, xmin, xmax}, {y, ymin, ymax}]]
Divida la red en "codificador" y "decodificador" (el codificador parametriza los puntos usando un único valor de escala, mientras que el decodificador reconstruye el punto a partir de su parametrización).
decoder = Drop[trained, 3]
encoder = Take[trained, 3]
Coloree cada punto en la variedad original por su parametrización bajo el codificador.
ListPlot[Style[#, Hue[First[0.3 + encoder[#]]/3]] & /@ manifold]
Obtenga el rango de la parametrización aplicando el codificador a la variedad.
{min, max} = MinMax[encoder[manifold]]
Muestre la reconstrucción sobre este rango junto con la variedad original.
Show[plot, ListLinePlot[Table[decoder[x], {x, min, max, .01}]]]