public override Tensor GlobalAvgVariancePool2D(Tensor X) { var O = NewTensor(X.batch, 2, 1, X.channels); var fn = BestKernel(ComputeKernelLibrary.GlobalPool2D(X.shape, O.shape, "GlobalAvgVariancePool2D")); fn.SetTensor("X", X.shape, Pin(X).buffer); fn.SetTensor("O", O.shape, Pin(O).buffer); fn.Dispatch(); return(O); }
protected virtual Tensor GlobalPool2D(string smallKernelName, string globalKernelName, Tensor X) { // downsample with pyramid approach while (X.height * X.width >= 256) { var pool = new [] { 4, 4 }; var stride = pool; var noPad = new[] { 0, 0, 0, 0 }; var lastLength = X.length; X = Pool2D(smallKernelName, X, pool, stride, noPad); Assert.IsTrue(X.length < lastLength); } var O = NewTensor(X.batch, 1, 1, X.channels); var fn = BestKernel(ComputeKernelLibrary.GlobalPool2D(X.shape, O.shape, globalKernelName)); fn.SetTensor("X", X.shape, Pin(X).buffer); fn.SetTensor("O", O.shape, Pin(O).buffer); fn.Dispatch(); return(O); }