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)); }
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())); }
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())); }