//Constructors /// <summary> /// The deep copy constructor /// </summary> /// <param name="source">Source instance</param> public NeuronGroupSettings(NeuronGroupSettings source) { Name = source.Name; Role = source.Role; RelativeShare = source.RelativeShare; ReadoutNeuronsDensity = source.ReadoutNeuronsDensity; Count = source.Count; ActivationType = source.ActivationType; ActivationCfg = ActivationFactory.DeepCloneActivationSettings(source.ActivationCfg); SignalingRestriction = source.SignalingRestriction; BiasCfg = source.BiasCfg?.DeepClone(); AnalogFiringThreshold = source.AnalogFiringThreshold; RetainmentNeuronsDensity = source.RetainmentNeuronsDensity; RetainmentStrengthCfg = source.RetainmentStrengthCfg?.DeepClone(); PredictorsCfg = source.PredictorsCfg?.DeepClone(); return; }
//Constructor /// <summary> /// Creates an initialized instance /// </summary> /// <param name="placement">Home pool identificator and neuron placement within the pool.</param> /// <param name="role">Neuron's role (Excitatory/Inhibitory).</param> /// <param name="activation">Instantiated activation function.</param> /// <param name="signalingRestriction">Output signaling restriction. Spiking activation causes output signal always restricted to SpikingOnly.</param> /// <param name="predictorsCfg">Enabled/Disabled predictors for the neuron.</param> /// <param name="bias">Constant bias to be applied.</param> /// <param name="analogFiringThreshold">A number between 0 and 1 (LT1). Every time the new activation value is higher than the previous activation value by at least the threshold, it is evaluated as a firing event. Ignored in case of spiking activation.</param> /// <param name="retainmentStrength">Strength of the analog neuron's retainment property. Ignored in case of spiking activation.</param> public HiddenNeuron(NeuronPlacement placement, NeuronCommon.NeuronRole role, IActivationFunction activation, NeuronCommon.NeuronSignalingRestrictionType signalingRestriction, HiddenNeuronPredictorsSettings predictorsCfg, double bias = 0, double analogFiringThreshold = PoolSettings.NeuronGroupSettings.DefaultAnalogFiringThreshold, double retainmentStrength = 0 ) { Placement = placement; Statistics = new NeuronStatistics(); if (role == NeuronCommon.NeuronRole.Input) { throw new ArgumentException("Role of the hidden neuron can not be Input.", "role"); } Role = role; Bias = bias; PredictorsCfg = predictorsCfg; //Activation specific _activation = activation; if (activation.TypeOfActivation == ActivationType.Spiking) { //Spiking SignalingRestriction = NeuronCommon.NeuronSignalingRestrictionType.SpikingOnly; _analogFiringThreshold = 0; _retainmentStrength = 0; } else { //Analog SignalingRestriction = signalingRestriction; _analogFiringThreshold = analogFiringThreshold; _retainmentStrength = retainmentStrength; } _predictors = predictorsCfg != null ? new HiddenNeuronPredictors(predictorsCfg) : null; Reset(false); return; }
/// <summary> /// Creates the instance and initialize it from given xml element. /// </summary> /// <param name="elem"> /// Xml data containing settings. /// Content of xml element is always validated against the appropriate xml schema. /// </param> /// <param name="activationType">Specifies sub-type of the neuron group</param> public NeuronGroupSettings(XElement elem, ActivationType activationType) { //Validation ElemValidator validator = new ElemValidator(); Assembly assemblyRCNet = Assembly.GetExecutingAssembly(); if (activationType == ActivationType.Analog) { validator.AddXsdFromResources(assemblyRCNet, "RCNet.Neural.Network.SM.Preprocessing.PoolAnalogNeuronGroupSettings.xsd"); } else { validator.AddXsdFromResources(assemblyRCNet, "RCNet.Neural.Network.SM.Preprocessing.PoolSpikingNeuronGroupSettings.xsd"); } validator.AddXsdFromResources(assemblyRCNet, "RCNet.RCNetTypes.xsd"); XElement settingsElem = validator.Validate(elem, "rootElem"); ActivationType = activationType; //Parsing //Name Name = settingsElem.Attribute("name").Value; //Role Role = NeuronCommon.ParseNeuronRole(settingsElem.Attribute("role").Value); //Relative share RelativeShare = double.Parse(settingsElem.Attribute("relShare").Value, CultureInfo.InvariantCulture); //Readout neurons density ReadoutNeuronsDensity = double.Parse(settingsElem.Attribute("readoutDensity").Value, CultureInfo.InvariantCulture); //Activation settings ActivationCfg = ActivationFactory.LoadSettings(settingsElem.Descendants().First()); //Bias XElement cfgElem = settingsElem.Descendants("bias").FirstOrDefault(); BiasCfg = cfgElem == null ? null : new RandomValueSettings(cfgElem); //Spiking sub-type if (activationType == ActivationType.Spiking) { SignalingRestriction = NeuronCommon.NeuronSignalingRestrictionType.SpikingOnly; AnalogFiringThreshold = 0; RetainmentNeuronsDensity = 0; RetainmentStrengthCfg = null; } else { //Analog sub-type //Output signaling restriction SignalingRestriction = NeuronCommon.ParseNeuronSignalingRestriction(settingsElem.Attribute("signalingRestriction").Value); //Analog firing threshold cfgElem = settingsElem.Descendants("firingThreshold").FirstOrDefault(); AnalogFiringThreshold = cfgElem == null ? DefaultAnalogFiringThreshold : double.Parse(cfgElem.Attribute("value").Value, CultureInfo.InvariantCulture); //Retainment cfgElem = settingsElem.Descendants("retainment").FirstOrDefault(); RetainmentNeuronsDensity = 0; RetainmentStrengthCfg = null; if (cfgElem != null) { RetainmentNeuronsDensity = double.Parse(cfgElem.Attribute("density").Value, CultureInfo.InvariantCulture); RetainmentStrengthCfg = new RandomValueSettings(cfgElem.Descendants("strength").First()); if (RetainmentNeuronsDensity == 0 || (RetainmentStrengthCfg.Min == 0 && RetainmentStrengthCfg.Max == 0)) { RetainmentNeuronsDensity = 0; RetainmentStrengthCfg = null; } } } //Predictors XElement predictorsElem = settingsElem.Descendants("predictors").FirstOrDefault(); if (predictorsElem != null) { PredictorsCfg = new HiddenNeuronPredictorsSettings(predictorsElem); } return; }