Пример #1
0
        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;
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
 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)));
 }