Нужна помощь по использованию одного RBM в deeplearning4j

У меня есть куча датчиков, и я просто хочу восстановить ввод.

Итак, что я хочу, это:

  1. после того, как я обучу свою модель, я передам свою матрицу функций
  2. вернуть реконструированную матрицу признаков
  3. Я хочу выяснить, какие значения датчиков полностью отличаются от реконструированного значения.

Поэтому я подумал, что RBM будет правильным выбором, и, поскольку я привык к Java, я попытался использовать deeplearning4j. Но я застрял очень рано. Если вы запустите следующий код, я столкнусь с двумя проблемами.

  1. Результат далек от правильного прогноза, большинство из них просто [1.00,1.00,1.00].

  2. Я ожидаю вернуть 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));
}

person KIC    schedule 30.09.2015    source источник
comment
пожалуйста, присоединяйтесь к нам на Gitter, где сообщество активно. Мы можем вам помочь: gitter.im/deeplearning4j/deeplearning4j   -  person racknuf    schedule 11.10.2015


Ответы (1)


Для б) когда вы вызываете активировать (), вы получаете список массивов «nlayers». Каждый массив в списке является активацией для одного слоя. Сам массив состоит из строк: 1 строка на входной вектор; каждый столбец содержит активацию для каждого нейрона в этом слое и это наблюдение (вход). После того, как все слои были активированы с некоторыми входными данными, вы можете получить реконструкцию с помощью метода RBM.propDown().

Что касается а), боюсь, правильно обучить RBM очень сложно. Таким образом, вы действительно хотите поиграть с каждым параметром и, что более важно, отслеживать во время обучения различные показатели, которые дадут вам подсказку о том, правильно ли вы тренируетесь или нет. Лично мне нравится рисовать:

  • Оценка () в обучающем корпусе, которая представляет собой ошибку реконструкции после каждого обновления градиента; проверить, что он уменьшается.
  • Оценка () в другом корпусе разработки: полезна для предупреждения при возникновении переобучения;
  • Норма вектора параметров: сильно влияет на оценку
  • Обе карты активации (= прямоугольный график XY активированных нейронов одного слоя по всему корпусу), сразу после инициализации и после N шагов: это помогает обнаружить ненадежное обучение (например, когда все черное/белое, когда большая часть всех нейронов никогда не активируются и т. д.)
person xtof54    schedule 05.10.2015