/// <summary>3次元ベクトル3次元逆畳み込み</summary>
        public static VariableNode TrivectorDeconvolution3D(VariableNode x, VariableNode w, int stride, bool gradmode = false, Shape outshape = null)
        {
            if (outshape == null)
            {
                int outwidth  = (x.Shape.Width - 1) * stride + w.Shape.Width;
                int outheight = (x.Shape.Height - 1) * stride + w.Shape.Height;
                int outdepth  = (x.Shape.Depth - 1) * stride + w.Shape.Depth;

                outshape = Shape.Map3D(w.Shape.InChannels / 4 * 3, outwidth, outheight, outdepth, x.Shape.Batch);
            }

            Function function =
                new Functions.TrivectorConvolution.TrivectorDeconvolution3D(outshape, w.Shape, stride, gradmode);

            VariableNode y = Apply(function, x, w)[0];

            return(y);
        }
        /// <summary>3次元ベクトル3次元逆畳み込み</summary>
        public static Tensor TrivectorDeconvolution3D(Tensor x, Tensor w, int stride, bool gradmode = false, Shape outshape = null)
        {
            if (outshape == null)
            {
                int outwidth  = (x.Shape.Width - 1) * stride + w.Shape.Width;
                int outheight = (x.Shape.Height - 1) * stride + w.Shape.Height;
                int outdepth  = (x.Shape.Depth - 1) * stride + w.Shape.Depth;

                outshape = Shape.Map3D(w.Shape.InChannels / 4 * 3, outwidth, outheight, outdepth, x.Shape.Batch);
            }

            Functions.TrivectorConvolution.TrivectorDeconvolution3D function =
                new Functions.TrivectorConvolution.TrivectorDeconvolution3D(outshape, w.Shape, stride, gradmode);

            Tensor y = new Tensor(function.OutShape);

            function.Execute(new Tensor[] { x, w }, new Tensor[] { y });

            return(y);
        }