Example #1
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();
            }
        }
Example #2
0
 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();
 }
Example #3
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);
 }
Example #4
0
        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));
        }
Example #5
0
 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();
 }
Example #6
0
        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));
        }
Example #7
0
        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));
        }
Example #8
0
 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);
 }
Example #9
0
 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);
 }
Example #10
0
 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;
 }
Example #11
0
 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);
 }
Example #12
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();
            }
        }

        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]);
            }
        }
    }
Example #13
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);
         }
     }
 }
        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;
        }
Example #15
0
 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]);
 }
Example #16
0
        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;
        }
Example #17
0
 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;
 }
Example #18
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();
            }
        }
Example #19
0
        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)));
        }
Example #20
0
 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]);
            }
        }
Example #22
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();
            }
        }
Example #23
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();
            }
        }

        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);
        }
    }
Example #24
0
 IEnumerable<Connection> GetBiasConnections(Bias bias, NeuronBase[] next)
 {
     foreach(NeuronBase neuron in next)
         yield return neuron.Previous[neuron.Previous.Length-1];
 }
Example #25
0
 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);
 }
Example #26
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();
            }
        }

        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);
        }
    }
Example #27
0
 public abstract void Connect(Link[] prior,NeuronBase[] next, Bias bias);
Example #28
0
        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)));
        }
Example #29
0
 public abstract void Connect(Link[] prior, NeuronBase[] next, Bias bias);