/// <summary> /// Creates the configuration of neuron group having the specified spiking activation function. /// </summary> /// <param name="activationCfg">The activation function configuration.</param> /// <param name="predictorsCfg">The predictors provider configuration.</param> /// <param name="excitabilityCfg">The configuration of the homogenous excitability.</param> /// <param name="steadyBias">The constant bias (0 means no bias).</param> private SpikingNeuronGroupSettings CreateSpikingGroup(IActivationSettings activationCfg, PredictorsProviderSettings predictorsCfg, HomogenousExcitabilitySettings excitabilityCfg, double steadyBias = 0d ) { //Bias configuration RandomValueSettings biasCfg = steadyBias == 0 ? null : new RandomValueSettings(steadyBias, steadyBias); //Create neuron group configuration SpikingNeuronGroupSettings groupCfg = new SpikingNeuronGroupSettings(BuildNeuronGroupName(activationCfg), 1d, activationCfg, predictorsCfg, excitabilityCfg, biasCfg ); return(groupCfg); }
//Methods /// <summary> /// Runs the example code. /// </summary> public void Run(InputEncoder.InputSpikesCoding spikesCoding) { //Create StateMachine configuration //Simplified input configuration and homogenous excitability InputEncoderSettings inputCfg; HomogenousExcitabilitySettings homogenousExcitability; switch (spikesCoding) { /* * Horizontal coding. */ case InputEncoder.InputSpikesCoding.Horizontal: inputCfg = StateMachineDesigner.CreateInputCfg(new FeedingPatternedSettings(1, NeuralPreprocessor.BidirProcessing.Continuous, RCNet.Neural.Data.InputPattern.VariablesSchema.Groupped, new UnificationSettings(false, false)), //136 spiking input neurons per input field - coding at once new InputSpikesCoderSettings(InputEncoder.InputSpikesCoding.Horizontal, new A2SCoderSignalStrengthSettings(8), //8 neurons (spike-train length = 1) new A2SCoderUpDirArrowsSettings(8, 8), //64 neurons (spike-train length = 1) new A2SCoderDownDirArrowsSettings(8, 8) //64 neurons (spike-train length = 1) ), true, //Route the input pattern as the predictors to a readout layer new ExternalFieldSettings("coord_abcissa", new RealFeatureFilterSettings(), true), new ExternalFieldSettings("coord_ordinate", new RealFeatureFilterSettings(), true) ); homogenousExcitability = new HomogenousExcitabilitySettings(1d, 0.7d, 0.2d); break; /* * Vertical coding. */ case InputEncoder.InputSpikesCoding.Vertical: inputCfg = StateMachineDesigner.CreateInputCfg(new FeedingPatternedSettings(1, NeuralPreprocessor.BidirProcessing.Continuous, RCNet.Neural.Data.InputPattern.VariablesSchema.Groupped), //17 spiking input neurons per input field- coding in 10 cycles new InputSpikesCoderSettings(InputEncoder.InputSpikesCoding.Vertical, new A2SCoderSignalStrengthSettings(10), //1 neuron (spike-train length = 10) new A2SCoderUpDirArrowsSettings(8, 10), //8 neurons (spike-train length = 10) new A2SCoderDownDirArrowsSettings(8, 10) //8 neurons (spike-train length = 10) ), true, //Route the input pattern as the predictors to a readout layer new ExternalFieldSettings("coord_abcissa", new RealFeatureFilterSettings(), true), new ExternalFieldSettings("coord_ordinate", new RealFeatureFilterSettings(), true) ); homogenousExcitability = new HomogenousExcitabilitySettings(1d, 0.7d, 0.2d); break; /* * Forbidden - no spikes coding. */ default: //1 analog input neuron per input field inputCfg = StateMachineDesigner.CreateInputCfg(new FeedingPatternedSettings(1, NeuralPreprocessor.BidirProcessing.Continuous, RCNet.Neural.Data.InputPattern.VariablesSchema.Groupped, new UnificationSettings(false, false)), new InputSpikesCoderSettings(InputEncoder.InputSpikesCoding.Forbidden), true, //Route the input pattern as the predictors to a readout layer new ExternalFieldSettings("coord_abcissa", new RealFeatureFilterSettings(), true), new ExternalFieldSettings("coord_ordinate", new RealFeatureFilterSettings(), true) ); homogenousExcitability = new HomogenousExcitabilitySettings(0.25, 0.7, 0.2d); break; } //Simplified readout layer configuration ReadoutLayerSettings readoutCfg = StateMachineDesigner.CreateClassificationReadoutCfg(new CrossvalidationSettings(0.0825d, 0, 1), StateMachineDesigner.CreateMultiLayerFFNetCfg(10, new AFAnalogLeakyReLUSettings(), 2, 5, 400), 1, "Hand movement", "curved swing", "horizontal swing", "vertical swing", "anti-clockwise arc", "clockwise arc", "circle", "horizontal straight-line", "vertical straight-line", "horizontal zigzag", "vertical zigzag", "horizontal wavy", "vertical wavy", "face-up curve", "face-down curve", "tremble" ); //Create designer instance StateMachineDesigner smd = new StateMachineDesigner(inputCfg, readoutCfg); //Create pure LSM fashioned StateMachine configuration StateMachineSettings stateMachineCfg = smd.CreatePureLSMCfg(272, //Total size of the reservoir new AFSpikingAdExpIFSettings(), //Activation homogenousExcitability, //Homogenous excitability 1, //Input connection density 0, //Input max delay 0.1d, //Interconnection density 0, //Internal synapses max delay 0, //Steady bias new PredictorsProviderSettings(new PredictorFiringTraceSettings(0.0005, 0)) ); //Display StateMachine xml configuration string xmlConfig = stateMachineCfg.GetXml(true).ToString(); _log.Write("StateMachine configuration xml:"); _log.Write("-------------------------------"); _log.Write(xmlConfig); _log.Write(string.Empty); _log.Write("Press Enter to continue (StateMachine training and verification)..."); _log.Write(string.Empty); Console.ReadLine(); //Instantiation and training _log.Write("StateMachine training:"); _log.Write("----------------------"); _log.Write(string.Empty); //StateMachine instance StateMachine stateMachine = new StateMachine(stateMachineCfg); //StateMachine training TrainStateMachine(stateMachine, "./Data/LibrasMovement_train.csv", out _); _log.Write(string.Empty); //StateMachine verification _log.Write("StateMachine verification:"); _log.Write("--------------------------"); _log.Write(string.Empty); VerifyStateMachine(stateMachine, "./Data/LibrasMovement_verify.csv", null, out _); _log.Write(string.Empty); return; }
/// <summary> /// Creates the simplified configuration of the state machine following the pure LSM design. /// </summary> /// <param name="totalSize">The total number of hidden neurons.</param> /// <param name="spikingActivationCfg">The configuration of the spiking activation function.</param> /// <param name="excitabilityCfg">The homogenous excitability configuration.</param> /// <param name="inputConnectionDensity">The density of the input field connections to hidden neurons.</param> /// <param name="maxInputDelay">The maximum delay of an input synapse.</param> /// <param name="interconnectionDensity">The density of the hidden neurons recurrent interconnection.</param> /// <param name="maxInternalDelay">The maximum delay of an internal synapse.</param> /// <param name="steadyBias">The constant bias (0 means no bias).</param> /// <param name="predictorsProviderCfg">The configuration of the predictors provider.</param> public StateMachineSettings CreatePureLSMCfg(int totalSize, IActivationSettings spikingActivationCfg, HomogenousExcitabilitySettings excitabilityCfg, double inputConnectionDensity, int maxInputDelay, double interconnectionDensity, int maxInternalDelay, double steadyBias, PredictorsProviderSettings predictorsProviderCfg ) { //Check NP is not bypassed if (BypassedNP) { throw new InvalidOperationException("Neural preprocessor is bypassed thus LSM design can't be created."); } //Activation check if (ActivationFactory.CreateAF(spikingActivationCfg, new Random()).TypeOfActivation != ActivationType.Spiking) { throw new ArgumentException("Specified activation must be spiking.", "spikingActivationCfg"); } //One neuron group SpikingNeuronGroupSettings grp = CreateSpikingGroup(spikingActivationCfg, predictorsProviderCfg, excitabilityCfg, steadyBias); //Simple spiking pool PoolSettings poolCfg = new PoolSettings(BuildPoolName(ActivationContent.Spiking, 0), new ProportionsSettings(totalSize, 1, 1), new NeuronGroupsSettings(grp), new InterconnSettings(new RandomSchemaSettings(interconnectionDensity, 0d, false, false)) ); //Simple reservoir structure ReservoirStructureSettings resStructCfg = new ReservoirStructureSettings(BuildResStructName(ActivationContent.Spiking, 0), new PoolsSettings(poolCfg) ); //Input connections configuration List <InputConnSettings> inputConns = new List <InputConnSettings>(InputEncoderCfg.VaryingFieldsCfg.ExternalFieldsCfg.FieldCfgCollection.Count); foreach (ExternalFieldSettings fieldCfg in InputEncoderCfg.VaryingFieldsCfg.ExternalFieldsCfg.FieldCfgCollection) { InputConnSettings inputConnCfg = new InputConnSettings(fieldCfg.Name, poolCfg.Name, inputConnectionDensity, 0 ); inputConns.Add(inputConnCfg); } //Synapse general configuration SpikingSourceSTInputSettings spikingSourceSTInputSettings = new SpikingSourceSTInputSettings(new URandomValueSettings(0, 1), new PlasticitySTInputSettings(new NonlinearDynamicsSTInputSettings())); SpikingSourceSTExcitatorySettings spikingSourceSTExcitatorySettings = new SpikingSourceSTExcitatorySettings(new URandomValueSettings(0, 1), new PlasticitySTExcitatorySettings(new NonlinearDynamicsSTExcitatorySettings())); SpikingSourceSTInhibitorySettings spikingSourceSTInhibitorySettings = new SpikingSourceSTInhibitorySettings(new URandomValueSettings(0, 1), new PlasticitySTInhibitorySettings(new NonlinearDynamicsSTInhibitorySettings())); SynapseSTInputSettings synapseSTInputSettings = new SynapseSTInputSettings(Synapse.SynapticDelayMethod.Random, maxInputDelay, null, spikingSourceSTInputSettings); SynapseSTExcitatorySettings synapseSTExcitatorySettings = new SynapseSTExcitatorySettings(Synapse.SynapticDelayMethod.Random, maxInternalDelay, 4, null, spikingSourceSTExcitatorySettings); SynapseSTInhibitorySettings synapseSTInhibitorySettings = new SynapseSTInhibitorySettings(Synapse.SynapticDelayMethod.Random, maxInternalDelay, 1, null, spikingSourceSTInhibitorySettings); SynapseSTSettings synapseSTCfg = new SynapseSTSettings(synapseSTInputSettings, synapseSTExcitatorySettings, synapseSTInhibitorySettings); SynapseSettings synapseCfg = new SynapseSettings(synapseSTCfg, null); //Create reservoir instance ReservoirInstanceSettings resInstCfg = new ReservoirInstanceSettings(GetResInstName(ResDesign.PureLSM, 0), resStructCfg.Name, new InputConnsSettings(inputConns), synapseCfg ); //Build and return SM configuration return(new StateMachineSettings(new NeuralPreprocessorSettings(InputEncoderCfg, new ReservoirStructuresSettings(resStructCfg), new ReservoirInstancesSettings(resInstCfg) ), ReadoutLayerCfg )); }
/// <summary> /// Creates StateMachine configuration following pure LSM design /// </summary> /// <param name="proportionsCfg">LSM pool proportions</param> /// <param name="aFnCfg">Spiking activation function configuration</param> /// <param name="hes">Homogenous excitability configuration</param> /// <param name="inputConnectionDensity">Density of the input field connections to hidden neurons</param> /// <param name="maxInputDelay">Maximum delay of input synapse</param> /// <param name="interconnectionDensity">Density of the hidden neurons interconnection</param> /// <param name="maxInternalDelay">Maximum delay of internal synapse</param> /// <param name="steadyBias">Constant bias (0 means bias is not required)</param> /// <param name="predictorsParamsCfg">Predictors parameters (use null for defaults)</param> /// <param name="allowedPredictor">Allowed predictor(s)</param> public StateMachineSettings CreatePureLSMCfg(ProportionsSettings proportionsCfg, RCNetBaseSettings aFnCfg, HomogenousExcitabilitySettings hes, double inputConnectionDensity, int maxInputDelay, double interconnectionDensity, int maxInternalDelay, double steadyBias, PredictorsParamsSettings predictorsParamsCfg, params PredictorsProvider.PredictorID[] allowedPredictor ) { //Activation check if (ActivationFactory.Create(aFnCfg, new Random()).TypeOfActivation != ActivationType.Spiking) { throw new ArgumentException("Specified activation must be spiking.", "aFnCfg"); } //One neuron group SpikingNeuronGroupSettings grp = CreateSpikingGroup(aFnCfg, hes, steadyBias); //Simple spiking pool PoolSettings poolCfg = new PoolSettings(GetPoolName(ActivationContent.Spiking, 0), proportionsCfg, new NeuronGroupsSettings(grp), new InterconnSettings(new RandomSchemaSettings(interconnectionDensity, 0d, false, false)) ); //Simple reservoir structure ReservoirStructureSettings resStructCfg = new ReservoirStructureSettings(GetResStructName(ActivationContent.Spiking, 0), new PoolsSettings(poolCfg) ); //Input connections configuration List <InputConnSettings> inputConns = new List <InputConnSettings>(InputCfg.VaryingFieldsCfg.ExternalFieldsCfg.FieldCfgCollection.Count); foreach (ExternalFieldSettings fieldCfg in InputCfg.VaryingFieldsCfg.ExternalFieldsCfg.FieldCfgCollection) { InputConnSettings inputConnCfg = new InputConnSettings(fieldCfg.Name, poolCfg.Name, inputConnectionDensity, 0 ); inputConns.Add(inputConnCfg); } //Synapse general configuration SynapseSTInputSettings synapseSTInputSettings = new SynapseSTInputSettings(Synapse.SynapticDelayMethod.Random, maxInputDelay); SynapseSTExcitatorySettings synapseSTExcitatorySettings = new SynapseSTExcitatorySettings(Synapse.SynapticDelayMethod.Random, maxInternalDelay); SynapseSTInhibitorySettings synapseSTInhibitorySettings = new SynapseSTInhibitorySettings(Synapse.SynapticDelayMethod.Random, maxInternalDelay); SynapseSTSettings synapseSTCfg = new SynapseSTSettings(synapseSTInputSettings, synapseSTExcitatorySettings, synapseSTInhibitorySettings); SynapseSettings synapseCfg = new SynapseSettings(synapseSTCfg, null); //Initially set all switches to false - all available predictors are forbidden bool[] predictorSwitches = new bool[PredictorsProvider.NumOfSupportedPredictors]; predictorSwitches.Populate(false); //Enable specified predictors foreach (PredictorsProvider.PredictorID predictorID in allowedPredictor) { predictorSwitches[(int)predictorID] = true; } //Create predictors configuration using default params PredictorsSettings predictorsCfg = new PredictorsSettings(predictorSwitches, predictorsParamsCfg); //Create reservoir instance ReservoirInstanceSettings resInstCfg = new ReservoirInstanceSettings(GetResInstName(ResDesign.PureLSM, 0), resStructCfg.Name, new InputConnsSettings(inputConns), synapseCfg, predictorsCfg ); //Build and return SM configuration return(new StateMachineSettings(new NeuralPreprocessorSettings(InputCfg, new ReservoirStructuresSettings(resStructCfg), new ReservoirInstancesSettings(resInstCfg) ), ReadoutCfg )); }
/// <summary> /// Creates configuration of group of spiking neurons having specified spiking activation. /// </summary> /// <param name="activationCfg">Activation function configuration</param> /// <param name="heCfg">Configuration of the homogenous excitability</param> /// <param name="steadyBias">Constant bias (0 means bias is not required)</param> private SpikingNeuronGroupSettings CreateSpikingGroup(RCNetBaseSettings activationCfg, HomogenousExcitabilitySettings heCfg, double steadyBias = 0d) { //Bias configuration RandomValueSettings biasCfg = steadyBias == 0 ? null : new RandomValueSettings(steadyBias, steadyBias); //Create neuron group configuration SpikingNeuronGroupSettings groupCfg = new SpikingNeuronGroupSettings(GetNeuronGroupName(activationCfg), 1d, activationCfg, heCfg, biasCfg, null ); return(groupCfg); }