anchor.diff:                  let mutable bd = aa.conv2d(dd, paddings=paddings)
                   // bd <- bd.view([|1; inputChannels; kernelHeight; kernelWidth|])
                   bd <- bd.view([|1; inputChannels; bd.shape.[2]; bd.shape.[3]|])
  -                let cBounds = array2D [[0;0;1]; [0;inputChannels-1;1]; [0;kernelHeight-1;1]; [0;kernelWidth-1;1]]
  +                let cBounds = array2D [[0;0;0]; [0;inputChannels-1;0]; [0;kernelHeight-1;0]; [0;kernelWidth-1;0]]
                   bd <- bd.GetSlice(cBounds)
                   bd <- bd.view([|1; inputChannels; kernelHeight; kernelWidth|])
                   bderivative <- bderivative.addSlice([|k; 0; 0; 0|], bd)
  
positive.code:                 let mutable bd = aa.conv3d(dd, paddings=paddings)
                  // bd <- bd.view([|1; inputChannels; kernelHeight; kernelWidth|])
                  bd <- bd.view([|1; inputChannels; bd.shape.[2]; bd.shape.[3]; bd.shape.[4]|])
                  let cBounds = array2D [[0;0;1]; [0;inputChannels-1;1]; [0;kernelDepth-1;1]; [0;kernelHeight-1;1]; [0;kernelWidth-1;1]]
                  bd <- bd.GetSlice(cBounds)
                  bd <- bd.view([|1; inputChannels; kernelDepth; kernelHeight; kernelWidth|])
                  bderivative <- bderivative.addSlice([|k; 0; 0; 0; 0|], bd)                    
  
negative.code:     /// <param name="shape">The desired shape of returned tensor.</param>
      member a.view(shape:seq<int>) =
          let shape = shape |> Shape.create |> Shape.complete a.nelement  // Handles -1 semantics
          if a.shape = shape then a // Do nothing if the shapes are the same
          else
          Shape.checkCanView a.shape shape
          let inline fRaw(a:RawTensor) = a.ViewT(shape)
          let inline fTensor(a:Tensor) = a.view(shape)
  