Exemple #1
0
        public void TestRandomProjection()
        {
            var a           = _lap.CreateMatrix(256, 256, (x, y) => x * y).AsIndexable();
            var projector   = _lap.CreateRandomProjection(256, 32);
            var projections = projector.Compute(a);

            Assert.IsTrue(projections.ColumnCount == 32);
            Assert.IsTrue(projections.RowCount == 256);
        }
Exemple #2
0
 public void TensorConvertToVector()
 {
     Load();
     using var cpuTensor = _cpu.Create3DTensor(Enumerable.Range(0, 3).
                                               Select(i => _cpu.CreateMatrix(4, 4, (j, k) => (i + 1) * (j + 1) * (k + 1))).ToList());
     using var gpuTensor = _cuda.Create3DTensor(cpuTensor.Data);
     using var cpuVector = cpuTensor.ReshapeAsVector();
     using var gpuVector = gpuTensor.ReshapeAsVector();
     FloatingPointHelper.AssertEqual(cpuVector.AsIndexable(), gpuVector.AsIndexable());
     Cleanup();
 }
Exemple #3
0
        /// <summary>
        /// Create a matrix from a list of row vectors
        /// </summary>
        /// <param name="lap"></param>
        /// <param name="rowList">List of indexable vectors (each vector becomes a row in the new matrix)</param>
        /// <returns></returns>
        public static IMatrix CreateMatrixFromRows(this ILinearAlgebraProvider lap, IReadOnlyList <IIndexableVector> rowList)
        {
            int rows    = rowList.Count;
            var columns = rowList[0].Count;

            return(lap.CreateMatrix(rows, columns, (x, y) => rowList[x][y]));
        }
Exemple #4
0
        /// <summary>
        /// Create a matrix from a list of column vectors
        /// </summary>
        /// <param name="lap"></param>
        /// <param name="columnList">List of indexable vectors (each vector becomes a column in the new matrix)</param>
        /// <returns></returns>
        public static IMatrix CreateMatrixFromColumns(this ILinearAlgebraProvider lap, IReadOnlyList <IIndexableVector> columnList)
        {
            int columns = columnList.Count;
            var rows    = columnList[0].Count;

            return(lap.CreateMatrix(rows, columns, (x, y) => columnList[y][x]));
        }
        /// <summary>
        /// Create a matrix
        /// </summary>
        /// <param name="lap"></param>
        /// <param name="rowList">List of vectors (each vector becomes a row in the new matrix)</param>
        /// <returns></returns>
        public static IMatrix CreateMatrix(this ILinearAlgebraProvider lap, IReadOnlyList <FloatVector> rowList)
        {
            int rows = rowList.Count;
            var size = rowList[0].Size;

            return(lap.CreateMatrix(rows, size, (x, y) => rowList[x].Data[y]));
        }
 public float[] Predict(IReadOnlyList <IReadOnlyList <float> > input)
 {
     using (var v = _lap.CreateMatrix(input.Count, input[0].Count + 1, (i, j) => j == 0 ? 1 : input[i][j - 1]))
         using (var r = v.Multiply(_theta))
             using (var r2 = r.Row(0)) {
                 return(r.AsIndexable().Values.ToArray());
             }
 }
Exemple #7
0
        /// <summary>
        /// Create a matrix
        /// </summary>
        /// <param name="lap"></param>
        /// <param name="matrix">Matrix to copy</param>
        /// <returns></returns>
        public static IMatrix CreateMatrix(this ILinearAlgebraProvider lap, FloatMatrix matrix)
        {
            var ret = lap.CreateMatrix(matrix.RowCount, matrix.ColumnCount, false);

            ret.Data = matrix;
            return(ret);
            //return lap.CreateMatrix(matrix.RowCount, matrix.ColumnCount, (i, j) => matrix.Row[i].Data[j]);
        }
Exemple #8
0
 public float[] Predict(IReadOnlyList <IReadOnlyList <float> > input)
 {
     using var feature = _lap.CreateMatrix(input.Count, input[0].Count + 1,
                                           (i, j) => j == 0 ? 1 : input[i][j - 1]);
     using var h0 = feature.Multiply(_theta);
     using var h1 = h0.Column(0);
     using var h  = h1.Sigmoid();
     using var h2 = h.AsIndexable();
     return(h2.ToArray());
 }
Exemple #9
0
        public IMiniBatch Get(IExecutionContext executionContext, IReadOnlyList <int> rows)
        {
            var data      = rows.Select(i => _data[i]).ToList();
            var input     = _lap.CreateMatrix(data.Count, InputSize, (x, y) => data[x].Data[y]);
            var inputList = new List <IGraphData> {
                new MatrixGraphData(input)
            };

            return(new MiniBatch(rows, this, inputList, null));
        }
        public RandomProjection(ILinearAlgebraProvider lap, int fixedSize, int reducedSize, int s = 3)
        {
            _lap         = lap;
            _fixedSize   = fixedSize;
            _reducedSize = reducedSize;

            var c1           = Math.Sqrt(3);
            var distribution = new Categorical(new[] { 1.0 / (2 * s), 1 - (1.0 / s), 1.0 / (2 * s) });

            _matrix = _lap.CreateMatrix(fixedSize, reducedSize, (i, j) => Convert.ToSingle((distribution.Sample() - 1) * c1));
        }
        public LogisticRegressionTrainer(ILinearAlgebraProvider lap, IDataTable table)
        {
            _lap = lap;
            var numRows          = table.RowCount;
            var classColumnIndex = table.TargetColumnIndex;
            int numCols          = table.ColumnCount;
            var featureColumns   = Enumerable.Range(0, numCols).Where(c => c != classColumnIndex).ToList();
            var data             = table.GetNumericColumns(featureColumns);

            _feature = lap.CreateMatrix(numRows, numCols, (i, j) => j == 0 ? 1 : data[j - 1][i]);
            _target  = lap.CreateVector(table.GetColumn <float>(classColumnIndex));
        }
Exemple #12
0
        public Convolutional(ILinearAlgebraProvider lap, ConvolutionalNetwork.Layer layer)
        {
            _lap          = lap;
            _padding      = layer.Padding;
            _filterWidth  = layer.FilterWidth;
            _filterHeight = layer.FilterHeight;
            _stride       = layer.Stride;

            var activation = lap.NN.GetActivation(layer.Data.Activation);

            _layer = new StandardFeedForward(lap.CreateMatrix(layer.Data.Weight), lap.CreateVector(layer.Data.Bias), activation);
        }
        public void TensorCreateFromMatrix()
        {
            const int DEPTH = 3, ROWS = 4, COLUMNS = 4;
            var       cpuTensor  = _cpu.Create3DTensor(Enumerable.Range(0, DEPTH).Select(i => _cpu.CreateMatrix(ROWS, COLUMNS, (j, k) => (i + 1) * (j + 1) * (k + 1))).ToList());
            var       cpuMatrix  = cpuTensor.ConvertToMatrix();
            var       cpuTensor2 = cpuMatrix.ConvertTo3DTensor(ROWS, COLUMNS);

            FloatingPointHelper.AssertEqual(cpuTensor.AsIndexable(), cpuTensor2.AsIndexable());

            using (var gpuMatrix = _cuda.CreateMatrix(cpuMatrix.AsIndexable()))
                using (var gpuTensor2 = gpuMatrix.ConvertTo3DTensor(ROWS, COLUMNS)) {
                    FloatingPointHelper.AssertEqual(cpuTensor.AsIndexable(), gpuTensor2.AsIndexable());
                }
        }
Exemple #14
0
        public void MatrixVectorMultiply()
        {
            var a = _cpu.CreateMatrix(256, 256, (x, y) => x * y).AsIndexable();
            var b = _cpu.CreateVector(256, i => i * 0.5f).AsIndexable();
            var c = a.Multiply(b).AsIndexable();

            IIndexableMatrix gpuResults;

            using (var gpuA = _cuda.CreateMatrix(a))
                using (var gpuB = _cuda.CreateVector(b))
                    using (var gpuC = gpuA.Multiply(gpuB)) {
                        gpuResults = gpuC.AsIndexable();
                    }
            FloatingPointHelper.AssertEqual(c, gpuResults);
        }
Exemple #15
0
        I4DTensor _FormIntoTensor(ILinearAlgebraProvider lap, IVector vector, I4DTensor tensor)
        {
            var indexableVector = vector.AsIndexable();
            var tensorList      = new List <I3DTensor>();

            for (var i = 0; i < tensor.Count; i++)
            {
                var matrixList = new List <IMatrix>();
                for (var j = 0; j < tensor.Depth; j++)
                {
                    matrixList.Add(lap.CreateMatrix(tensor.RowCount, tensor.ColumnCount, indexableVector[j]));
                }
                tensorList.Add(lap.Create3DTensor(matrixList));
            }
            return(lap.Create4DTensor(tensorList));
        }
Exemple #16
0
        public override void ExecuteForward(IContext context)
        {
            var rowList    = context.BatchSequence.MiniBatch.Rows.Select(i => _data[i]).ToList();
            var resultList = new List <Dictionary <int, float> >();

            foreach (var row in rowList)
            {
                var value = _classifier.Classify(row)
                            .Select(c => (_targetLabel[c.Label], c.Weight))
                            .ToDictionary(d => d.Item1, d => d.Item2)
                ;
                resultList.Add(value);
            }
            var output = _lap.CreateMatrix(resultList.Count, _targetLabel.Count, (i, j) => resultList[i].TryGetValue(j, out float temp) ? temp : 0f);

            _AddNextGraphAction(context, new MatrixGraphData(output), null);
        }
Exemple #17
0
        public IMiniBatch Get(IExecutionContext executionContext, IReadOnlyList <int> rows)
        {
            var data  = rows.Select(i => _data[i]).ToList();
            var input = _lap.CreateMatrix(InputSize, data.Count, (i, j) => {
                var tensor = _data[j];
                var rem    = i % _matrixSize;
                var z      = i / _matrixSize;
                var x      = rem % _rows;
                var y      = rem / _rows;
                return(tensor.Matrix[z].Row[x].Data[y]);
            });

            var inputList = new List <IGraphData> {
                new Tensor4DGraphData(input, _rows, _columns, _depth)
            };

            return(new MiniBatch(rows, this, inputList, null));
        }
Exemple #18
0
        public IMiniBatch Get(IExecutionContext executionContext, IReadOnlyList <int> rows)
        {
            var data = rows.Select(i => _data[i]).ToList();

            var inputData = new Dictionary <int, List <FloatVector> >();

            foreach (var item in data)
            {
                var input = item;
                for (int i = 0, len = input.RowCount; i < len; i++)
                {
                    if (!inputData.TryGetValue(i, out List <FloatVector> temp))
                    {
                        inputData.Add(i, temp = new List <FloatVector>());
                    }
                    temp.Add(input.Row[i]);
                }
            }

            var miniBatch = new MiniBatch(rows, this);

            foreach (var item in inputData.OrderBy(kv => kv.Key))
            {
                var input = _lap.CreateMatrix(item.Value);
                var type  = (item.Key == 0)
                    ? MiniBatchSequenceType.SequenceStart
                    : item.Key == (inputData.Count - 1)
                        ? MiniBatchSequenceType.SequenceEnd
                        : MiniBatchSequenceType.Standard
                ;
                var inputList = new List <IGraphData> {
                    new MatrixGraphData(input)
                };
                miniBatch.Add(type, inputList, null);
            }
            return(miniBatch);
        }
Exemple #19
0
 public IMatrix CreateWeight(int rows, int columns)
 {
     return(_lap.CreateMatrix(rows, columns, _weightValue));
 }
        public IReadOnlyList <IReadOnlyList <IVector> > Cluster(IReadOnlyList <IVector> data, int numIterations, float errorThreshold = 0.001f)
        {
            if (data.Count == 0)
            {
                return(new List <IVector[]>());
            }

            // create the main matrix
            var data2 = new List <IIndexableVector>();

            foreach (var item in data)
            {
                data2.Add(item.AsIndexable());
            }
            using (var v = _lap.CreateMatrix(data.Count, data.First().Count, (x, y) => data2[x][y])) {
                data2.ForEach(d => d.Dispose());

                // create the weights and features
                var rand     = new Random();
                var weights  = _lap.CreateMatrix(v.RowCount, _numClusters, (x, y) => Convert.ToSingle(rand.NextDouble()));
                var features = _lap.CreateMatrix(_numClusters, v.ColumnCount, (x, y) => Convert.ToSingle(rand.NextDouble()));

                // iterate
                //float lastCost = 0;
                for (int i = 0; i < numIterations; i++)
                {
                    using (var wh = weights.Multiply(features)) {
                        var cost = _DifferenceCost(v, wh);
                        //if (i % (numIterations / 10) == 0)
                        //    Console.WriteLine("NNMF cost: " + cost);
                        if (cost <= errorThreshold)
                        {
                            break;
                        }
                        //lastCost = cost;

                        using (var wT = weights.Transpose())
                            using (var hn = wT.Multiply(v))
                                using (var wTw = wT.Multiply(weights))
                                    using (var hd = wTw.Multiply(features))
                                        using (var fhn = features.PointwiseMultiply(hn)) {
                                            features.Dispose();
                                            features = fhn.PointwiseDivide(hd);
                                        }

                        using (var fT = features.Transpose())
                            using (var wn = v.Multiply(fT))
                                using (var wf = weights.Multiply(features))
                                    using (var wd = wf.Multiply(fT))
                                        using (var wwn = weights.PointwiseMultiply(wn)) {
                                            weights.Dispose();
                                            weights = wwn.PointwiseDivide(wd);
                                        }
                    }
                }

                // weights gives cluster membership
                var documentClusters = weights.AsIndexable().Rows.Select((c, i) => Tuple.Create(i, c.MaximumIndex())).ToList();
                weights.Dispose();
                features.Dispose();
                return(documentClusters.GroupBy(d => d.Item2).Select(g => g.Select(d => data[d.Item1]).ToArray()).ToList());
            }
        }
Exemple #21
0
 public IMatrix CreateWeight(int rows, int columns)
 {
     return(_lap.CreateMatrix(rows, columns, (x, y) => _GetWeight(rows, columns, x, y)));
 }
Exemple #22
0
 /// <summary>
 /// Create a diagonal matrix
 /// </summary>
 /// <param name="lap"></param>
 /// <param name="values">List of diagonal values</param>
 /// <returns></returns>
 public static IMatrix CreateDiagonalMatrix(this ILinearAlgebraProvider lap, IReadOnlyList <float> values)
 {
     return(lap.CreateMatrix(values.Count, values.Count, (x, y) => x == y ? values[x] : 0f));
 }
Exemple #23
0
 /// <summary>
 /// Create a matrix
 /// </summary>
 /// <param name="lap"></param>
 /// <param name="matrix">Indexable matrix to copy</param>
 /// <returns></returns>
 public static IMatrix CreateMatrix(this ILinearAlgebraProvider lap, IIndexableMatrix matrix)
 {
     return(lap.CreateMatrix(matrix.RowCount, matrix.ColumnCount, (i, j) => matrix[i, j]));
 }
Exemple #24
0
 /// <summary>
 /// Create an identity matrix
 /// </summary>
 /// <param name="lap"></param>
 /// <param name="size">Width and height of the new matrix</param>
 /// <returns></returns>
 public static IMatrix CreateIdentityMatrix(this ILinearAlgebraProvider lap, int size)
 {
     return(lap.CreateMatrix(size, size, (x, y) => x == y ? 1f : 0f));
 }
Exemple #25
0
 public IMatrix CreateMatrix(IReadOnlyList <FloatArray> data)
 {
     return(Create((IIndexableMatrix)_numerics.CreateMatrix(data)));
 }
        void _MatrixMultiplication(int rowsA, int columnsArowsB, int columnsB)
        {
            var rand       = new Random(1);
            var a          = _cpu.CreateMatrix(rowsA, columnsArowsB, (j, k) => Convert.ToSingle(rand.NextDouble())).AsIndexable();
            var b          = _cpu.CreateMatrix(columnsArowsB, columnsB, (j, k) => Convert.ToSingle(rand.NextDouble())).AsIndexable();
            var cpuResults = a.Multiply(b);
            IIndexableMatrix gpuResults;

            using (var gpuA = _cuda.CreateMatrix(a))
                using (var gpuB = _cuda.CreateMatrix(b))
                    using (var gpuC = gpuA.Multiply(gpuB))
                        gpuResults = gpuC.AsIndexable();

            FloatingPointHelper.AssertEqual(gpuResults, cpuResults.AsIndexable());
        }
 public void TensorConvertToVector()
 {
     using (var cpuTensor = _cpu.Create3DTensor(Enumerable.Range(0, 3).Select(i => _cpu.CreateMatrix(4, 4, (j, k) => (i + 1) * (j + 1) * (k + 1))).ToList()))
         using (var gpuTensor = _cuda.Create3DTensor(cpuTensor.AsIndexable()))
             using (var cpuVector = cpuTensor.ConvertToVector())
                 using (var gpuVector = gpuTensor.ConvertToVector())
                     FloatingPointHelper.AssertEqual(cpuVector.AsIndexable(), gpuVector.AsIndexable());
 }
Exemple #28
0
        public void TestInputSquared()
        {
            var forwardInput   = _cpu.CreateMatrix(SIZE, SIZE, _DefaultInit).AsIndexable();
            var expectedOutput =
                _cpu.CreateMatrix(SIZE, SIZE, (i, j) => (float)Math.Pow(forwardInput[i, j], 2));
            var backwardInput    = _cpu.CreateMatrix(SIZE, SIZE, _DefaultInit).AsIndexable();
            var expectedBpOutput = _cpu.CreateMatrix(SIZE, SIZE,
                                                     (i, j) => backwardInput[i, j] * 2f * forwardInput[i, j]);

            _TestNode(_factory.GraphOperation.InputSquared(), forwardInput, expectedOutput, backwardInput,
                      expectedBpOutput);
        }
Exemple #29
0
 public IMatrix CreateWeight(int rows, int columns)
 {
     return(_lap.CreateMatrix(rows, columns, (x, y) => x == y ? _value : 0f));
 }
Exemple #30
0
 /// <summary>
 /// Creates a matrix with every value initialised to zero
 /// </summary>
 /// <param name="lap"></param>
 /// <param name="rows">Number of rows</param>
 /// <param name="columns">Numer of columns</param>
 public static IMatrix CreateZeroMatrix(this ILinearAlgebraProvider lap, int rows, int columns) => lap.CreateMatrix(rows, columns, true);