2014-08-31 84 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变量现在存储与网络的结果和地面实况准备用于可视化或统计信息收集的数组。

这样你就可以在代码中保留所有的自定义,并且不会混淆原始的第三方库代码。现在,您可以轻松地与其他人分享您的代码,更新库,而不必担心您的补丁程序将消失并避免更多麻烦。