在Pybrain中保存神经网络测试输出

时间:2014-08-31 20:27:44

标签: python pybrain

我用pybrain制作了一个监督神经网络,它工作得很好,当我用“trainer.testOnData(test_data,verbose = True)”测试它时,我可以看到输出(和错误),但我还想保存它有待进一步分析。我不知道如何在pybrain文档上。有没有与pybrain合作过的人知道我怎么做吗?谢谢(我希望这不是一件明显的事情)。

2 个答案:

答案 0 :(得分: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时,输出将保存在文件中。

使用该字符串

我们对文件的第二行很感兴趣,所以我们得到它:

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

因为如何写pybrain我们的行看起来像这样:

  

('所有错误:',HERE_IS_LIST_OF_ERRORS)

现在,我不是正则表达式向导所以我只会在列表开始时计算。

still_string = our_line[16:-1]

它将为我们提供仅包含列表的字符串。到现在为止,您可以使用eval将刺痛更改为正确的列表:

list_of_errors = eval(still_string)

从这里开始,您可以使用numpypandas来玩它。

我希望有所帮助。

答案 1 :(得分: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变量现在存储一个阵列,其中包含网络结果和基础事实,可用于可视化或统计信息收集。

这样,您可以将所有自定义保留在代码中,而不会弄乱原始第三方库代码。您现在可以轻松地与他人共享您的代码,更新库,而无需担心您的补丁会消失并避免更多麻烦。