我正试图绕过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的次数越多。