anchor.diff:      member p.forwardDiff(derivative:Tensor) = p.value <- p.value.forwardDiff(derivative)
       member p.reverseDiff() = p.value <- p.value.reverseDiff()
       member p.noDiff() = p.value <- p.value.noDiff()
  -    override p.ToString() = sprintf "Parameter(shape: %A)" p.value.shape
  +    override p.ToString() = sprintf "Parameter(shape: %A, value: %A)" p.value.shape p.value
   
   type ParameterDict() =
       member val values:Dictionary<string, Parameter> = Dictionary()
  
positive.code:     let kernelSize = kernelSize |> Array.ofSeq
      let bias = defaultArg bias true
      let k = 1./ sqrt (float (inChannels*kernelSize.[0]*kernelSize.[1]))
      let w = Parameter <| -k + dsharp.rand([outChannels; inChannels; kernelSize.[0]; kernelSize.[1]]) * 2*k
      let b = Parameter <| if bias then -k + dsharp.rand(outChannels) * 2*k else dsharp.zero()
      do base.add(["weight", w; "bias", b])
      override c.forward(value) =
          let f = dsharp.conv2d(value, w.value, ?stride=stride, ?strides=strides, ?padding=padding, ?paddings=paddings, ?dilation=dilation, ?dilations=dilations)
  
negative.code:                 m.Parameters.add(n, p)
              | :? Model as mm ->
                  m.SubModels.Add(n, mm)
                  m.Parameters.add(mm.Parameters.map(fun (nn, pp:Parameter) -> (n + "__" + nn, pp)))
              | _ -> failwithf "Unsupported type. Expecting a list<string * 'a> where 'a is Parameter or Model"
      member m.forwardDiff(derivatives:ParameterDict) = m.Parameters.forwarddiff(derivatives)
      member m.reverseDiff() = m.Parameters.reverseDiff()
  