Пример #1
0
 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);
 }
Пример #2
0
 public Connection(Weight weight,Link previous,NeuronBase next)
 {
     Utility.Verify(()=> weight!=null && previous!=null && next!=null);
     Weight=weight;
     Next=next;
     Previous=previous;
 }
Пример #3
0
        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();
            }
        }
Пример #4
0
 public Connection(Weight weight, Link previous, NeuronBase next)
 {
     Utility.Verify(() => weight != null && previous != null && next != null);
     Weight   = weight;
     Next     = next;
     Previous = previous;
 }
Пример #5
0
 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);
         }
     }
 }
Пример #6
0
 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);
         }
     }
 }
Пример #7
0
        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();
            }
        }
Пример #8
0
        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();
            }
        }
Пример #9
0
 public Connection(Link previous,NeuronBase next)
     : this(new Weight(),previous,next)
 {
 }
Пример #10
0
 void ConnectKernel(NeuronBase neuron,Link[] kernel,SharedWeight weight,Dictionary<Link,List<Connection>> map)
 {
     foreach(Link link in kernel) {
         Map(link,neuron,weight,map);
     }
 }
Пример #11
0
 public Connection(Link previous, NeuronBase next)
     : this(new Weight(), previous, next)
 {
 }
Пример #12
0
 public abstract void Connect(Link[] prior,NeuronBase[] next, Bias bias);
Пример #13
0
 IEnumerable<Connection> GetLinkConnections(int index,NeuronBase[] next)
 {
     foreach(NeuronBase neuron in next)
         yield return neuron.Previous[index];
 }
Пример #14
0
 IEnumerable<Connection> GetBiasConnections(Bias bias, NeuronBase[] next)
 {
     foreach(NeuronBase neuron in next)
         yield return neuron.Previous[neuron.Previous.Length-1];
 }