public override void ExecuteForward(IContext context) { var input = context.Data; var tensor = input.GetMatrix().ReshapeAs4DTensor(input.Rows, input.Columns, input.Depth); var inputWidth = tensor.ColumnCount; var inputHeight = tensor.RowCount; var newWidth = ((inputWidth - _filterWidth + (2 * _padding)) / _xStride) + 1; var newHeight = ((inputHeight - _filterHeight + (2 * _padding)) / _yStride) + 1; if (_padding > 0) { tensor = tensor.AddPadding(_padding); } var im2Col = tensor.Im2Col(_filterWidth, _filterHeight, _xStride, _yStride); var outputSignal = im2Col.Multiply(_filter); outputSignal.AddToEachRow(_bias); var outputTensor = outputSignal.ReshapeAs4DTensor(newHeight, newWidth); Debug.Assert(outputTensor.Depth == FilterCount && outputTensor.Count == tensor.Count); var graphData = new Tensor4DGraphData(outputTensor); _AddNextGraphAction(context, graphData, () => new Backpropagation(this, im2Col, inputWidth, inputHeight, tensor.Depth, tensor.Count, newWidth, newHeight)); }
public override void ExecuteForward(IContext context) { var input = context.Data; var lap = context.LinearAlgebraProvider; var tensor = input.GetMatrix().ConvertTo4DTensor(input.Rows, input.Columns, input.Depth); var inputWidth = tensor.ColumnCount; var inputHeight = tensor.RowCount; var newWidth = ((inputWidth - _filterWidth + (2 * _padding)) / _stride) + 1; var newHeight = ((inputHeight - _filterHeight + (2 * _padding)) / _stride) + 1; if (_padding > 0) { tensor = tensor.AddPadding(_padding); } var im2Col = tensor.Im2Col(_filterWidth, _filterHeight, _stride); var outputSignal = im2Col.Multiply(_filter); outputSignal.AddToEachRow(_bias); var outputTensor = outputSignal.ConvertTo4DTensor(newHeight, newWidth); var graphData = new Tensor4DGraphData(outputTensor); _AddNextGraphAction(context, graphData, () => new Backpropagation(this, im2Col, inputWidth, inputHeight, newWidth, newHeight)); }
public override void ExecuteForward(IContext context) { var input = context.Data; var tensor = input.GetMatrix().ReshapeAs4DTensor(input.Rows, input.Columns, input.Depth); var(output, index) = tensor.MaxPool(_filterWidth, _filterHeight, _xStride, _yStride, true); //#if DEBUG // Debug.Assert(output.ReshapeAsVector().IsEntirelyFinite()); // Debug.Assert(index.ReshapeAsVector().IsEntirelyFinite()); //#endif var graphData = new Tensor4DGraphData(output); _AddNextGraphAction(context, graphData, () => new Backpropagation(this, index, tensor.ColumnCount, tensor.RowCount, output.ColumnCount, output.RowCount, output.Depth, _filterWidth, _filterHeight, _xStride, _yStride)); }
public override IMiniBatch Get(IExecutionContext executionContext, IReadOnlyList <int> rows) { var data = _GetRows(rows) .Select(r => (_dataColumnIndex.Select(i => ((FloatTensor)r.Data[i]).GetAsRaw()).ToList(), ((FloatVector)r.Data[_dataTargetIndex]).Data)) .ToList() ; var inputList = new List <IGraphData>(); for (var i = 0; i < _dataColumnIndex.Length; i++) { var i1 = i; var input = _lap.CreateMatrix(InputSize, data.Count, (x, y) => data[y].Item1[i1][x]); var tensor = new Tensor4DGraphData(input, Height, Width, Depth); inputList.Add(tensor); } var output = OutputSize > 0 ? _lap.CreateMatrix(data.Count, OutputSize, (x, y) => data[x].Item2[y]) : null; return(new MiniBatch(rows, this, inputList, new MatrixGraphData(output))); }