⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rbfgaussianlayer.java

📁 一个纯java写的神经网络源代码
💻 JAVA
字号:
/* * RbfGaussianLayer.java * * Created on July 21, 2004, 3:15 PM */package org.joone.engine;import java.util.ArrayList;import java.util.Collection;import org.joone.exception.JooneRuntimeException;import org.joone.inspection.implementations.BiasInspection;import org.joone.io.StreamInputSynapse;import org.joone.log.*;import org.joone.util.*;/** * This class implements the nonlinear layer in Radial Basis Function (RBF)  * networks using Gaussian functions. * * @author Boris Jansen */public class RbfGaussianLayer extends RbfLayer {        /** Logger for this class. */    private static final ILogger log = LoggerFactory.getLogger(RbfGaussianLayer.class);        /** The parameters for the different Gaussian RBFs (neurons) */    private RbfGaussianParameters[] theGaussianParameters;        /** Flag indication if we should use randomly chosen fixed centers. */    private boolean theUseRandomSelector = true;        /** The random selector (if theUseRandomSelector equals true). */    private RbfRandomCenterSelector theRandomSelector;        /** Creates a new instance of RbfGaussianLayer */    public RbfGaussianLayer() {    }        protected void backward(double[] pattern) throws org.joone.exception.JooneRuntimeException {        // we don't use back propagation (doesn't make sense for RBF layers), so         // the rule is copy gradientInps to gradientOuts        for(int i = 0; i < gradientInps.length; i++) {            gradientOuts[i] = gradientInps[i];        }    }    protected void forward(double[] pattern) throws org.joone.exception.JooneRuntimeException {        if(theUseRandomSelector && theGaussianParameters == null) {            setGaussianParameters(theRandomSelector.getGaussianParameters());        }                int i = 0;        try {            // for every RBF neuron            for(i = 0; i < getRows(); i++) {                // perform Gaussian function on pattern...                                // Calculate squared Euclidian distance                double mySquaredEuclDist = 0;                double myTemp;                for(int j = 0; j < pattern.length; j++) {                    myTemp = pattern[j] - theGaussianParameters[i].getMean()[j];                    mySquaredEuclDist += (myTemp * myTemp);                }                outs[i] = Math.exp(mySquaredEuclDist /                     (-2 * theGaussianParameters[i].getStdDeviation() * theGaussianParameters[i].getStdDeviation()));                //log.debug("Gaussian: " + outs[i]);            }        } catch (Exception aioobe) {            aioobe.printStackTrace();            String msg;            log.error(msg = "Exception thrown while processing the element " + i + " of the array. Value is : " + pattern[i]                + " Exception thrown is " + aioobe.getClass().getName() + ". Message is " + aioobe.getMessage());            throw new JooneRuntimeException(msg, aioobe);        }    }        protected void setDimensions() {        super.setDimensions();                // we don't use back propagation in RBF layers, but the rule is to        // copy gradientInps to gradientOuts, so here we set the size of         // gradientOuts to gradientInps        gradientOuts = new double[gradientInps.length];    }        /**     * Gets the parameters that define the Gaussian RBFs.     *     * @return the Gaussian RBFs parameters.     */    public RbfGaussianParameters[] getGaussianParameters() {        return theGaussianParameters;    }        /**     * Sets the parameters that define the Gaussian RBFs.     *     * @param aGaussianParameters The new parameters for the RBFs.     */    public void setGaussianParameters(RbfGaussianParameters[] aGaussianParameters) {        if(aGaussianParameters.length != getRows()) {            setRows(aGaussianParameters.length);            log.warn("Setting new RBF Gaussian parameters -> # neurons changed.");        }        theGaussianParameters = aGaussianParameters;    }        /**     * Sets the Gaussian parameters to centers chosen randomly from the input/training data.     *     * @param aStreamInput the synapse providing the input, from where we will select random centers.     */    public void useRandomCenter(StreamInputSynapse aStreamInput) {        theUseRandomSelector = true;        theRandomSelector = new RbfRandomCenterSelector(this);        // find last plugin of aStreamInput and attach the random selector plug in at the end        if(aStreamInput.getPlugIn() == null) {            aStreamInput.setPlugIn(theRandomSelector);        } else {            AbstractConverterPlugIn myPlugin = aStreamInput.getPlugIn();//            while(myPlugin.getNextPlugIn() != null) {//                myPlugin = myPlugin.getNextPlugIn();//            }            myPlugin.addPlugIn(theRandomSelector);        }    }        /**     * It doesn't make sense to return biases for this layer     * @return null     */    public Collection Inspections() {        Collection col = new ArrayList();        col.add(new BiasInspection(null));        return col;    }    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -