[英]C# to F#: Creating and using a float[][] in F#
我在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成員。
您嘗試創建數組的方式new float[]
在F#中不是有效的語法。 數組的正確語法是[| 1; 2; 3 |]
[| 1; 2; 3 |]
[| 1; 2; 3 |]
,或者對於空數組,它只是[| |]
[| |]
。 不需要指定元素的類型,編譯器將從上下文中推斷出它。 但是如果你真的想要顯式,你仍然可以通過冒號指定類型,就像你可以使用任何表達式: [| |] : float[]
[| |] : 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
用->
。 這是你遇到的第二個問題。 你看, do
執行一個“動作”,它不一定會產生一個項目,例如:
let xs = [ for n in 1..10 do
if n > 5 then yield n ]
這將產生一個數字6
到10
的列表 - 而不是1
到10
- 因為它只在n > 5
時產生一個元素。 yield
關鍵字是產生元素的原因。 所以,如果你想生產代碼中的每一層的數組,你必須yield
該數組:
[| for layer in layers do yield Array.create layer 0.0 |]
這有效,但有一個捷徑:箭頭->
代表do yield
,所以你可以使用它。
[| for layer in layers -> Array.create layer 0.0 |]
最后 ,給你一個問題:你真的需要上課嗎? 課程非常狡猾,時間很長,所以除非你有充分的理由,否則我建議你去錄音。
很好的解釋,@ FyodorSoikin,但以下可能更好:
let newNeuralNetwork (layers : _ []) =
fun i -> Array.zeroCreate<float> layers.[i]
|> Array.init layers.Length
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.