2014-02-13 122 views
1

我需要救了我的神经网络的帮助。保存训练的神经网络

我会解释...我编程的C#中的多层网络 ..应用程序的一部分用于培训,另一部分用于测试神经网络。一切都按照应有的原则运作。当我想训练我的网络时,我从一个文件加载一组数据。 当训练结束时,我测试一个较小的数据样本,它给了我正确的输出。但现在我想能培养我的网络和保存它,这样我可以再次加载它,使用它进行进一步的测试。

+4

应该这样真的被标记为网络? – DuncanACoulter

+1

你使用什么神经网络框架?这不是一个标准的C#/ BCL特性:)如果你自己编写它,你必须对网络进行序列化和反序列化。 – Luaan

+8

似乎有点奇怪,你知道如何用C#编写多层神经网络,但对如何保存它的状态没有任何线索...... –

回答

3

我会假设你有你的机器学习班被称为Bayes(或其他)。通常,您将标志着这是[Serializable]

using System.IO; 
[Serializable] 
public class NaiveBayes 
{ 
    ... 
} 

在这个类然后你可以做你的储蓄

public void Save(Stream stream) 
{ 
    YourBinaryFormatter b = new YourBinaryFormatter(); 
    b.Serialize(stream, this); 
} 

YourBinarySerializer这里的方法就是你选择的一些串行器,你可以使用其他串行如你希望。读取这些文件是相反的,同样简单。

3

是的,你所提到可以使用序列化。但是在机器人领域,通常需要独立于语言(即易于解析)的知识存储,这就是为什么我要添加这个答案。

那么,你如何保存任何数据类型的当前状态?
1)写类型,它的状态和可能的描述符 2)读取它。

对于整数int a = 3,您可以编写一个文件,内容如下:

integer 
a 
3 

神经网络是一个抽象数据类型,就像一个整数。 它由拓扑和训练后的最终权重定义。 比方说,你有一个MLP在= 3,躲在= 6,出= 2,那么您可以编写一个文件,内容如下:

3-6-2 // topology 
test1 // name of neural network, could also be in filename (or timestamp) 
weight matrix [in->hid] 
weight matrix [hid->out] 

,而你当然会写的实际重量,而不是“权重矩阵“。 您可以在程序的初始化部分获取拓扑结构,或者与训练阶段结束时的权重一起获取。

如果您想重建您的网络,只需解析写入的文件,并像以前一样使用您读过的所有内容初始化网络,但现在可以跳过训练。 您应该可以在机器人上编写文件。如果您无法这样做,请通过无线网络将信息发送到您的本地计算机并写入其中。

0

您可以在C#中检查我的多层网络的实现方式。here

您需要序列化网络结构,权重和偏差。 安库有一个帮手方法为:

第1步。定义层配置:

var layerConfig = new LayerConfiguration() 
    .AddInputLayer(2) 
    .AddHiddenLayer(5) 
    .AddHiddenLayer(5) 
    .AddOutputLayer(1); 

步骤2.火车型号:

model.TrainModel(new List<double> { 0.25, 0.50 }, new List<double> { 1 }); 
model.TrainModel(new List<double> { 0.75, 0.15 }, new List<double> { 0 }); 
model.TrainModel(new List<double> { 0.60, 0.40 }, new List<double> { 1 }); 
... 

第3步:保存的培训模式,以JSON文件:

model.SaveModelToJson("model.json"); 

可以实例新的网络对象,并用以前训练有素的型号:

var model2 = new Network("model.json"); 
List<double> output = model2.UseModel(new List<double> { 0.35, 0.45 });