У меня есть куча датчиков, и я просто хочу восстановить ввод.
Итак, что я хочу, это:
- после того, как я обучу свою модель, я передам свою матрицу функций
- вернуть реконструированную матрицу признаков
- Я хочу выяснить, какие значения датчиков полностью отличаются от реконструированного значения.
Поэтому я подумал, что RBM будет правильным выбором, и, поскольку я привык к Java, я попытался использовать deeplearning4j. Но я застрял очень рано. Если вы запустите следующий код, я столкнусь с двумя проблемами.
Результат далек от правильного прогноза, большинство из них просто [1.00,1.00,1.00].
Я ожидаю вернуть 4 значения (это количество входных данных, которые, как ожидается, будут реконструированы)
Итак, что мне нужно настроить, чтобы получить а) лучший результат и б) вернуть реконструированные входные данные?
public static void main(String[] args) {
// Customizing params
Nd4j.MAX_SLICES_TO_PRINT = -1;
Nd4j.MAX_ELEMENTS_PER_SLICE = -1;
Nd4j.ENFORCE_NUMERICAL_STABILITY = true;
final int numRows = 4;
final int numColumns = 1;
int outputNum = 3;
int numSamples = 150;
int batchSize = 150;
int iterations = 100;
int seed = 123;
int listenerFreq = iterations/5;
DataSetIterator iter = new IrisDataSetIterator(batchSize, numSamples);
// Loads data into generator and format consumable for NN
DataSet iris = iter.next();
iris.normalize();
//iris.scale();
System.out.println(iris.getFeatureMatrix());
NeuralNetConfiguration conf = new NeuralNetConfiguration.Builder()
// Gaussian for visible; Rectified for hidden
// Set contrastive divergence to 1
.layer(new RBM.Builder()
.nIn(numRows * numColumns) // Input nodes
.nOut(outputNum) // Output nodes
.activation("tanh") // Activation function type
.weightInit(WeightInit.XAVIER) // Weight initialization
.lossFunction(LossFunctions.LossFunction.XENT)
.updater(Updater.NESTEROVS)
.build())
.seed(seed) // Locks in weight initialization for tuning
.iterations(iterations)
.learningRate(1e-1f) // Backprop step size
.momentum(0.5) // Speed of modifying learning rate
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) // ^^ Calculates gradients
.build();
Layer model = LayerFactories.getFactory(conf.getLayer()).create(conf);
model.setListeners(Arrays.asList((IterationListener) new ScoreIterationListener(listenerFreq)));
model.fit(iris.getFeatureMatrix());
System.out.println(model.activate(iris.getFeatureMatrix(), false));
}