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); }
public Connection(Weight weight,Link previous,NeuronBase next) { Utility.Verify(()=> weight!=null && previous!=null && next!=null); Weight=weight; Next=next; Previous=previous; }
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 Connection(Weight weight, Link previous, NeuronBase next) { Utility.Verify(() => weight != null && previous != null && next != null); Weight = weight; Next = next; Previous = previous; }
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 CheckConnection(Link pre, NeuronBase post,ref int i) { var bridge= from a in pre.Next join b in post.Previous on a equals b select a; Assert.AreEqual(bridge.Count(),1); Connection inp=bridge.First(); Assert.AreEqual(inp.Previous,pre); Assert.AreEqual(inp.Next,post); i++; if(post.Next!=null){ foreach(var n in post.Next) { var pp=n.Next; CheckConnection(post,pp,ref i); } } }
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 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 Connection(Link previous,NeuronBase next) : this(new Weight(),previous,next) { }
void ConnectKernel(NeuronBase neuron,Link[] kernel,SharedWeight weight,Dictionary<Link,List<Connection>> map) { foreach(Link link in kernel) { Map(link,neuron,weight,map); } }
public Connection(Link previous, NeuronBase next) : this(new Weight(), previous, next) { }
public abstract void Connect(Link[] prior,NeuronBase[] next, Bias bias);
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]; }