2014-02-13 121 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 });