Esempio n. 1
0
        public Dataset Generate(int length)
        {
            var dataArray = new Data[length];

            for (int i = 0; i < length; i++)
            {
                var input = new ShapedArray <double>(InputShape, () => GRandom.Uniform() < 0.5 ? 0.0 : 1.0);

                int oneCount = 0;

                input.ForEach(X => oneCount += X == 1.0 ? 1 : 0);

                bool isEven = oneCount % 2 == 0;

                double[] outArr;

                if (IsBinary)
                {
                    outArr = isEven ? new double[] { 1.0, 0.0 } : new double[] { 0.0, 1.0 };
                }
                else
                {
                    outArr = isEven ? new double[] { 1.0 } : new double[] { 0.0 };
                }

                dataArray[i] = new Data(input, ShapedArray <double> .FromRef(TargetShape, outArr));
            }

            return(Dataset.FromRef(dataArray));
        }
Esempio n. 2
0
        public override void Connect(Layer inLayer)
        {
            if (inLayer.Shape != InputShape)
            {
                throw new ShapeMismatchException(nameof(inLayer));
            }

            ShapedArray <Neuron> padded = Padder.PadArray(inLayer.Neurons.ToShape(Shape), Paddings, () => new Neuron()
            {
                OutVal = PadVal
            });

            var inConnections = new ShapedArray <List <Synapse> >(PaddedShape, () => new List <Synapse>());

            IndexGen.ByStrides(PaddedShape, Strides, KernelShape).ForEach((idxKernel, i) =>
            {
                Neuron outN = base.Neurons[i];

                outN.InSynapses = IndexGen.ByStart(KernelShape, Array <int> .FromRef(idxKernel)).Select((idx, j) =>
                {
                    var S = new Synapse(padded[idx], outN);
                    inConnections[idx].Add(S);
                    return(S);
                });
            });

            padded.ForEach((N, i) => N.OutSynapses = Array <Synapse> .FromRef(inConnections[i].ToArray()));
        }
Esempio n. 3
0
        public override void Connect(Layer inLayer)
        {
            if (inLayer.Shape != InputShape)
            {
                throw new ShapeMismatchException(nameof(inLayer));
            }

            ShapedArray <Neuron> padded = Padder.PadArray(inLayer.Neurons.ToShape(Shape), Paddings, () => new Neuron()
            {
                OutVal = PadVal
            });

            var inConnections = new ShapedArray <List <Synapse> >(PaddedShape, () => new List <Synapse>());

            Kernels.ForEach((kernel, i) =>
            {
                int offset = i * Shape.Volume / KernelsNum;

                IndexGen.ByStrides(PaddedShape, Strides, KernelShape).ForEach((idxKernel, j) =>
                {
                    var outN = (CNeuron)Neurons[offset + j];

                    outN.KernelBias = kernel.Bias;

                    outN.InSynapses = IndexGen.ByStart(KernelShape, Array <int> .FromRef(idxKernel)).Select((idx, k) =>
                    {
                        var S = new CSynapse(padded[idx], outN)
                        {
                            KernelWeight = kernel.Weights[k]
                        };

                        inConnections[idx].Add(S);
                        return((Synapse)S);
                    });
                });
            });

            padded.ForEach((N, i) => N.OutSynapses = Array <Synapse> .FromRef(inConnections[i].ToArray()));
        }