Example #1
0
        void ReshapeFit(int[] args)
        {
            int pos = -1, nb = 0;

            for (int k = 0; k < args.Length; ++k)
            {
                if (args[k] == -1)
                {
                    ++nb;
                    pos = k;
                }
            }

            if (nb > 1)
            {
                throw new ArgumentException();
            }

            if (nb == 1)
            {
                args[pos] = 1;
                int dim0 = NumDN.ShapeLength(Shape);
                int dim1 = NumDN.ShapeLength(args);
                if (dim0 % dim1 != 0)
                {
                    throw new ArgumentException();
                }

                args[pos] = dim0 / dim1;
            }
        }
Example #2
0
        public override NDArray <Type> Forward(NDArray <Type> X, bool isTraining)
        {
            if (runningMean == null)
            {
                runningMean = NumDN.Mean(X, 0);
                runningVar  = NumDN.Var(X, 0);
            }

            NDArray <Type> mean, varr;

            if (isTraining)
            {
                mean = NumDN.Mean(X, 0);
                varr = NumDN.Var(X, 0);

                runningMean = momentum * runningMean + (1 - momentum) * mean;
                runningVar  = momentum * runningVar + (1 - momentum) * varr;
            }
            else
            {
                mean = runningMean;
                varr = runningVar;
            }

            X_centered = X - mean;
            stddev_inv = 1.0 / NumDN.Sq(varr + eps);

            var X_norm = X_centered * stddev_inv;
            var output = gamma * X_norm + beta;

            return(output);
        }
Example #3
0
        public override void Initialize(IOptimizer <Type> optimizer)
        {
            double lim = 1.0 / Math.Sqrt(Inputs[0]);

            W  = NumDN.Uniform <Type>(-lim, lim, Inputs[0], Outputs[0]);
            w0 = NDArray <Type> .Zeros(1, Outputs[0]);

            WOpt  = optimizer.Clone();
            w0Opt = optimizer.Clone();
        }
Example #4
0
        public override void Initialize(IOptimizer <Type> optimizer = null)
        {
            fHeight = filterShape[0];
            fWidth  = filterShape[1];
            channel = Inputs[0];
            double lim = 1.0 / Math.Sqrt(NumDN.ShapeLength(filterShape));

            W  = NumDN.Uniform <Type>(-lim, lim, numFilters, channel, fWidth, fHeight);
            w0 = NDArray <Type> .Zeros(numFilters, 1);

            WOpt  = optimizer.Clone();
            w0Opt = optimizer.Clone();
        }
Example #5
0
        public NDArray(Type v, int[] shape)
        {
            int dim = NumDN.ShapeLength(shape);

            if (dim <= 0)
            {
                throw new ArgumentException();
            }

            Shape  = shape.ToArray();
            tmpArr = new int[Shape.Length];
            items  = Enumerable.Repeat(v, dim).ToArray();
        }
Example #6
0
        public NDArray(Type[] nd, int[] shape)
        {
            int dim = NumDN.ShapeLength(shape);

            if (dim <= 0)
            {
                throw new ArgumentException();
            }

            Shape  = shape.ToArray();
            tmpArr = new int[Shape.Length];
            items  = nd.ToArray();
        }
Example #7
0
        public double Acc(NDArray <Type> y, NDArray <Type> p)
        {
            int    n = y.Shape[0];
            double s = 0;
            var    v = NumDN.Abs(y - p).Apply(x => Convert.ToDouble(x) < 0.5 ? 1 : 0);

            for (int k = 0; k < n; ++k)
            {
                s += Enumerable.Range(k * 10, 10).Select(i => v.items[i]).Sum() == 10 ? 1.0 : 0.0;
            }

            //var m = (y - p).items.Select(x => Math.Abs(Convert.ToDouble(x)) < 0.7 ? 1.0 : 0.0).Average();
            return(s);
        }
Example #8
0
        public void ReShapeInplace(params int[] args)
        {
            ReshapeFit(args);
            int oldDim = NumDN.ShapeLength(Shape);
            int newDim = NumDN.ShapeLength(args);

            if (oldDim != newDim)
            {
                throw new ArgumentException();
            }

            Shape  = args.Length != 0 ? args.ToArray() : new int[] { 1 };
            tmpArr = new int[Shape.Length];
        }
Example #9
0
        static void Bench(int batchSize, int loops)
        {
            NumDN.DebugNumPy = false;

            var sw = Stopwatch.StartNew();

            for (int k = 0; k < loops; ++k)
            {
                var x    = NumDN.UniformInt(0, 16, batchSize, 1, 8, 8).Cast <float>();
                var cols = Conv2d <float> .img2col(x, new int[] { 3, 3 }, 1);

                var x0 = Conv2d <float> .col2img(cols, x.Shape, new int[] { 3, 3 }, 1);
            }

            Console.WriteLine($"{0.001 * sw.ElapsedMilliseconds} s");
        }
Example #10
0
        public NDArray <Type> ReShape(params int[] args)
        {
            ReshapeFit(args);
            int oldDim = NumDN.ShapeLength(Shape);
            int newDim = NumDN.ShapeLength(args);

            if (oldDim != newDim)
            {
                throw new ArgumentException();
            }

            var ndarr = new NDArray <Type>(this);

            ndarr.Shape  = args.Length != 0 ? args.ToArray() : new int[] { 1 };
            ndarr.tmpArr = new int[ndarr.Shape.Length];
            return(ndarr);
        }
Example #11
0
        public override NDArray <Type> Backward(NDArray <Type> accumGrad)
        {
            var Wtmp = new NDArray <Type>(W);

            if (trainable)
            {
                var gW = NDArray <Type> .Dot(layerInput.T, accumGrad);

                var gw0 = (new NDArray <Type>(accumGrad.Shape)) + NumDN.SumDouble(accumGrad);

                W  = WOpt.Update(W, gW);
                w0 = w0Opt.Update(w0, gw0);
            }

            var accumGrad0 = NDArray <Type> .Dot(accumGrad, W.T);

            return(accumGrad0);
        }
Example #12
0
        /*
         * def backward_pass(self, accum_grad):
         # Reshape accumulated gradient into column shape
         #  accum_grad = accum_grad.transpose(1, 2, 3, 0).reshape(self.n_filters, -1)
         #
         #  if self.trainable:
         # Take dot product between column shaped accum. gradient and column shape
         # layer input to determine the gradient at the layer with respect to layer weights
         #      grad_w = accum_grad.dot(self.X_col.T).reshape(self.W.shape)
         # The gradient with respect to bias terms is the sum similarly to in Dense layer
         #      grad_w0 = np.sum(accum_grad, axis=1, keepdims=True)
         #
         # Update the layers weights
         #      self.W = self.W_opt.update(self.W, grad_w)
         #      self.w0 = self.w0_opt.update(self.w0, grad_w0)
         #
         # Recalculate the gradient which will be propogated back to prev. layer
         #  accum_grad = self.W_col.T.dot(accum_grad)
         # Reshape from column shape to image shape
         #  accum_grad = column_to_image(accum_grad,
         #                          self.layer_input.shape,
         #                          self.filter_shape,
         #                          stride=self.stride,
         #                          output_shape=self.padding)
         #
         #  return accum_grad
         */
        public override NDArray <Type> Backward(NDArray <Type> accumGrad)
        {
            var accumGrad0 = accumGrad.transpose(1, 2, 3, 0).ReShape(numFilters, -1);

            if (trainable)
            {
                var gradW = NDArray <Type> .Dot(accumGrad0, X_col.T).ReShape(W.Shape);

                var gradw0 = NumDN.Sum(accumGrad0, true, 1);
                W  = WOpt.Update(W, gradW);
                w0 = w0Opt.Update(w0, gradw0);
            }

            accumGrad0 = NDArray <Type> .Dot(W_col.T, accumGrad0);

            accumGrad0 = col2img(accumGrad0, layerInput.Shape, filterShape, stride, padding);

            return(accumGrad0);
        }
Example #13
0
        public NDArray <Type> Update(NDArray <Type> w, NDArray <Type> g)
        {
            if (m == null)
            {
                m = NDArray <Type> .Zeros(g.Shape);

                v = NDArray <Type> .Zeros(g.Shape);
            }

            m = b1 * m + (1 - b1) * g;
            v = b2 * v + (1 - b2) * NumDN.Sq(g);

            var mh = m / (1.0 - b1);
            var vh = v / (1.0 - b2);

            weightsUpdate = learning_rate * mh / (NumDN.Sqrt(vh) + eps);

            return(w - weightsUpdate);
        }
Example #14
0
        public NDArray <Type> this[int i]
        {
            get
            {
                if (i >= Shape[0] || i < -1)
                {
                    throw new ArgumentException();
                }

                var dim0   = NumDN.ShapeLength(Shape);
                var dim1   = dim0 / Shape[0];
                var nshape = Shape.Skip(1).ToArray();

                var start = i * dim1;
                var nd    = new NDArray <Type>(nshape);
                for (int j = 0, k = start; j < dim1; ++j, ++k)
                {
                    nd.items[j] = items[k];
                }

                return(nd);
            }
            set
            {
                var dim0 = NumDN.ShapeLength(Shape);
                var dim1 = NumDN.ShapeLength(value.Shape);
                if (dim0 / dim1 != Shape[0] || i >= Shape[0] || i < 0)
                {
                    throw new ArgumentException();
                }

                var start = i * dim1;
                for (int j = 0, k = start; j < dim1; ++j, ++k)
                {
                    items[k] = value.items[j];
                }
            }
        }
Example #15
0
        public override NDArray <Type> Backward(NDArray <Type> accumGrad)
        {
            var gamma0 = new NDArray <Type>(gamma);

            if (trainable)
            {
                var X_norm     = X_centered * stddev_inv;
                var grad_gamma = NumDN.Sum(accumGrad * X_norm, 0);
                var grad_beta  = NumDN.Sum(accumGrad, 0);

                gamma = gOpt.Update(gamma, grad_gamma);
                beta  = bOpt.Update(beta, grad_beta);
            }

            double batchSize = accumGrad.Shape[0];

            accumGrad = (1.0 / batchSize) * gamma0 * stddev_inv * (
                batchSize * accumGrad
                - NumDN.Sum(accumGrad, 0)
                - X_centered * stddev_inv * stddev_inv * NumDN.Sum(accumGrad * X_centered, 0)
                );

            return(accumGrad);
        }
Example #16
0
 public override int[] GetOutputShape() => new int[]
 {
     NumDN.ShapeLength(Inputs)
 };
Example #17
0
 public NDArray <Type> Function(NDArray <Type> x) => NumDN.Sigmoid(x);
Example #18
0
        public static NDArray <Type> Dot(NDArray <Type> nD0, NDArray <Type> nD1)
        {
            if (nD0.Shape.Length == 1)
            {
                nD0 = nD0.ReShape(1, nD0.Shape[0]);
            }

            if (nD1.Shape.Length == 1)
            {
                nD1 = nD1.ReShape(nD1.Shape[0], 1);
            }

            int length0 = nD0.Shape.Length;
            int length1 = nD1.Shape.Length;
            int piv     = nD0.Shape.Last();

            if (piv != nD1.Shape[length1 - 2])
            {
                throw new ArgumentException($"Cannot multiply {nD0.Shape.Glue("x")} and {nD1.Shape.Glue("x")}");
            }

            int[] nshape   = new int[length0 + length1 - 2];
            int[] idxInfos = new int[length0 + length1 - 2];
            for (int k = 0, k0 = 0; k < length0 + length1; ++k)
            {
                if (k == length0 - 1 || k == length0 + length1 - 2)
                {
                    continue;
                }
                if (k < length0 - 1)
                {
                    nshape[k] = nD0.Shape[idxInfos[k] = k];
                }
                else
                {
                    nshape[k0] = nD1.Shape[idxInfos[k0] = k - length0];
                }
                ++k0;
            }

            int dim = NumDN.ShapeLength(nshape);
            var nd  = new NDArray <Type>(nshape);

            for (int m = 0; m < nd.items.Length; ++m)
            {
                Type sum = OpsT.Zero;
                nd.Index2Array(m);

                for (int k = 0; k < nshape.Length; ++k)
                {
                    if (k < length0 - 1)
                    {
                        nD0.tmpArr[idxInfos[k]] = nd.tmpArr[k];
                    }
                    else
                    {
                        nD1.tmpArr[idxInfos[k]] = nd.tmpArr[k];
                    }
                }

                for (int i = 0; i < piv; ++i)
                {
                    nD0.tmpArr[length0 - 1] = nD1.tmpArr[length1 - 2] = i;
                    int idx0 = nD0.Array2Index();
                    int idx1 = nD1.Array2Index();

                    sum = OpsT.Add(sum, OpsT.Mul(nD0.items[idx0], nD1.items[idx1]));
                }

                nd.items[m] = sum;
            }

            return(nd);
        }
Example #19
0
 public NDArray <Type> Loss(NDArray <Type> y, NDArray <Type> p) => 0.5 * NumDN.Sq(y - p);
Example #20
0
        public NDArray <Type> Function(NDArray <Type> x)
        {
            var ex = NumDN.Exp(x - NumDN.Max(x));

            return(ex / NumDN.SumDouble(ex));
        }
Example #21
0
        public NDArray <Type> Loss(NDArray <Type> y, NDArray <Type> p)
        {
            var p0 = NumDN.Clamp(p, 1e-15, 1 - 1e-15);

            return(-y *NumDN.Log(p0) - (1 - y) * NumDN.Log(1 - p0));
        }
Example #22
0
 public NDArray <Type> Function(NDArray <Type> x) => NumDN.Tanh(x);
Example #23
0
 public NDArray <Type> Gradient(NDArray <Type> x) => NumDN.Sigmoid(x) * (1 - NumDN.Sigmoid(x));
Example #24
0
 public NDArray <Type> Gradient(NDArray <Type> x) => 1 - NumDN.Sq(NumDN.Tanh(x));
Example #25
0
        public NDArray <Type> Grad(NDArray <Type> y, NDArray <Type> p)
        {
            var p0 = NumDN.Clamp(p, 1e-15, 1 - 1e-15);

            return(-y / p0 + (1 - y) / (1 - p0));
        }