Accord.Neuro 在 .NET 中:如何从网络中检索神经网络权重?

Accord.Neuro in .NET: how to retrieve the neural networks weigths from the network?

我正在努力让自己的头脑清醒过来 Accord.NET.Neuro。我需要一个 NN 库来解决强化学习问题。按照其中一个示例,我用 F# 编写了这一小段代码:

let inputs = [|  [|0.0;1.0|]  ;   [|1.0;1.0|]   |]
let inputdimension = inputs.[0] |> Array.length 
let outputs = [|  [|1.0|]  ;   [|0.0|]   |]
let outputdimension = outputs.[0] |>  Array.length 

let network =  Accord.Neuro.ActivationNetwork (
                SigmoidFunction (2.0) , // transfer function
                inputdimension,
                2 , // two neuron in first layer
                outputdimension ) // one neuron in second layer

let teacher = network |>  LevenbergMarquardtLearning 
teacher.RunEpoch(inputs,outputs)

如何从经过训练的网络对象中获取权重?据我所知,网络 没有 有任何权重 属性。此外,为了进行预测,有一个 Compute 方法;所以 - 在学习之后 - 做出预测 运行:

network.Compute( [|1.0;1.0|] )

例如对于给定的输入。我注意到,经过几个时期后,网络逐渐适应所需的目标(应该如此),但是 - 对于训练 - 一个只运行

teacher.RunEpoch(inputs,outputs)

好几次。显然这会影响网络实例:这怎么可能?

权重可通过层 属性 然后是神经元访问。

因此,对于给定的示例,

network.Layers

提供一个层数组 (Layer[]),其中每个元素给出每个隐藏层的信息(和数据)。在示例中,我们有输入、隐藏和输出:所以我们确定内部连接:输入到隐藏和隐藏到输出。

假设我们想知道从输入到隐藏层的权重:

network.Layers.[0] 

此行将 return 具有字段 Neuron 的层对象 (Accord.Neuro.Layer)。 研究这两个对象的接口是值得的,因为它们代表 Accord.Neuro 中的神经计算。 Neuro 报告特定计​​算单元的权重(及其阈值)。

因此,通过网络并获得权重和阈值的可能辅助函数是:

let getWeigths (n:ActivationNeuron ) =
    (n.Weights, n.Threshold)

let getNetworkParameters (network:ActivationNetwork) = 
    network.Layers
    |> Array.map ( fun layer -> layer.Neurons  
                                |> Array.map  (fun neuron -> 
                                                    neuron :?> ActivationNeuron 
                                                    |> getWeigths) )

我可能会添加一些其他的注释,我越过Accord.Neuro API。