Моя цель состоит в том, чтобы иметь сеть автокодирования, в которой я могу обучать функцию идентификации, а затем выполнять прямые проходы, получая реконструкцию ввода.
Для этого я пытаюсь использовать VariationalAutoencoder
, например. что-то типа:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(77147718)
.trainingWorkspaceMode(WorkspaceMode.NONE)
.gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue)
.gradientNormalizationThreshold(1.0)
.optimizationAlgo(OptimizationAlgorithm.CONJUGATE_GRADIENT)
.list()
.layer(0, new VariationalAutoencoder.Builder()
.activation(Activation.LEAKYRELU)
.nIn(100).nOut(15)
.encoderLayerSizes(120, 60, 30)
.decoderLayerSizes(30, 60, 120)
.pzxActivationFunction(Activation.IDENTITY)
.reconstructionDistribution(new BernoulliReconstructionDistribution(Activation.SIGMOID.getActivationFunction()))
.build())
.pretrain(true).backprop(false)
.build();
Однако VariationalAutoencoder
, по-видимому, предназначен для обучения (и обеспечения) сопоставления входных данных с закодированной версией, то есть вектора размера 100 в вектор размера 15 в конфигурации, приведенной выше.
Однако меня не особенно интересует закодированная версия, но я хотел бы обучить сопоставление 100-вектора самому себе. Затем я хотел бы запустить через него еще 100 векторов и вернуть их реконструированные версии.
Но даже глядя на API VariationalAutoencoder
(или AutoEncoder
тоже), я не могу понять, как это сделать. Или эти слои не предназначены для такого рода «сквозного использования», и мне пришлось бы вручную создавать сеть автокодирования?