【问题标题】:Saving neural network testing outputs in Pybrain在 Pybrain 中保存神经网络测试输出
【发布时间】:2015-07-24 06:12:50
【问题描述】:

我用 pybrain 做了一个有监督的神经网络,效果很好,当我用“trainer.testOnData(test_data, verbose=True)”测试它时,我可以看到输出(和错误),但我也想保存以供进一步分析。我在 pybrain 文档中找不到如何操作。有谁使用过 pybrain 知道我该怎么做?谢谢(我希望这不是一件显而易见的事情)。

【问题讨论】:

  • 请在你的答案中包含 python 标签,它会在整个线程中触发语法高亮。
  • 你的问题和这个类似吗? stackoverflow.com/questions/6006187/…
  • @rossdavich - 不,我希望能够操纵网络的输出,并且在这个问题中,他希望保存整个经过训练的网络,以便以后再次使用它

标签: python pybrain


【解决方案1】:

我和你有同样的问题,并快速回答问题:不,没有直接的方法可以做到这一点。
但这当然是可行的。

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 将 sting 更改为正确的列表:

list_of_errors = eval(still_string)

从这里,你可以使用numpypandas 来玩它。

希望对你有所帮助。

【讨论】:

  • 非常感谢 Pawel,没有比这更好的答案了:解决了我的问题!
  • 很高兴能帮上忙。请点击旁边的灰色复选标记接受答案,投票也是一种很好的感谢形式;)
  • 对不起,我第一次来。我仍然缺乏足够的声誉来投票,但一旦我这样做了;)
【解决方案2】:

我参加聚会可能有点晚了,但在搜索数据集测试中的网络结果和基本事实的方向时发现了您的问题。

所以它根本不存在,但出于统计分析和可视化目的,它应该存在。所以,让我们来吧!

但是我们没有必要去搞乱独立的库代码。您可能会破坏第三方库中的某些内容,并且您的代码变得完全不可移植(除非您指定应用补丁的特定方向,但是呃..您真的不应该)。有一个很好且非常 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 变量现在存储一个包含网络结果和基本事实的数组,可用于可视化或统计数据收集。

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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2014-09-07
    • 2018-03-26
    • 1970-01-01
    • 2018-09-06
    • 2015-02-23
    • 2016-10-19
    • 2016-01-19
    相关资源
    最近更新 更多