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); } } } }
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); } } } }
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); }
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); }
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); }