保存经过训练的神经网

时间:2014-02-13 11:29:18

标签: c# neural-network

我需要帮助来保存我的神经网络。

我将解释......我在C#编程多层网络 ..应用程序的一部分用于训练,另一部分用于测试神经网络。一切都完全正常。当我想训练我的网络时,我从文件中加载一组数据。 当训练结束时,我在较小的数据样本上进行测试,它给出了正确的输出。但现在我希望能够训练我的网络并保存它,以便我可以再次加载它并将其用于进一步测试。

3 个答案:

答案 0 :(得分:4)

我假设您有一个名为Bayes(或其他)的机器学习类。通常,您会将其标记为[Serializable]

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

在这个课程中,你可以有一个方法来保存

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

YourBinarySerializer这里只是您选择的一些序列化程序,如果您愿意,可以使用其他序列化程序。阅读这些文件是相反的,同样容易。

答案 1 :(得分:4)

是的,你可以像上面提到的那样使用Serializable。但是在机器人技术中,通常需要独立于语言(即易于分析)的知识存储,这就是我添加这个答案的原因。

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

对于整数int a = 3,您可以编写包含以下内容的文件:

integer
a
3

神经网络是一种抽象数据类型,就像整数一样。 它由拓扑和训练后的最终权重定义。 假设您有一个ML = in 3,hid = 6,out = 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]

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

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

答案 2 :(得分:0)

您可以在C#here中检查我的多层网络实施情况。

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

步骤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 });