【问题标题】:C# to F#: Creating and using a float[][] in F#C# 到 F#:在 F# 中创建和使用 float[][]
【发布时间】:2018-01-04 16:40:48
【问题描述】:

我有一个简单的 C# 神经网络方法:

  private void InitNeurons()
    {
        //Neuron Initilization
        List<float[]> neuronsList = new List<float[]>();

        for (int i = 0; i < _layers.Length; i++) //run through all layers
        {
            neuronsList.Add(new float[_layers[i]]); //add layer to neuron list
        }

        _neurons = neuronsList.ToArray(); //convert list to array
    }

如何在 F# 中执行此操作?我在想它可以更简单。也许是这样的?

namespace NeuralNetwork

type NeuralNetworkF(layers : int[]) = 
    member this.Layers = layers
    member this.Neurons : float[][] = [| for layer in layers do new float[]|]

这会导致 F# 中的编译器错误。我想获取 int 数组“_layers”的大小,并对每个值进行迭代并将该值添加到 F# 中的 Neurons 成员。

【问题讨论】:

    标签: c# arrays machine-learning f# neural-network


    【解决方案1】:

    很好的解释,@FyodorSoikin,但下面的解释可能更好:

    let newNeuralNetwork (layers : _ []) =
        fun i -> Array.zeroCreate<float> layers.[i]
        |> Array.init layers.Length
    

    【讨论】:

      【解决方案2】:

      您尝试创建数组 new float[] 的方式在 F# 中是无效的语法。数组的正确语法是[| 1; 2; 3 |],或者对于空数组,它只是[| |]。元素的类型不需要指定,编译器会从上下文中推断出来。但是如果您真的想要明确,您仍然可以通过冒号指定类型,就像您可以使用任何表达式一样:[| |] : float[]

      但是,无论如何,这对您来说毫无用处,因为您要做的不是创建一个包含已知元素的数组,而是创建一个已知长度的数组。为此,有一些功能,这里对您有用的是Array.create。它接受两个参数 - 大小和值 - 它返回一个该大小的数组,其中每个元素都是该值。

      type NeuralNetworkF(layers : int[]) = 
          member this.Layers = layers
          member this.Neurons : float[][] = [| for layer in layers -> Array.create layer 0.0 |]
      

      请注意,在上面的代码中,我还将do 替换为-&gt;。这是你遇到的第二个问题。你看,do 执行一个“动作”,不一定会产生一个项目,例如:

      let xs = [ for n in 1..10 do 
                   if n > 5 then yield n ]
      

      这将产生一个数字列表 610 - 而不是 110 - 因为它只在 n &gt; 5 时产生一个元素。 yield 关键字是产生元素的原因。所以,如果你想为代码中的每一层生成一个数组,你必须yield那个数组:

      [| for layer in layers do yield Array.create layer 0.0 |]
      

      这可行,但有一个捷径:箭头-&gt; 代表do yield,因此您可以使用它。

      [| for layer in layers -> Array.create layer 0.0 |]
      

      最后问你一个问题:你真的需要上课吗?课程是 wibly-wobbly-timey-wimey,所以除非你有充分的理由,否则我建议你去记录。

      【讨论】:

      • 感谢您的帮助。我可能不需要上课。我是 F# 和函数式编程的新手。我希望用 F# 编写神经网络会更容易理解,因为 c# 使它非常冗长。
      猜你喜欢
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多