public override void Connect(Link[] prior,NeuronBase[] next,Bias bias) { Utility.Verify(prior,x => x!=null && prior.Length>0,"Invalid prior layer"); Utility.Verify(next,x => x!=null && next.Length>0,"Invalid next layer"); Utility.Verify(() => next.Length % FeatureMapsCount==0,"FeatureMapsCount - next layer size conflict"); Utility.Verify(() => prior.Length % FeatureMapsCount==0,"FeatureMapsCount - prior layer size conflict"); Link[][] c=GetFeatureMaps(prior,FeatureMapsCount); NeuronBase[][] s=GetFeatureMaps(next,FeatureMapsCount); Link[][][] kernelCollection=GetKernelCollection(c,2,0); //always x/2 Dictionary<Link,List<Connection>> map=new Dictionary<Link,List<Connection>>(); for(var i=0;i<kernelCollection.Length;i++) ConnectFeatureMaps(s[i],kernelCollection[i],bias,map); foreach(Link link in prior) link.Next= map[link].ToArray(); foreach(NeuronBase neuron in next) neuron.Previous=map[neuron].ToArray(); if(bias!=null){ if(bias.Next==null) bias.Next=new Connection[] { }; bias.Next=bias.Next.Concat(map[bias]).ToArray(); } }
public NetworkStructure(Link[][] layers,Bias bias) { Utility.Verify(() => layers!=null && layers.All(x => x!=null&&x.Length>0),"layers"); Layers=layers; Bias=bias; Elements=Gather(layers,bias).ToArray(); }
IEnumerable<Connection> GetNeuronConnections(Link[] prior,NeuronBase neuron, Bias bias) { foreach(Link link in prior) yield return new Connection(link,neuron); if(bias!=null) yield return new Connection(bias,neuron); }
protected NetworkStructure GetLayers(int[] layers, Bias bias, IContinuousActivator func) { var l = layers.Length; Link[][] structure = new Link[l][]; FullLayerConnector connector = new FullLayerConnector(); for (var i = 0; i < l - 1; i++) { if (i == 0) { structure[i] = Utility.Generate <Link>(layers[i]).ToArray(); } int j = i + 1; structure[j] = Utility.Generate <Neuron>(layers[j]).ToArray(); connector.Connect(structure[i], (NeuronBase[])structure[j], bias); } SetIdentity(structure); foreach (Link[] layer in structure) { foreach (Link link in layer) { if (link is NeuronBase) { ((NeuronBase)link).Func = func; } } } return(new NetworkStructure(structure, bias)); }
public NetworkStructure(Link[][] layers, Bias bias) { Utility.Verify(() => layers != null && layers.All(x => x != null && x.Length > 0), "layers"); Layers = layers; Bias = bias; Elements = Gather(layers, bias).ToArray(); }
public ConvolutionalNetwork Create(ConvolutionalTopology topology) { Utility.Verify(topology,t => t!=null,"Invalid network topology"); var l=topology.Layers.Length; Link[][] layers=new Link[l][]; Bias bias=null; if(topology.Bias.HasValue) bias=new Bias(topology.Bias.Value); for(var i=0; i<l-1;i++){ if(i==0) layers[i]=Utility.Generate<Link>(topology.Layers[i]).ToArray(); int j=i+1; int size=topology.Layers[j]; if(topology.Map[i] is SubSampling) layers[j]= Utility.Generate<SubSamplingNeuron>(size).ToArray(); else layers[j]= Utility.Generate<Neuron>(size).ToArray(); topology.Map[i].Connect(layers[i],(NeuronBase[])layers[j],bias); } SetIdentity(layers); foreach(Link[] layer in layers) foreach(Link link in layer) if(link is NeuronBase) ((NeuronBase)link).Func=topology.Func; return new ConvolutionalNetwork(new NetworkStructure(layers,bias)); }
protected NetworkStructure GetStructure(XElement root) { var unitElems = root.Elements("unit"); var weightElems = root.Elements("weight"); Dictionary <string, Tuple <Link, int> > unitsMap = GetUnits(unitElems).ToDictionary(pair => pair.Item1.GetDescription(), pair => pair); Dictionary <string, Weight> weightsMap = GetWeights(weightElems).ToDictionary(pair => pair.Item1, pair => pair.Item2); var connectionElems = root.Elements("connection"); Dictionary <Link, List <Connection> > mapNext = new Dictionary <Link, List <Connection> >(); Dictionary <Link, List <Connection> > mapPrevious = new Dictionary <Link, List <Connection> >(); foreach (XElement element in connectionElems) { Connection c = new Connection(weightsMap[element.Value], unitsMap[element.Attribute("from").Value].Item1, (NeuronBase)unitsMap[element.Attribute("to").Value].Item1); if (!mapNext.ContainsKey(c.Previous)) { mapNext.Add(c.Previous, new List <Connection>()); } mapNext[c.Previous].Add(c); if (!mapPrevious.ContainsKey(c.Next)) { mapPrevious.Add(c.Next, new List <Connection>()); } mapPrevious[c.Next].Add(c); } Link[] structure = unitsMap.Select(x => x.Value.Item1).ToArray(); foreach (Link link in structure) { if (mapNext.ContainsKey(link)) { link.Next = mapNext[link].ToArray(); } if (link is NeuronBase) { if (mapPrevious.ContainsKey(link)) { ((NeuronBase)link).Previous = mapPrevious[link].ToArray(); } } } Bias bias = unitsMap.Select(x => x.Value.Item1).FirstOrDefault(x => x is Bias) as Bias; int layersCount = int.Parse(root.Element("layers").Value); List <List <Link> > layers = new List <List <Link> >(layersCount); for (var i = 0; i < layersCount; i++) { layers.Add(new List <Link>()); } foreach (var kvp in unitsMap) { int l = kvp.Value.Item2; if (l != -1) { layers[l].Add(kvp.Value.Item1); } } return(new NetworkStructure(layers.Select(x => x.ToArray()).ToArray(), bias)); }
public void TSSetUp() { l1= Utility.Generate<Link>(() => new Link(),36).ToArray(); l2=Utility.Generate<Neuron>(() => new Neuron(new Sigmoid()),4).ToArray(); Bias=new Bias(1); Cma=new ConvolutionAuto(4,1,1,2); Cma.Connect(l1,l2,Bias); }
public void TSSetUp() { l1= Utility.Generate<Link>(() => new Link(),1176).ToArray(); l2=Utility.Generate<Neuron>(() => new Neuron(new Sigmoid()),1600).ToArray(); Func<double> wg= () => Weight++; Bias=new Bias(1); Cma=new Convolution(5,16,6,4,GetSchema()); Cma.Connect(l1,l2,Bias); }
IEnumerable<Link> Gather(Link[][] layers,Bias bias) { foreach(Link[] layer in layers) foreach(Link link in layer) yield return link; if(bias!=null) yield return bias; yield break; }
public void TSSetUp() { l1= Utility.Generate<Link>(() => new Link(),4704).ToArray(); l2=Utility.Generate<Neuron>(() => new Neuron(new Sigmoid()),1176).ToArray(); Func<double> wg= () => Weight++; Bias=new Bias(1); SbSg=new SubSampling(6); SbSg.Connect(l1,l2,Bias); }
public override void Connect(Link[] prior, NeuronBase[] next, Bias bias) { Utility.Verify(prior, x => x != null && prior.Length > 0, "Invalid prior layer"); Utility.Verify(next, x => x != null && next.Length > 0, "Invalid next layer"); foreach (NeuronBase neuron in next) { neuron.Previous = GetNeuronConnections(prior, neuron, bias).ToArray(); } int idx = 0; foreach (Link link in prior) { link.Next = GetLinkConnections(idx++, next).ToArray(); } if (bias != null) { var biasConnections = GetBiasConnections(bias, next); if (bias.Next == null) { bias.Next = new Connection[] { } } ; bias.Next = bias.Next.Concat(biasConnections).ToArray(); } } IEnumerable <Connection> GetNeuronConnections(Link[] prior, NeuronBase neuron, Bias bias) { foreach (Link link in prior) { yield return(new Connection(link, neuron)); } if (bias != null) { yield return(new Connection(bias, neuron)); } } IEnumerable <Connection> GetLinkConnections(int index, NeuronBase[] next) { foreach (NeuronBase neuron in next) { yield return(neuron.Previous[index]); } } IEnumerable <Connection> GetBiasConnections(Bias bias, NeuronBase[] next) { foreach (NeuronBase neuron in next) { yield return(neuron.Previous[neuron.Previous.Length - 1]); } } }
void ConnectFeatureMaps(NeuronBase[] next,Link[][] kernelCollection,Bias bias,Dictionary<Link,List<Connection>> map) { SharedWeight weight=new SharedWeight(next.Length); SharedWeight biasWeight=new SharedWeight(next.Length); for(var i=0;i<kernelCollection.Length;i++){ ConnectKernel(next[i],kernelCollection[i],weight,map); if(bias!=null){ Map(bias,next[i],biasWeight,map); } } }
public ConvolutionMapAuto(int kernelSize, int featureMapsCount, int overlap, Bias bias, Func <double> weightGenerator) { Utility.Verify(kernelSize, x => x > 0, "Invalid kernelSize value"); Utility.Verify(featureMapsCount, x => x > 0, "Invalid featureMapsCount value"); Utility.Verify(overlap, x => x >= 0, "Invalid overlap value"); Utility.Verify(weightGenerator, x => x != null, "Null weightGenerator"); KernelSize = kernelSize; FeatureMapsCount = featureMapsCount; Overlap = overlap; WeightGenerator = weightGenerator; Bias = bias; }
void ConnectKernel(Link[] kernel,Node node,Weight[] weights, Bias bias,Dictionary<Link,int> ccd) { int l=kernel.Length; if(bias!=null) l++; node.Previous=new Connection[l]; for(var i=0;i<kernel.Length;i++) { kernel[i].Next=kernel[i].Next??new Connection[ccd[kernel[i]]]; Connect(kernel[i],node,weights[i]); } if(bias!=null) Connect(bias,node,weights[kernel.Length]); }
public ConvolutionMapAuto(int kernelSize, int featureMapsCount, int overlap, Bias bias, Func<double> weightGenerator) { Utility.Verify(kernelSize,x => x>0,"Invalid kernelSize value"); Utility.Verify(featureMapsCount,x => x>0,"Invalid featureMapsCount value"); Utility.Verify(overlap,x => x>=0,"Invalid overlap value"); Utility.Verify(weightGenerator,x => x!=null,"Null weightGenerator"); KernelSize=kernelSize; FeatureMapsCount=featureMapsCount; Overlap=overlap; WeightGenerator=weightGenerator; Bias=bias; }
IEnumerable <Link> Gather(Link[][] layers, Bias bias) { foreach (Link[] layer in layers) { foreach (Link link in layer) { yield return(link); } } if (bias != null) { yield return(bias); } yield break; }
public override void Connect(Link[] prior,NeuronBase[] next,Bias bias) { Utility.Verify(prior,x => x!=null && prior.Length>0,"Invalid prior layer"); Utility.Verify(next,x => x!=null && next.Length>0,"Invalid next layer"); foreach(NeuronBase neuron in next) neuron.Previous=GetNeuronConnections(prior,neuron,bias).ToArray(); int idx=0; foreach(Link link in prior) link.Next=GetLinkConnections(idx++,next).ToArray(); if(bias!=null){ var biasConnections=GetBiasConnections(bias,next); if(bias.Next==null) bias.Next=new Connection[] { }; bias.Next=bias.Next.Concat(biasConnections).ToArray(); } }
public ConvolutionalNetwork Create(ConvolutionalTopology topology) { Utility.Verify(topology, t => t != null, "Invalid network topology"); var l = topology.Layers.Length; Link[][] layers = new Link[l][]; Bias bias = null; if (topology.Bias.HasValue) { bias = new Bias(topology.Bias.Value); } for (var i = 0; i < l - 1; i++) { if (i == 0) { layers[i] = Utility.Generate <Link>(topology.Layers[i]).ToArray(); } int j = i + 1; int size = topology.Layers[j]; if (topology.Map[i] is SubSampling) { layers[j] = Utility.Generate <SubSamplingNeuron>(size).ToArray(); } else { layers[j] = Utility.Generate <Neuron>(size).ToArray(); } topology.Map[i].Connect(layers[i], (NeuronBase[])layers[j], bias); } SetIdentity(layers); foreach (Link[] layer in layers) { foreach (Link link in layer) { if (link is NeuronBase) { ((NeuronBase)link).Func = topology.Func; } } } return(new ConvolutionalNetwork(new NetworkStructure(layers, bias))); }
protected NetworkStructure GetLayers(int[] layers,Bias bias,IContinuousActivator func) { var l=layers.Length; Link[][] structure=new Link[l][]; FullLayerConnector connector=new FullLayerConnector(); for(var i=0;i<l-1;i++) { if(i==0) structure[i]=Utility.Generate<Link>(layers[i]).ToArray(); int j=i+1; structure[j]= Utility.Generate<Neuron>(layers[j]).ToArray(); connector.Connect(structure[i],(NeuronBase[])structure[j],bias); } SetIdentity(structure); foreach(Link[] layer in structure) foreach(Link link in layer) if(link is NeuronBase) ((NeuronBase)link).Func=func; return new NetworkStructure(structure,bias); }
void ConnectKernel(Link[] kernel, Node node, Weight[] weights, Bias bias, Dictionary <Link, int> ccd) { int l = kernel.Length; if (bias != null) { l++; } node.Previous = new Connection[l]; for (var i = 0; i < kernel.Length; i++) { kernel[i].Next = kernel[i].Next ?? new Connection[ccd[kernel[i]]]; Connect(kernel[i], node, weights[i]); } if (bias != null) { Connect(bias, node, weights[kernel.Length]); } }
public override void Connect(Link[] prior,NeuronBase[] next,Bias bias) { Utility.Verify(prior,x => x!=null && prior.Length>0,"Invalid prior layer"); Utility.Verify(next,x => x!=null && next.Length>0,"Invalid next layer"); Utility.Verify(() => next.Length % NextFeatureMapsCount==0,"NextFeatureMapsCount - next layer size conflict"); Utility.Verify(() => prior.Length % PriorFeatureMapsCount==0,"PriorFeatureMapsCount - prior layer size conflict"); Link[][] fmp=GetFeatureMaps(prior,PriorFeatureMapsCount); Link[][] fmn=GetFeatureMaps(next,NextFeatureMapsCount); Link[][][] kernelCollection=GetKernelCollection(fmp,KernelSize,Overlap); Dictionary<Link,List<Connection>> map=new Dictionary<Link,List<Connection>>(); for(int f=0;f<fmn.Length;f++) { Neuron[] nextFeatureMap=fmn[f].Select(x => (Neuron)x).ToArray(); for(int p=0;p<fmp.Length;p++) { bool inSchema=Schema[p][f]; if(inSchema) ConnectFeatureMaps(nextFeatureMap,kernelCollection[p],map); } if(bias!=null) { Weight weight=new SharedWeight(nextFeatureMap.Length); foreach(Neuron node in nextFeatureMap) Map(bias,node,weight,map); } } foreach(Link link in prior) link.Next= map[link].ToArray(); foreach(Neuron node in next) node.Previous=map[node].ToArray(); if(bias!=null){ if(bias.Next==null) bias.Next=new Connection[] { }; bias.Next=bias.Next.Concat(map[bias]).ToArray(); } }
public override void Connect(Link[] prior, NeuronBase[] next, Bias bias) { Utility.Verify(prior, x => x != null && prior.Length > 0, "Invalid prior layer"); Utility.Verify(next, x => x != null && next.Length > 0, "Invalid next layer"); Utility.Verify(() => next.Length % NextFeatureMapsCount == 0, "NextFeatureMapsCount - next layer size conflict"); Utility.Verify(() => prior.Length % PriorFeatureMapsCount == 0, "PriorFeatureMapsCount - prior layer size conflict"); Link[][] fmp = GetFeatureMaps(prior, PriorFeatureMapsCount); Link[][] fmn = GetFeatureMaps(next, NextFeatureMapsCount); Link[][][] kernelCollection = GetKernelCollection(fmp, KernelSize, Overlap); Dictionary <Link, List <Connection> > map = new Dictionary <Link, List <Connection> >(); for (int f = 0; f < fmn.Length; f++) { Neuron[] nextFeatureMap = fmn[f].Select(x => (Neuron)x).ToArray(); for (int p = 0; p < fmp.Length; p++) { bool inSchema = Schema[p][f]; if (inSchema) { ConnectFeatureMaps(nextFeatureMap, kernelCollection[p], map); } } if (bias != null) { Weight weight = new SharedWeight(nextFeatureMap.Length); foreach (Neuron node in nextFeatureMap) { Map(bias, node, weight, map); } } } foreach (Link link in prior) { link.Next = map[link].ToArray(); } foreach (Neuron node in next) { node.Previous = map[node].ToArray(); } if (bias != null) { if (bias.Next == null) { bias.Next = new Connection[] { } } ; bias.Next = bias.Next.Concat(map[bias]).ToArray(); } } void ConnectFeatureMaps(Neuron[] next, Link[][] kernelCollection, Dictionary <Link, List <Connection> > map) { Weight[] weights = Utility.Generate(() => new SharedWeight(kernelCollection.Length), KernelSize * KernelSize).ToArray(); for (int i = 0; i < kernelCollection.Length; i++) { for (var j = 0; j < kernelCollection[i].Length; j++) { Link link = kernelCollection[i][j]; Map(link, next[i], weights[j], map); } } } void Map(Link a, Link b, Weight weight, Dictionary <Link, List <Connection> > map) { Connection connection = new Connection(weight, a, (NeuronBase)b); if (!map.ContainsKey(a)) { map[a] = new List <Connection>(); } map[a].Add(connection); if (!map.ContainsKey(b)) { map[b] = new List <Connection>(); } map[b].Add(connection); } }
IEnumerable<Connection> GetBiasConnections(Bias bias, NeuronBase[] next) { foreach(NeuronBase neuron in next) yield return neuron.Previous[neuron.Previous.Length-1]; }
public void TSSetUp() { l1= Utility.Generate<Link>(() => new Link(),841).ToArray(); l2=Utility.Generate<Neuron>(() => new Neuron(new Sigmoid()),1014).ToArray(); Func<double> wg= () => Weight++; Bias=new Bias(1); Cma=new ConvolutionAuto(5,6,1,3); Cma.Connect(l1,l2,Bias); }
public override void Connect(Link[] prior, NeuronBase[] next, Bias bias) { Utility.Verify(prior, x => x != null && prior.Length > 0, "Invalid prior layer"); Utility.Verify(next, x => x != null && next.Length > 0, "Invalid next layer"); Utility.Verify(() => next.Length % FeatureMapsCount == 0, "FeatureMapsCount - next layer size conflict"); Utility.Verify(() => prior.Length % FeatureMapsCount == 0, "FeatureMapsCount - prior layer size conflict"); Link[][] c = GetFeatureMaps(prior, FeatureMapsCount); NeuronBase[][] s = GetFeatureMaps(next, FeatureMapsCount); Link[][][] kernelCollection = GetKernelCollection(c, 2, 0); //always x/2 Dictionary <Link, List <Connection> > map = new Dictionary <Link, List <Connection> >(); for (var i = 0; i < kernelCollection.Length; i++) { ConnectFeatureMaps(s[i], kernelCollection[i], bias, map); } foreach (Link link in prior) { link.Next = map[link].ToArray(); } foreach (NeuronBase neuron in next) { neuron.Previous = map[neuron].ToArray(); } if (bias != null) { if (bias.Next == null) { bias.Next = new Connection[] { } } ; bias.Next = bias.Next.Concat(map[bias]).ToArray(); } } void ConnectFeatureMaps(NeuronBase[] next, Link[][] kernelCollection, Bias bias, Dictionary <Link, List <Connection> > map) { SharedWeight weight = new SharedWeight(next.Length); SharedWeight biasWeight = new SharedWeight(next.Length); for (var i = 0; i < kernelCollection.Length; i++) { ConnectKernel(next[i], kernelCollection[i], weight, map); if (bias != null) { Map(bias, next[i], biasWeight, map); } } } void ConnectKernel(NeuronBase neuron, Link[] kernel, SharedWeight weight, Dictionary <Link, List <Connection> > map) { foreach (Link link in kernel) { Map(link, neuron, weight, map); } } void Map(Link a, Link b, Weight weight, Dictionary <Link, List <Connection> > map) { Connection connection = new Connection(weight, a, (NeuronBase)b); if (!map.ContainsKey(a)) { map[a] = new List <Connection>(); } map[a].Add(connection); if (!map.ContainsKey(b)) { map[b] = new List <Connection>(); } map[b].Add(connection); } }
public abstract void Connect(Link[] prior,NeuronBase[] next, Bias bias);
public MultilayerPerceptron Create(int[] layers, double?biasValue, IContinuousActivator func) { Bias bias = biasValue.HasValue? new Bias(biasValue.Value):null; return(new MultilayerPerceptron(GetLayers(layers, bias, func))); }
public abstract void Connect(Link[] prior, NeuronBase[] next, Bias bias);