示例#1
0
        public void ProcessSubRegion(InternalArray ar, InternalArray[,] filters, InternalArray ret, int sx, int sy, int ww, int hout, int wout)
        {
            var hin = ar.Shape[1];
            var win = ar.Shape[2];

            var c = ar.Shape[0];


            int shiftx = padding[0] - kernelSize[0] / 2;
            int shifty = padding[1] - kernelSize[1] / 2;

            var maxw   = Math.Min(wout, (sy + 1) * ww);
            var maxh   = Math.Min(hout, (sx + 1) * ww);
            var starth = sx * ww;
            var startw = sy * ww;

            for (int i = starth; i < maxh; i++)
            {
                for (int j = startw; j < maxw; j++)
                {
                    for (int ch = 0; ch < outChannels; ch++)
                    {
                        double val = 0;
                        for (int zz = 0; zz < c; zz++)
                        {
                            var kernel = filters[ch, zz];

                            for (int i1 = 0; i1 < kernelSize[0]; i1++)
                            {
                                for (int j1 = 0; j1 < kernelSize[0]; j1++)
                                {
                                    //var x = i * stride[0] - kernelSize[0] / 2 + i1;
                                    //var y = j * stride[1] - kernelSize[1] / 2 + j1;

                                    //outspace
                                    var xout = (i) * stride[0] - kernelSize[0] / 2 + i1 * dilation[0];
                                    var yout = (j) * stride[1] - kernelSize[1] / 2 + j1 * dilation[1];
                                    //inspace
                                    var xin = xout - shiftx;
                                    var yin = yout - shifty;
                                    if (!ar.WithIn(zz, xin, yin))
                                    {
                                        continue;
                                    }
                                    //var y=jmul+j1

                                    var ii1 = i1 * kernel.Shape[1] + j1;
                                    var ii2 = zz * ar.offsets[0] + xin * ar.offsets[1] + yin;
                                    val += kernel.Get2D(i1, j1) * ar.Get3D(zz, xin, yin);
                                    var ii3 = j + ch * ret.offsets[0] + i * ret.offsets[1];
                                }
                            }
                        }
                        ret.Set3D(ch, i, j, val);
                    }
                }
            }
        }
示例#2
0
        public void ProcessSubRegionOptimized(InternalArray ar, InternalArray[,] filters, InternalArray ret, int sx, int sy, int ww, int hout, int wout)
        {
            var hin = ar.Shape[1];
            var win = ar.Shape[2];

            var c = ar.Shape[0];


            int shiftx = padding[0] - kernelSize[0] / 2;
            int shifty = padding[1] - kernelSize[1] / 2;

            var maxw   = Math.Min(wout, (sy + 1) * ww);
            var maxh   = Math.Min(hout, (sx + 1) * ww);
            var starth = sx * ww;
            var startw = sy * ww;

            for (int i = starth; i < maxh; i++)
            {
                var imul  = (i) * stride[0] - kernelSize[0] / 2 - shiftx;
                var maxi1 = Math.Min((ar.Shape[1] - imul) / dilation[0], kernelSize[0]);
                var mini1 = Math.Max((int)Math.Ceiling(-(double)imul / dilation[0]), 0);

                for (int j = startw; j < maxw; j++)
                {
                    var jmul  = (j) * stride[1] - kernelSize[1] / 2 - shifty;
                    var minj1 = Math.Max((int)Math.Ceiling(-(double)jmul / dilation[1]), 0);
                    var maxj1 = Math.Min((ar.Shape[2] - jmul) / dilation[1], kernelSize[1]);

                    for (int ch = 0; ch < outChannels; ch++)
                    {
                        double val = 0;

                        for (int zz = 0; zz < c; zz++)
                        {
                            var kernel  = filters[ch, zz];
                            var offset1 = zz * ar.offsets[0];
                            int kindex  = 0;

                            for (int i1 = mini1; i1 < maxi1; i1++)
                            {
                                var x = imul + i1 * dilation[0];

                                for (int j1 = minj1; j1 < maxj1; j1++)
                                {
                                    var y     = jmul + j1 * dilation[1];
                                    var index = offset1 + x * ar.offsets[1] + y;
                                    val += kernel.Data[kindex] * ar.Data[index];
                                    kindex++;
                                }
                            }
                        }
                        ret.Set3D(ch, i, j, val);
                    }
                }
            }
        }
示例#3
0
        internal InternalArray Transpose(int[] v)
        {
            //3d only!
            InternalArray ret = new InternalArray(v.Select(z => Shape[z]).ToArray());

            for (int i = 0; i < Shape[0]; i++)
            {
                for (int j = 0; j < Shape[1]; j++)
                {
                    for (int k = 0; k < Shape[2]; k++)
                    {
                        var val = Get3D(i, j, k);
                        var ar1 = new int[] { i, j, k };
                        ret.Set3D(ar1[v[0]], ar1[v[1]], ar1[v[2]], val);
                    }
                }
            }

            return(ret);
        }
示例#4
0
        public InternalArray ProcessImage(InternalArray ar)
        {
            //CalcRegionsHashes(ar);

            indexes1.Clear();
            indexes2.Clear();
            indexes3.Clear();

            var hin = ar.Shape[1];
            var win = ar.Shape[2];

            var c = ar.Shape[0];

            var hout = ((hin + 2 * padding[0] - dilation[0] * (kernelSize[0] - 1) - 1) / stride[0]) + 1;
            var wout = ((win + 2 * padding[1] - dilation[1] * (kernelSize[1] - 1) - 1) / stride[1]) + 1;

            InternalArray ret = new InternalArray(new int[] { outChannels, hout, wout });

            InternalArray[,] filters = new InternalArray[outChannels, c];

            for (int ch = 0; ch < outChannels; ch++)
            {
                for (int zz = 0; zz < c; zz++)
                {
                    var kernel = Weight.Get2DImageFrom4DArray(ch, zz);
                    filters[ch, zz] = kernel;
                }
            }

            int shiftx = padding[0] - kernelSize[0] / 2;
            int shifty = padding[1] - kernelSize[1] / 2;

            for (int i = 0; i < hout; i++)
            {
                for (int j = 0; j < wout; j++)
                {
                    for (int ch = 0; ch < outChannels; ch++)
                    {
                        double val = 0;
                        for (int zz = 0; zz < c; zz++)
                        {
                            var kernel = filters[ch, zz];

                            for (int i1 = 0; i1 < kernelSize[0]; i1++)
                            {
                                for (int j1 = 0; j1 < kernelSize[0]; j1++)
                                {
                                    //var x = i * stride[0] - kernelSize[0] / 2 + i1;
                                    //var y = j * stride[1] - kernelSize[1] / 2 + j1;

                                    //outspace
                                    var xout = (i) * stride[0] - kernelSize[0] / 2 + i1 * dilation[0];
                                    var yout = (j) * stride[1] - kernelSize[1] / 2 + j1 * dilation[1];
                                    //inspace
                                    var xin = xout - shiftx;
                                    var yin = yout - shifty;
                                    if (!ar.WithIn(zz, xin, yin))
                                    {
                                        continue;
                                    }
                                    //var y=jmul+j1

                                    var ii1 = i1 * kernel.Shape[1] + j1;
                                    var ii2 = zz * ar.offsets[0] + xin * ar.offsets[1] + yin;
                                    val += kernel.Get2D(i1, j1) * ar.Get3D(zz, xin, yin);
                                    var ii3 = j + ch * ret.offsets[0] + i * ret.offsets[1];
                                    //if (i == 0)
                                    {
                                        /*indexes1.Add(ii1);
                                        *  indexes2.Add(ii2);
                                        *  indexes3.Add(ii3);*/
                                    }
                                }
                            }
                        }
                        ret.Set3D(ch, i, j, val);
                    }
                }
            }

            return(ret);
        }
示例#5
0
        public InternalArray ProcessImageOptimized2(InternalArray ar, int hout, int wout, int c, int hin, int win)
        {
            InternalArray ret = new InternalArray(new int[] { outChannels, hout, wout });

            InternalArray[,] filters = new InternalArray[outChannels, c];

            int pos0 = 0;

            for (int ch = 0; ch < outChannels; ch++)
            {
                for (int zz = 0; zz < c; zz++)
                {
                    var kernel  = Weight.GetNext2dImageFrom4dArray(ref pos0);
                    var kernel2 = Weight.Get2DImageFrom4DArray(ch, zz);
                    filters[ch, zz] = kernel;
                }
            }

            int shiftx = padding[0] - kernelSize[0] / 2;
            int shifty = padding[1] - kernelSize[1] / 2;

            Parallel.For(0, hout, (i) =>
            {
                var imul  = (i) * stride[0] - kernelSize[0] / 2 - shiftx;
                var maxi1 = Math.Min((ar.Shape[1] - imul) / dilation[0], kernelSize[0]);
                var mini1 = Math.Max((int)Math.Ceiling(-(double)imul / dilation[0]), 0);
                Parallel.For(0, wout, (j) =>
                {
                    var jmul  = (j) * stride[1] - kernelSize[1] / 2 - shifty;
                    var minj1 = Math.Max((int)Math.Ceiling(-(double)jmul / dilation[1]), 0);
                    var maxj1 = Math.Min((ar.Shape[2] - jmul) / dilation[1], kernelSize[1]);

                    for (int ch = 0; ch < outChannels; ch++)
                    {
                        double val = 0;

                        for (int zz = 0; zz < c; zz++)
                        {
                            var kernel  = filters[ch, zz];
                            var offset1 = zz * ar.offsets[0];
                            int kindex  = 0;

                            for (int i1 = mini1; i1 < maxi1; i1++)
                            {
                                var x = imul + i1 * dilation[0];

                                for (int j1 = minj1; j1 < maxj1; j1++)
                                {
                                    var y     = jmul + j1 * dilation[1];
                                    var index = offset1 + x * ar.offsets[1] + y;



                                    val += kernel.Data[kindex] * ar.Data[index];
                                    kindex++;
                                }
                            }
                        }
                        ret.Set3D(ch, i, j, val);
                    }
                });
            });
            //for (int i = 0; i < hout; i++)
            {
            }

            return(ret);
        }