Example #1
0
        public I4DTensor ReverseMaxPool(I4DTensor indices, int outputRows, int outputColumns, int filterWidth, int filterHeight, int xStride, int yStride)
        {
            Debug.Assert(IsValid);
            var indicesPtr = ((IHaveDeviceMemory)indices).Memory;
            var ret        = _cuda.TensorReverseMaxPool(_data, indicesPtr, _rows, _columns, _depth, _count, outputRows, outputColumns, filterWidth, filterHeight, xStride, yStride);

            return(new Gpu4DTensor(_cuda, outputRows, outputColumns, _depth, _count, ret, true));
        }
Example #2
0
        public I4DTensor ReverseMaxPool(I4DTensor indices, int outputRows, int outputColumns, int filterWidth, int filterHeight, int xStride, int yStride)
        {
            var ret = new List <IIndexable3DTensor>();

            for (var i = 0; i < Count; i++)
            {
                var result = GetTensorAt(i).ReverseMaxPool(indices.GetTensorAt(i), outputRows, outputColumns, filterWidth, filterHeight, xStride, yStride);
                ret.Add(result.AsIndexable());
            }
            return(new Cpu4DTensor(ret));
        }
Example #3
0
        public I3DTensor TransposeThisAndMultiply(I4DTensor tensor)
        {
            var other = (Gpu4DTensor)tensor;

#if DEBUG
            Debug.Assert(tensor.Count == Depth && IsValid && other.IsValid);
#endif
            var ptr = Memory.DevicePointer;
            var ptr2 = other.Memory.DevicePointer;
            int rowsA = _rows, columnsA = _columns, columnsB = other.Depth,
                rowsB = other.RowCount * other.ColumnCount, blockSize2 = columnsB * rowsB;
            float alpha = 1.0f, beta = 0.0f;
            var   output = new Gpu3DTensor(_cuda, _columns, columnsB, _depth,
                                           _cuda.Allocate(_columns * columnsB * _depth), true);
            var status = CudaBlasNativeMethods.cublasSgemmStridedBatched(_cuda.Blas.CublasHandle,
                                                                         Operation.Transpose, Operation.NonTranspose, columnsA, columnsB, rowsB, ref alpha, ptr,
                                                                         rowsA, _blockSize, ptr2, rowsB, blockSize2, ref beta, output.Memory.DevicePointer, columnsA,
                                                                         _columns * columnsB, _depth);
            if (status != CublasStatus.Success)
            {
                throw new CudaBlasException(status);
            }
            return(output);

            //var output = Enumerable.Range(0, _depth).Select(i => new GpuMatrix(_cuda, _columns, columnsB, _cuda.Allocate(_columns * columnsB), true)).ToList();

            //using (var aPtrs = new PtrToDeviceMemoryList(Enumerable.Range(0, _depth).Select(i => ptr + i * _blockSize * CudaProvider.FLOAT_SIZE).ToArray()))
            //using (var bPtrs = new PtrToDeviceMemoryList(Enumerable.Range(0, _depth).Select(i => ptr2 + i * blockSize2 * CudaProvider.FLOAT_SIZE).ToArray()))
            //using (var cPtrs = new PtrToDeviceMemoryList(output.Select(m => m.Memory.DevicePointer).ToArray())) {
            //	var status = CudaBlasNativeMethods.cublasSgemmBatched(_cuda.Blas.CublasHandle,
            //		Operation.Transpose,
            //		Operation.NonTranspose,
            //		columnsA,
            //		columnsB,
            //		rowsB,
            //		ref alpha,
            //		aPtrs.DevicePointer,
            //		rowsA,
            //		bPtrs.DevicePointer,
            //		rowsB,
            //		ref beta,
            //		cPtrs.DevicePointer,
            //		columnsA,
            //		_depth
            //	);
            //	if (status != CublasStatus.Success)
            //		throw new CudaBlasException(status);
            //}

            //return _cuda.Create3DTensor(output);
        }
Example #4
0
 public Backpropagation(MaxPool source, I4DTensor indices, int inputColumns, int inputRows, int outputColumns, int outputRows, int depth, int filterWidth, int filterHeight, int xStride, int yStride)
     : base(source)
 {
     _indices       = indices;
     _inputColumns  = inputColumns;
     _inputRows     = inputRows;
     _outputColumns = outputColumns;
     _outputRows    = outputRows;
     _depth         = depth;
     _filterWidth   = filterWidth;
     _filterHeight  = filterHeight;
     _xStride       = xStride;
     _yStride       = yStride;
 }
Example #5
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));
        }
Example #6
0
 public Tensor4DGraphData(I4DTensor tensor) : this(tensor.ReshapeAsMatrix(), tensor.RowCount,
                                                   tensor.ColumnCount, tensor.Depth)
 {
 }
Example #7
0
 public Tensor4DGraphData(I4DTensor tensor) :
     this(tensor.ConvertToMatrix(), tensor.RowCount, tensor.ColumnCount, tensor.Depth)
 {
 }
Example #8
0
 public Backpropagation(TransposeAndCombineSignal source, I4DTensor tensor) : base(source)
 {
     _tensor = tensor;
 }
Example #9
0
 /// <summary>
 /// Converts the 4D tensor to a generic IGraphData
 /// </summary>
 /// <param name="tensor">Tensor to convert</param>
 public static IGraphData AsGraphData(this I4DTensor tensor)
 {
     return(new Tensor4DGraphData(tensor));
 }