/// <summary> /// Creates the instance and initialize it from given xml element. /// This is the preferred way to instantiate settings. /// </summary> /// <param name="elem"> /// Xml data containing settings. /// Content of xml element is always validated against the xml schema. /// </param> public FeedForwardNetworkSettings(XElement elem) { //Validation ElemValidator validator = new ElemValidator(); Assembly assemblyRCNet = Assembly.GetExecutingAssembly(); validator.AddXsdFromResources(assemblyRCNet, "RCNet.Neural.Network.FF.FeedForwardNetworkSettings.xsd"); validator.AddXsdFromResources(assemblyRCNet, "RCNet.RCNetTypes.xsd"); XElement settingsElem = validator.Validate(elem, "rootElem"); //Parsing OutputLayerActivation = ActivationFactory.LoadSettings(settingsElem.Descendants().First()); if (!IsAllowedActivation(OutputLayerActivation, out Interval outputRange)) { throw new ApplicationException($"Activation can't be used in FF network. Activation function has to be stateless and has to support derivative calculation."); } OutputRange = outputRange; //Hidden layers HiddenLayerCollection = new List <HiddenLayerSettings>(); XElement hiddenLayersElem = settingsElem.Descendants("hiddenLayers").FirstOrDefault(); if (hiddenLayersElem != null) { foreach (XElement layerElem in hiddenLayersElem.Descendants("layer")) { HiddenLayerCollection.Add(new HiddenLayerSettings(layerElem)); } } //Trainer configuration TrainerCfg = null; foreach (XElement candidate in settingsElem.Descendants()) { if (candidate.Name.LocalName == "linRegrTrainer") { TrainerCfg = new LinRegrTrainerSettings(candidate); } else if (candidate.Name.LocalName == "qrdRegrTrainer") { TrainerCfg = new QRDRegrTrainerSettings(candidate); } else if (candidate.Name.LocalName == "ridgeRegrTrainer") { TrainerCfg = new RidgeRegrTrainerSettings(candidate); } else if (candidate.Name.LocalName == "resPropTrainer") { TrainerCfg = new RPropTrainerSettings(candidate); } if (TrainerCfg != null) { break; } } if (TrainerCfg == null) { throw new Exception("Trainer settings not found."); } return; }
//Constructors /// <summary> /// Creates an uninitialized instance /// </summary> public FeedForwardNetworkSettings() { OutputLayerActivation = null; OutputRange = null; HiddenLayerCollection = new List <HiddenLayerSettings>(); TrainerCfg = null; return; }
/// <summary> /// The deep copy constructor /// </summary> /// <param name="source">Source instance</param> public FeedForwardNetworkSettings(FeedForwardNetworkSettings source) { OutputLayerActivation = null; OutputRange = null; if (source.OutputLayerActivation != null) { OutputLayerActivation = ActivationFactory.DeepCloneActivationSettings(source.OutputLayerActivation); OutputRange = source.OutputRange.DeepClone(); } HiddenLayerCollection = new List <HiddenLayerSettings>(source.HiddenLayerCollection.Count); foreach (HiddenLayerSettings shls in source.HiddenLayerCollection) { HiddenLayerCollection.Add(shls.DeepClone()); } TrainerCfg = null; if (source.TrainerCfg != null) { TrainerCfg = source.TrainerCfg.DeepClone(); } return; }