/** * Construct a network analyze class. Analyze the specified network. * * @param network The network to analyze. */ public AnalyzeNetwork(final BasicNetwork network) { final int assignDisabled = 0; final int assignedTotal = 0; final List<Double> biasList = new ArrayList<Double>(); final List<Double> weightList = new ArrayList<Double>(); final List<Double> allList = new ArrayList<Double>(); for (int layerNumber = 0; layerNumber < network.getLayerCount() - 1; layerNumber++) { final int fromCount = network.getLayerNeuronCount(layerNumber); final int fromBiasCount = network.getLayerTotalNeuronCount(layerNumber); final int toCount = network.getLayerNeuronCount(layerNumber + 1); // weights for (int fromNeuron = 0; fromNeuron < fromCount; fromNeuron++) { for (int toNeuron = 0; toNeuron < toCount; toNeuron++) { final double v = network.getWeight(layerNumber, fromNeuron, toNeuron); weightList.add(v); allList.add(v); } } // bias if (fromCount != fromBiasCount) { final int biasNeuron = fromCount; for (int toNeuron = 0; toNeuron < toCount; toNeuron++) { final double v = network.getWeight(layerNumber, biasNeuron, toNeuron); biasList.add(v); allList.add(v); } } } for (final Layer layer : network.getStructure().getLayers()) { if (layer.hasBias()) { for (int i = 0; i < layer.getNeuronCount(); i++) {} } } this.disabledConnections = assignDisabled; this.totalConnections = assignedTotal; this.weights = new NumericRange(weightList); this.bias = new NumericRange(biasList); this.weightsAndBias = new NumericRange(allList); this.weightValues = EngineArray.listToDouble(weightList); this.allValues = EngineArray.listToDouble(allList); this.biasValues = EngineArray.listToDouble(biasList); }
private void randomizeSynapse(BasicNetwork network, int fromLayer) { int toLayer = fromLayer + 1; int toCount = network.getLayerNeuronCount(toLayer); int fromCount = network.getLayerNeuronCount(fromLayer); int fromCountTotalCount = network.getLayerTotalNeuronCount(fromLayer); ActivationFunction af = network.getActivation(toLayer); double low = calculateRange(af, Double.MIN_VALUE); double high = calculateRange(af, Double.MAX_VALUE); double b = 0.7d * Math.pow(toCount, (1d / fromCount)) / (high - low); for (int toNeuron = 0; toNeuron < toCount; toNeuron++) { if (fromCount != fromCountTotalCount) { double w = nextDouble(-b, b); network.setWeight(fromLayer, fromCount, toNeuron, w); } for (int fromNeuron = 0; fromNeuron < fromCount; fromNeuron++) { double w = nextDouble(0, b); network.setWeight(fromLayer, fromNeuron, toNeuron, w); } } }