public override void Backward(Tensor outputgrad) { uint?pad = null; if (Padding == PaddingType.Same) { pad = 1; } else if (Padding == PaddingType.Full) { pad = 2; } var dout_flat = outputgrad.Transpose(3, 0, 1, 2).Reshape(Filters, -1); var dW = Dot(dout_flat, xCols.Transpose()); dW = dW.Reshape(Params["w"].Data.Shape); var db = Sum(outputgrad, 0, 2, 3).Reshape(Filters, -1); var W_flat = Params["w"].Data.Reshape(Filters, -1); var dX_col = Dot(W_flat.Transpose(), dout_flat); Input.Grad = ImgUtil.Col2Im(dX_col, Input.Data.Shape, KernalSize, pad, Strides); Params["w"].Grad = dW; if (UseBias) { Params["b"].Grad = db; } }
public override void Backward(Tensor outputgrad) { Tensor dX_col = new Tensor(xCols.Allocator, xCols.ElementType, xCols.Shape); var(n, c, d, h, w) = Input.Data.GetConv3DShape(); Fill(dX_col, 0); uint?pad = null; if (Padding == PaddingType.Same) { pad = 1; } else if (Padding == PaddingType.Full) { pad = 2; } var dout_flat = outputgrad.Transpose(2, 3, 4, 0, 1).Reshape(1, -1); var dX = ImgUtil.Col2Im(dout_flat, Input.Data.Shape, PoolSize, pad, Strides); Input.Grad = dX.Reshape(n, c, d, h, w); }
public Tensor Col2Im(Tensor cols, long[] x_shape, Tuple <int, int> kernalSize, int padding = 1, int stride = 1) { return(Out(ImgUtil.Col2Im(In(cols), x_shape, Tuple.Create <uint, uint>((uint)kernalSize.Item1, (uint)kernalSize.Item2), padding, (uint)stride))); }