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。
我正在努力让自己的头脑清醒过来 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。