public override InternalArray Forward(InternalArray ar) { if (ar.QIntData != null) { ar.Data = new float[ar.QIntData.Length]; for (int i = 0; i < ar.QIntData.Length; i++) { ar.Data[i] = ar.QIntData[i] / 256f; } ar.QIntData = null; } InternalArray ret = new InternalArray(new int[] { 1, Weight.Shape[0] }); for (int j = 0; j < Weight.Shape[0]; j++) { float acc = 0; for (int i = 0; i < Weight.Shape[1]; i++) { acc += Weight.Get2D(j, i) * ar.Data[i]; } ret.Data[j] = acc; if (Bias != null) { ret.Data[j] += Bias.Data[j]; } } return(ret); }
public InternalArray Process2DImage(InternalArray ar) { var hin = ar.Shape[0]; var win = ar.Shape[1]; var hout = ((hin + 2 * padding[0] - kernelSize[0]) / stride[0]) + 1; var wout = ((win + 2 * padding[1] - kernelSize[1]) / stride[1]) + 1; InternalArray ret = new InternalArray(new int[] { hout, wout }); for (int i = 0; i < hout; i++) { for (int j = 0; j < wout; j++) { float avg = 0; for (int i1 = 0; i1 < kernelSize[0]; i1++) { for (int j1 = 0; j1 < kernelSize[1]; j1++) { var x = i * stride[0] + i1 - kernelSize[0] / 2; var y = j * stride[1] + j1 - kernelSize[1] / 2; if (ar.WithIn(x, y)) { avg += ar.Get2D(x, y); } } } avg /= kernelSize[0] * kernelSize[1]; ret.Set2D(i, j, avg); } } return(ret); }
public InternalArray Process2DImage(InternalArray ar) { var hin = ar.Shape[0]; var win = ar.Shape[1]; var hout = ((hin + 2 * padding[0] - kernelSize[0]) / stride[0]) + 1; var wout = ((win + 2 * padding[1] - kernelSize[1]) / stride[1]) + 1; InternalArray ret = new InternalArray(new int[] { hout, wout }); if (ar.QIntData != null) { ret.QIntData = new short[ret.Data.Length]; ret.Data = null; for (int i = 0; i < hout; i++) { for (int j = 0; j < wout; j++) { short max = 0; bool was = false; for (int i1 = 0; i1 < kernelSize[0]; i1++) { for (int j1 = 0; j1 < kernelSize[1]; j1++) { var x = i * stride[0] + i1; var y = j * stride[1] + j1; if (ar.WithIn(x, y)) { if (!was) { was = true; max = ar.Get2DQuant(x, y); } max = Math.Max(max, ar.Get2DQuant(x, y)); } } } //avg /= kernelSize[0] * kernelSize[1]; ret.Set2DQuant(i, j, max); } } } else { for (int i = 0; i < hout; i++) { for (int j = 0; j < wout; j++) { float max = 0; bool was = false; for (int i1 = 0; i1 < kernelSize[0]; i1++) { for (int j1 = 0; j1 < kernelSize[1]; j1++) { var x = i * stride[0] + i1; var y = j * stride[1] + j1; if (ar.WithIn(x, y)) { if (!was) { was = true; max = ar.Get2D(x, y); } max = Math.Max(max, ar.Get2D(x, y)); } } } //avg /= kernelSize[0] * kernelSize[1]; ret.Set2D(i, j, max); } } } return(ret); }