/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.neuroph.contrib.bpbench;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * Class used for generating specific training settings using specter of values
 * for different parameters
 *
 * @author Mladen Savic 
 */
public class TrainingSettingsGenerator {

    /**
     * Minimum learning rate for generator
     */
    private double minLearningRate;
    /**
     * Maximum learning rate for generator
     */
    private double maxLearningRate;
    /**
     * Learning rate step for generator
     */
    private double learningRateStep;
    /**
     * Minimum number of neurons in hidden layer
     */
    private int minHiddenNeurons;
    /**
     * Maximum number of neurons in hidden layer
     */
    private int maxHiddenNeurons;
    /**
     * Step of increment of neurons in hidden layer
     */
    private int hiddenNeuronsStep;
    /**
     * Momentum for generator
     */
    private double momentum;
    /**
     * Maximum total error for generator
     */
    private double maxError;
    /**
     * Maximum number of iterations for generator
     */
    private int maxIterations;
    /**
     * Batch mode for generator
     */
    private boolean batchMode;
    /**
     * Decrease factor
     */
    private double decreaseFactor;
    /**
     * Increase factor
     */
    private double increaseFactor;
    /**
     * Initial delta
     */
    private double initialDelta;
    /**
     * Maximum delta
     */
    private double maxDelta;
    /**
     * Minimum delta
     */
    private double minDelta;
    /**
     * Settings for generator
     */
    private Properties settings;

    /**
     * Create instance of generator with new settings
     */
    public TrainingSettingsGenerator() {
        settings = new Properties();
    }

    /**
     * Create instance of generator with given parameters
     *
     * @param minLearningRate
     * @param maxLearningRate
     * @param learningRateStep
     * @param minHiddenNeurons
     * @param maxHiddenNeurons
     * @param hiddenNeuronsStep
     * @param momentum
     * @param maxError
     * @param maxIterations
     * @param batchMode
     */
    public TrainingSettingsGenerator(double minLearningRate, double maxLearningRate, double learningRateStep, int minHiddenNeurons, int maxHiddenNeurons, int hiddenNeuronsStep, double momentum, double maxError, int maxIterations, boolean batchMode) {
        if (minLearningRate > 0) {
            this.minLearningRate = minLearningRate;
        } else {
            this.minLearningRate = 0.1;
        }
        if (maxLearningRate > 0 && maxLearningRate > minLearningRate) {
            this.maxLearningRate = maxLearningRate;
        } else {
            this.maxLearningRate = 1;
        }
        if (learningRateStep > 0 && learningRateStep < 1) {
            this.learningRateStep = learningRateStep;
        } else {
            this.learningRateStep = 0.1;
        }
        if (minHiddenNeurons > 0) {
            this.minHiddenNeurons = minHiddenNeurons;
        } else {
            this.minHiddenNeurons = 1;
        }
        if (maxHiddenNeurons > 0 && maxHiddenNeurons > minHiddenNeurons) {
            this.maxHiddenNeurons = maxHiddenNeurons;
        } else {
            this.maxHiddenNeurons = 10;
        }
        if (hiddenNeuronsStep > 0) {
            this.hiddenNeuronsStep = hiddenNeuronsStep;
        } else {
            this.hiddenNeuronsStep = 1;
        }

        this.momentum = momentum;
        this.maxError = maxError;
        this.maxIterations = maxIterations;
        this.batchMode = batchMode;
    }

    /**
     * Method used for generating list of settings for training
     *
     * @return list of settings
     */
    public List generateSettings() {
        List list = new ArrayList<>();
        double learningRateStart = minLearningRate;
        int hiddenNeuronStart = minHiddenNeurons;
        for (double i = learningRateStart; i < maxLearningRate; i += learningRateStep) {
            for (int j = hiddenNeuronStart; j < maxHiddenNeurons; j += hiddenNeuronsStep) {
                list.add(new TrainingSettings(i, this.momentum, j, this.maxIterations, this.maxError, this.batchMode));
            }
        }

        return list;
    }

    /**
     * Return settings for generator
     *
     * @return
     */
    public Properties getSettings() {
        return settings;
    }

    /**
     * Set settings for generator
     *
     * @param settings
     */
    public void setSettings(Properties settings) {
        this.settings = settings;
        setUpGenerator();
    }

    /**
     * Set up generator using given settings or set default value
     */
    private void setUpGenerator() {
        this.batchMode = Boolean.parseBoolean(settings.getProperty(BackpropagationSettings.BATCH_MODE, "false"));
        this.hiddenNeuronsStep = Integer.parseInt(settings.getProperty(BackpropagationSettings.HIDDEN_NEURONS_STEP, "1"));
        this.learningRateStep = Double.parseDouble(settings.getProperty(BackpropagationSettings.LEARNING_RATE_STEP, "0.1"));
        this.maxError = Double.parseDouble(settings.getProperty(BackpropagationSettings.MAX_ERROR, "0.03"));
        this.maxHiddenNeurons = Integer.parseInt(settings.getProperty(BackpropagationSettings.MAX_HIDDEN_NEURONS, "1"));
        this.maxIterations = Integer.parseInt(settings.getProperty(BackpropagationSettings.MAX_ITERATIONS, "10000"));
        this.maxLearningRate = Double.parseDouble(settings.getProperty(BackpropagationSettings.MAX_LEARNING_RATE, "1"));
        this.minHiddenNeurons = Integer.parseInt(settings.getProperty(BackpropagationSettings.MIN_HIDDEN_NEURONS, "0"));
        this.minLearningRate = Double.parseDouble(settings.getProperty(BackpropagationSettings.MIN_LEARNING_RATE, "0.001"));
        this.momentum = Double.parseDouble(settings.getProperty(BackpropagationSettings.MOMENTUM, "0.3"));
        this.decreaseFactor = Double.parseDouble(settings.getProperty(BackpropagationSettings.DECREASE_FACTOR, "0.5"));
        this.increaseFactor = Double.parseDouble(settings.getProperty(BackpropagationSettings.INCREASE_FACTOR, "1.2"));
        this.initialDelta = Double.parseDouble(settings.getProperty(BackpropagationSettings.INITIAL_DELTA, "0.1"));
        this.maxDelta = Double.parseDouble(settings.getProperty(BackpropagationSettings.MAX_DELTA, "1.0"));
        this.minDelta = Double.parseDouble(settings.getProperty(BackpropagationSettings.MIN_DELTA, "1e-6"));
    }

}

 

Ads help maintain this website.