我用pybrain制作了一个监督神经网络,它工作得很好,当我用“trainer.testOnData(test_data,verbose = True)”测试它时,我可以看到输出(和错误),但我还想保存它有待进一步分析。我不知道如何在pybrain文档上。有没有与pybrain合作过的人知道我怎么做吗?谢谢(我希望这不是一件明显的事情)。
答案 0 :(得分:2)
我和你有同样的问题,并迅速回答问题:没有没有直接的方法去做 但它当然可行。
这似乎是最简单的解决方案,这里有源代码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)
我希望有所帮助。
答案 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
变量现在存储一个阵列,其中包含网络结果和基础事实,可用于可视化或统计信息收集。
这样,您可以将所有自定义保留在代码中,而不会弄乱原始第三方库代码。您现在可以轻松地与他人共享您的代码,更新库,而无需担心您的补丁会消失并避免更多麻烦。