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



我正试图绕过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)

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

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

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

teacher.RunEpoch(inputs,outputs)

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

权重可以通过 layers 属性访问,然后通过神经元访问。

因此,对于给定的示例,

network.Layers

提供了一个层(Layer[](数组,其中每个元素提供每个隐藏层的信息(和数据(。在示例中,我们有输入、隐藏和输出:因此我们识别内部连接:输入到隐藏和隐藏到输出。

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

network.Layers.[0] 

此行将返回一个具有字段 Neuron 的 Layer 对象 (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的次数越多。

最新更新