public void Redraw( ) { var img = input.Get2DImageFrom4DArray(0, 0); Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); var gr = Graphics.FromImage(bmp); gr.Clear(Color.White); int ww = int.Parse(textBox1.Text); for (int i = 0; i < img.Shape[0]; i++) { for (int j = 0; j < img.Shape[1]; j++) { gr.DrawRectangle(Pens.Black, j * ww, i * ww, ww, ww); gr.DrawString(Math.Round(img.Get2D(i, j), 3) + "", new Font("Consolas", 10), Brushes.Black, j * ww, i * ww); } } pictureBox1.Image = bmp; MaxPool2d pool = new MaxPool2d(2, 2); var res = pool.Forward(input); var img2 = res.Get2DImageFrom4DArray(0, 0); Bitmap bmp2 = new Bitmap(pictureBox2.Width, pictureBox2.Height); var gr2 = Graphics.FromImage(bmp2); gr2.Clear(Color.White); for (int i = 0; i < img2.Shape[0]; i++) { for (int j = 0; j < img2.Shape[1]; j++) { gr2.DrawRectangle(Pens.Black, j * ww, i * ww, ww, ww); gr2.DrawString(Math.Round(img2.Get2D(i, j), 3) + "", new Font("Consolas", 10), Brushes.Black, j * ww, i * ww); } } pictureBox2.Image = bmp2; }
/// <summary> /// stride=1, kernel=1,padding=0 /// </summary> /// <param name="ar"></param> /// <param name="hout"></param> /// <param name="wout"></param> /// <param name="c"></param> /// <param name="hin"></param> /// <param name="win"></param> /// <returns></returns> public InternalArray ProcessImageOptimizedNoPaddingKernel1(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]; for (int ch = 0; ch < outChannels; ch++) { for (int zz = 0; zz < c; zz++) { var kernel = Weight.Get2DImageFrom4DArray(ch, zz); filters[ch, zz] = kernel; } } Parallel.For(0, hout, (i) => { for (int j = 0; j < wout; j++) { var index2 = i * ret.offsets[1] + j; for (int ch = 0; ch < outChannels; ch++) { float val = 0; var index = i * ar.offsets[1] + j; for (int zz = 0; zz < c; zz++) { var kernel = filters[ch, zz]; val += kernel.Data[0] * ar.Data[index]; index += ar.offsets[0]; } //ret.Data[ch * ret.offsets[0] + i * ret.offsets[1] + j] = val; ret.Data[index2] = val; index2 += ret.offsets[0]; } } }); return(ret); }