2014-08-31 37 views
2

我用pybrain做了一個監督神經網絡,它工作的很好,當我用「trainer.testOnData(test_data,verbose = True)」測試它時,我可以看到輸出(和錯誤)但我還想保存它以供進一步分析。我沒有找到pybrain文檔。有沒有人與pybrain合作知道我能做到嗎?謝謝(我希望這不是一個明顯的事情)。在Pybrain中保存神經網絡測試輸出

+0

請在您的答案中包含python標籤,它會在整個線程中觸發語法高亮顯示。 – 2014-09-01 16:19:19

+0

你的問題和這個相似嗎? http://stackoverflow.com/questions/6006187/how-to-save-and-recover-pybrain-traning – rossdavidh 2014-09-01 23:28:01

+0

@rossdavich - 不,我想能夠操縱網絡的輸出,並在這個問題,他想節省整個訓練有素的網絡,以便後者可以再次使用 – 2014-09-02 17:14:49

回答

2

我和你有同樣的問題,並很快回答問題:沒有沒有直接的方式來做到這一點。
但它當然是可行的。

惹pybrain代碼

這似乎是最簡單的解決方案,在這裏你有BackpropTrainer.testOnData源代碼。如您所見,如果verbose設置爲True,則會打印所有錯誤。

if verbose: 
     print('All errors:', ponderatedErrors) 
    assert sum(importances) > 0 
    avgErr = sum(errors)/sum(importances) 
    if verbose: 
     print('Average error:', avgErr) 
     print(('Max error:', max(ponderatedErrors), 'Median error:', 
       sorted(ponderatedErrors)[len(errors)/2])) 
    return avgErr 

我們可以把它用最後一行改變返回所有錯誤一起avgErr

return avgErr, ponderatedErrors 

然後你趕上值只是拆包結果:

avgErr, allErrors = trainer.testOnData(dataSet, verbose=True) 

,或者當你不想要所有的錯誤:

avgErr, _ = trainer.testOnData(dataSet, verbose=True) 

這是最簡單的解決方案。但是沒有人喜歡亂用外部庫的源代碼。

更改標準輸出,它趕上一個文件並將其轉換

這幾個步驟的過程,因爲testOnData永遠不會返回的所有錯誤,只是打印,它意味着你必須轉換字符串轉換成有用的東西(讓我們嘗試與列表)。

變化stdout打印到文件

這很簡單:

import sys 
sys.stdout = open('./OURFILE', 'w+') 

所以,現在當我們運行testOnData輸出保存在文件中。

的工作,串

我們在我們的文件中第二行intrested,所以讓我們只得到它:

our_file = open('./OURFILE', 'r') 
our_file.next()      # get rid of first line 
our_line = our_file.next()   # save second line 

因爲如何pybrain是寫我們這行看起來是這樣的:

('All errors:',HERE_IS_LIST_OF_ERRORS)

現在,我不是正則表達式嚮導,所以我只會在列表開始時計數。

still_string = our_line[16:-1] 

它會給我們一個只包含一個列表的字符串。而現在你用甘蔗來eval改變蜇到適當的列表:

list_of_errors = eval(still_string) 

在這裏,您使用甘蔗或者numpypandas它玩。

我希望有所幫助。

+0

非常感謝Pawel,coudn't要求更好的答案:解決了我的問題! – 2014-09-02 17:06:16

+0

我很高興能幫到你。請點擊旁邊的灰色複選標記接受答案,同時upvote也是很好的感謝形式;) – 2014-09-02 17:10:35

+1

對不起,我第一次來這裏。我仍然缺乏足夠的聲望來鼓掌,但我會做一次;) – 2014-09-02 17:17:53

0

我可能對派對有點遲到,但在搜索數據集測試中的網絡結果和地面真相的方向時發現了您的問題。

所以它根本就不存在,但爲了統計分析和可視化的目的,它應該是。所以讓我們做吧!

但是我們沒有必要弄亂獨立的庫代碼。你可能會破壞第三方庫中的某些東西,並且你的代碼變得完全不可移植(除非你指定了在哪裏應用補丁的具體方向,但是呃..你真的不應該這麼做)。有一個很好的pythonic解決方案 - OOP的力量。

才發現所需要的功能與

import inspect 
print inspect.getsource(BackpropTrainer.testOnData) 

的代碼只需複製該代碼,並準備使用OOP的所有可能會在你的問題。 實現一個自定義類(您可以將它存儲在單獨的模塊中,並將其導入或與您的代碼一起內聯執行),並看到它從原始類(在此例中爲BackpropTrainer)繼承,並粘貼您從第1步獲得的函數(請記住將函數名稱更改爲與現有名稱不衝突的內容)。

class myOwn_BackpropTrainer(BackpropTrainer): 
    def myOwn_testOnData(self, dataset=None, verbose=False): 
     """Compute the MSE of the module performance on the given dataset. 
     If no dataset is supplied, the one passed upon Trainer initialization is 
     used.""" 
     if dataset == None: 
      dataset = self.ds 
     dataset.reset() 
     if verbose: 
      print '\nTesting on data:' 
     errors = [] 
     importances = [] 
     ponderatedErrors = [] 
     gt_values = [] 
     for seq in dataset._provideSequences(): 
      self.module.reset() 
      e, i = dataset._evaluateSequence(self.module.activate, seq, verbose) 
      importances.append(i) 


      for input, target in seq: 
       gt_values.append([self.module.activate(input), target]) 


      errors.append(e) 
      ponderatedErrors.append(e/i) 
     if verbose: 
      print 'All errors:', ponderatedErrors 
     assert sum(importances) > 0 
     avgErr = sum(errors)/sum(importances) 
     if verbose: 
      print 'Average error:', avgErr 
      print ('Max error:', max(ponderatedErrors), 'Median error:', 
       sorted(ponderatedErrors)[len(errors)/2]) 
     return gt_values, avgErr 

通知書雙空格和我自己的gt_values變量的聲明,並在聲明return的變化分離線。 現在我可以簡單地用我們的類的實例代替BackpropTrainer類實例,並調用我們的新功能:

load_dataset(ds) 
trainer = t3_BackpropTrainer(net, ds, learningrate = 0.04, momentum=0.7, weightdecay=0.02, verbose=True) 
result, _ = trainer.t3_testOnData(verbose = True) 

result變量現在存儲與網絡的結果和地面實況準備用於可視化或統計信息收集的數組。

這樣你就可以在代碼中保留所有的自定義,並且不會混淆原始的第三方庫代碼。現在,您可以輕鬆地與其他人分享您的代碼,更新庫,而不必擔心您的補丁程序將消失並避免更多麻煩。