Example usage for org.deeplearning4j.nn.conf.inputs InputType feedForward

List of usage examples for org.deeplearning4j.nn.conf.inputs InputType feedForward

Introduction

In this page you can find the example usage for org.deeplearning4j.nn.conf.inputs InputType feedForward.

Prototype

public static InputType feedForward(long size) 

Source Link

Document

InputType for feed forward network data

Usage

From source file:org.knime.ext.dl4j.base.mln.MultiLayerNetFactory2.java

License:Open Source License

/**
 * Creates a {@link org.deeplearning4j.nn.conf.NeuralNetConfiguration.ListBuilder} using specified list of layers
 * and parameter./*from  www . j  a  v a 2  s  .c  o  m*/
 *
 * @param layers the layers which should be used to create the network
 * @param lp
 * @return builder with set layers and parameters
 */
protected NeuralNetConfiguration.ListBuilder createListBuilderWithLearnerParameters(final List<Layer> layers,
        final LearnerParameterSettingsModels2 lp) {

    //boolean
    boolean m_useGlobalDropOut = lp.getBoolean(LearnerParameter.USE_GLOBAL_DROP_OUT,
            LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useGlobalWeightInit = lp.getBoolean(LearnerParameter.USE_GLOBAL_WEIGHT_INIT,
            LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useGlobalLearningRate = lp.getBoolean(LearnerParameter.USE_GLOBAL_LEARNING_RATE,
            LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useDropConnect = lp.getBoolean(LearnerParameter.USE_DROP_CONNECT,
            LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useBackprop = lp.getBoolean(LearnerParameter.USE_BACKPROP, LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useSeed = lp.getBoolean(LearnerParameter.USE_SEED, LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useGradientNormalization = lp.getBoolean(LearnerParameter.USE_GRADIENT_NORMALIZATION,
            LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useRegularization = lp.getBoolean(LearnerParameter.USE_REGULARIZATION,
            LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useBiasInit = lp.getBoolean(LearnerParameter.USE_BIAS_INIT, LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useBiasLearningRate = lp.getBoolean(LearnerParameter.USE_BIAS_LEARNING_RATE,
            LearnerParameter.DEFAULT_BOOLEAN);
    boolean m_useUpdater = lp.getBoolean(LearnerParameter.USE_UPDATER, LearnerParameter.DEFAULT_USE_UPDATER);
    boolean m_usePretrain = lp.getBoolean(LearnerParameter.USE_PRETRAIN, LearnerParameter.DEFAULT_BOOLEAN);

    //double
    double m_dropOut = lp.getDouble(LearnerParameter.GLOBAL_DROP_OUT, LearnerParameter.DEFAULT_DOUBLE);
    double m_distributionBinomialProbability = lp.getDouble(LearnerParameter.DISTRIBUTION_BINOMIAL_PROBABILITY,
            LearnerParameter.DEFAULT_DOUBLE);
    double m_distributionMean = lp.getDouble(LearnerParameter.DISTRIBUTION_MEAN,
            LearnerParameter.DEFAULT_DOUBLE);
    double m_distributionSTD = lp.getDouble(LearnerParameter.DISTRIBUTION_STD, LearnerParameter.DEFAULT_DOUBLE);
    double m_distributionLowerBound = lp.getDouble(LearnerParameter.DISTRIBUTION_LOWER_BOUND,
            LearnerParameter.DEFAULT_DOUBLE);
    double m_distributionUpperBound = lp.getDouble(LearnerParameter.DISTRIBUTION_UPPER_BOUND,
            LearnerParameter.DEFAULT_DOUBLE);
    double m_learningRate = lp.getDouble(LearnerParameter.GLOBAL_LEARNING_RATE,
            LearnerParameter.DEFAULT_LEARNING_RATE);
    double m_gradientNormalizationThreshold = lp.getDouble(LearnerParameter.GRADIENT_NORMALIZATION_THRESHOLD,
            LearnerParameter.DEFAULT_GRADIENT_NORMALIZATION_THRESHOLD);
    double m_l1 = lp.getDouble(LearnerParameter.L1, LearnerParameter.DEFAULT_DOUBLE);
    double m_l2 = lp.getDouble(LearnerParameter.L2, LearnerParameter.DEFAULT_DOUBLE);
    double m_biasInit = lp.getDouble(LearnerParameter.BIAS_INIT, LearnerParameter.DEFAULT_DOUBLE);
    double m_biasLearningRate = lp.getDouble(LearnerParameter.BIAS_LEARNING_RATE,
            LearnerParameter.DEFAULT_DOUBLE);
    double m_adamMeanDecay = lp.getDouble(LearnerParameter.ADAM_MEAN_DECAY,
            LearnerParameter.DEFAULT_ADAM_MEAN_DECAY);
    double m_adamVarDecay = lp.getDouble(LearnerParameter.ADAM_VAR_DECAY,
            LearnerParameter.DEFAULT_ADAM_VAR_DECAY);
    double m_adadeltaRho = lp.getDouble(LearnerParameter.ADADELTA_RHO, LearnerParameter.DEFAULT_ADADELTA_RHO);
    double m_rmsDecay = lp.getDouble(LearnerParameter.RMS_DECAY, LearnerParameter.DEFAULT_RMS_DECAY);
    double m_momentum = lp.getDouble(LearnerParameter.MOMENTUM, LearnerParameter.DEFAULT_MOMENTUM);

    //int
    Integer m_distributionBinomialTrails = lp.getInteger(LearnerParameter.DISTRIBUTION_BINOMIAL_TRAILS,
            LearnerParameter.DEFAULT_INT);
    Integer m_seed = lp.getInteger(LearnerParameter.SEED, LearnerParameter.DEFAULT_INT);
    Integer m_iterations = lp.getInteger(LearnerParameter.TRAINING_ITERATIONS, LearnerParameter.DEFAULT_INT);
    Integer m_maxNumLineSearchIterations = lp.getInteger(LearnerParameter.MAX_NUMBER_LINE_SEARCH_ITERATIONS,
            LearnerParameter.DEFAULT_INT);

    //string
    WeightInit m_weightInit = WeightInit
            .valueOf(lp.getString(LearnerParameter.GLOBAL_WEIGHT_INIT, LearnerParameter.DEFAULT_WEIGHT_INIT));
    DL4JDistribution m_distribution = DL4JDistribution
            .valueOf(lp.getString(LearnerParameter.DISTRIBUTION, LearnerParameter.DEFAULT_DISTRIBUTION));
    GradientNormalization m_gradientNormalization = DL4JGradientNormalization
            .fromToString(lp.getString(LearnerParameter.GRADIENT_NORMALIZATION,
                    LearnerParameter.DEFAULT_GRADIENT_NORMALIZATION))
            .getDL4JValue();
    Updater m_updater = Updater
            .valueOf(lp.getString(LearnerParameter.UPDATER, LearnerParameter.DEFAULT_UPDATER));
    Map<Integer, Double> m_momentumAfter = ParameterUtils
            .convertStringToMap(lp.getString(LearnerParameter.MOMENTUM_AFTER, LearnerParameter.DEFAULT_MAP));
    OptimizationAlgorithm m_optimization = DL4JOptimizationAlgorithm.fromToString(
            lp.getString(LearnerParameter.OPTIMIZATION_ALGORITHM, LearnerParameter.DEFAULT_OPTIMIZATION))
            .getDL4JValue();

    final NeuralNetConfiguration.Builder nnConfigBuilder = new NeuralNetConfiguration.Builder();

    /*
     * Since 0.9.1: Use DL4J workspaces which makes training faster and we can reduce the number of GC calls of DL4J.
     * For now use WorkspaceMode.SEPARATE for both training and inference.
     */
    nnConfigBuilder.inferenceWorkspaceMode(WorkspaceMode.SEPARATE);
    nnConfigBuilder.trainingWorkspaceMode(WorkspaceMode.SEPARATE);

    /*
     * Need to overwrite global parameters for each layer separately as setting the parameter
     * in the NeuralNetConfiguration does not overwrite it when it was already set in the
     * specific layer. Hence, need to clone layers to not alter original layers.
     */
    final List<Layer> layersCopy = DLModelPortObjectUtils.cloneLayers(layers);
    if (m_useGlobalDropOut) {
        overwriteDropOut(layersCopy, m_dropOut);
        nnConfigBuilder.dropOut(m_dropOut);
    }
    if (m_useGlobalWeightInit) {
        overwriteWeightInit(layersCopy, m_weightInit);
        nnConfigBuilder.weightInit(m_weightInit);

        if (m_weightInit.equals(ParameterUtils.DISTRIBUTION_PARAMETER_CONDITION)) {
            Distribution dist;
            switch (m_distribution) {
            case BINOMIAL:
                dist = new BinomialDistribution(m_distributionBinomialTrails,
                        m_distributionBinomialProbability);
                break;
            case NORMAL:
                dist = new NormalDistribution(m_distributionMean, m_distributionSTD);
                break;
            case UNIFORM:
                dist = new UniformDistribution(m_distributionLowerBound, m_distributionUpperBound);
                break;
            default:
                throw new IllegalArgumentException("No case defined for DL4JDistribution: " + m_distribution);
            }
            nnConfigBuilder.dist(dist);
        }
    }
    if (m_useGlobalLearningRate) {
        overwriteLearningRate(layersCopy, m_learningRate);
    }

    //setup number of input and output neurons
    //ConfigurationUtils.setupLayers(layersCopy, m_nIn);
    //substituted with 'setInputType(InputType.feedForward(m_nIn)'

    if (m_useSeed) {
        nnConfigBuilder.seed(m_seed);
    }
    if (m_useGradientNormalization) {
        nnConfigBuilder.gradientNormalization(m_gradientNormalization);
        nnConfigBuilder.gradientNormalizationThreshold(m_gradientNormalizationThreshold);
    }
    if (m_useRegularization) {
        nnConfigBuilder.regularization(true);
        nnConfigBuilder.l1(m_l1);
        nnConfigBuilder.l2(m_l2);
    }

    // momentum moved to updaters, will only be used with NESTEROVS
    // if (m_useMomentum) {
    // nnConfigBuilder.momentum(m_momentum);
    // nnConfigBuilder.momentumAfter(m_momentumAfter);
    // }

    if (m_useDropConnect) {
        nnConfigBuilder.useDropConnect(true);
    }

    // the learning rate policy behaves strange, need to revise conditions if we want to add it
    //        if (m_useAdvancedLearningRate) {
    //            nnConfigBuilder.learningRateDecayPolicy(m_lrPolicy);
    //            nnConfigBuilder.lrPolicyDecayRate(m_lrPolicyDecayRate);
    //            if (m_lrPolicy.equals(ParameterUtils.LR_POWER_PARAMETER_CONDITION)) {
    //                nnConfigBuilder.lrPolicyPower(m_lrPolicyPower);
    //            } else if (m_lrPolicy.equals(ParameterUtils.LR_SCHEDULE_PARAMETER_CONDITION)) {
    //                nnConfigBuilder.learningRateSchedule(m_learningRateAfter);
    //            } else if (m_lrPolicy.equals(ParameterUtils.LR_SCORE_BASED_PARAMETER_CONDITION)) {
    //                nnConfigBuilder.learningRateScoreBasedDecayRate(m_lrPolicyScoreDecayRate);
    //            } else if (m_lrPolicy.equals(ParameterUtils.LR_STEPS_PARAMETER_CONDITION)) {
    //                nnConfigBuilder.lrPolicySteps(m_lrPolicySteps);
    //            } else if (m_lrPolicy.equals(ParameterUtils.LR_EXPONENTIAL_PARAMETER_CONDITION)) {
    //                //no extra param
    //            }
    //        }

    if (m_useBiasInit) {
        nnConfigBuilder.biasInit(m_biasInit);
    }
    if (m_useBiasLearningRate) {
        overwriteBiasLearningRate(layersCopy, m_biasLearningRate);
    }

    nnConfigBuilder.iterations(m_iterations);
    nnConfigBuilder.updater(m_updater);
    if (m_updater.equals(ParameterUtils.ADAM_PARAMETER_CONDITION)) {
        nnConfigBuilder.adamMeanDecay(m_adamMeanDecay);
        nnConfigBuilder.adamVarDecay(m_adamVarDecay);
    } else if (m_updater.equals(ParameterUtils.ADADELTA_PARAMETER_CONDITION)) {
        nnConfigBuilder.rho(m_adadeltaRho);
    } else if (m_updater.equals(ParameterUtils.RMSPROP_PARAMETER_CONDITION)) {
        nnConfigBuilder.rmsDecay(m_rmsDecay);
    } else if (m_updater.equals(ParameterUtils.NESTEROVS_PARAMETER_CONDITION)) {
        nnConfigBuilder.momentum(m_momentum);
        nnConfigBuilder.momentumAfter(m_momentumAfter);
    }
    //The new dialogs have a use updater checkbox which is not present in the old dialogs and is true by default. Therefore,
    //we overwrite the updater with the default values, if the checkbox is not checked. For the old dialog this will not happen
    //as the value is true by default.
    if (!m_useUpdater) {
        nnConfigBuilder.updater(Updater.valueOf(LearnerParameter.DEFAULT_UPDATER));
        nnConfigBuilder.momentum(LearnerParameter.DEFAULT_MOMENTUM);
    }

    nnConfigBuilder.optimizationAlgo(m_optimization);
    if (ParameterUtils.MAX_LINE_SEARCH_ITERATIONS_CONDITION.contains(m_optimization)) {
        nnConfigBuilder.maxNumLineSearchIterations(m_maxNumLineSearchIterations);
    }

    //very strange dl4j behaviour, for unsupervised layers (RBM, Autoencoder) we need
    //to modify the step function elswise learning does not work (error does not decrease)
    //nnConfigBuilder.stepFunction(new DefaultStepFunction());

    final NeuralNetConfiguration.ListBuilder listBuilder = nnConfigBuilder.list();

    int currentLayerIndex = 0;
    for (final Layer layer : layersCopy) {
        listBuilder.layer(currentLayerIndex, layer);
        currentLayerIndex++;
    }
    listBuilder.pretrain(m_usePretrain);
    listBuilder.backprop(m_useBackprop);

    //infer correct number of inputs and outputs for each layer by using the number of inputs of the first layer
    //and the number of outputs for the following ones
    listBuilder.setInputType(InputType.feedForward(m_nIn));

    return listBuilder;
}