使用 pyBrain _splitWithPortion 的 AttributeError - 对象类型已更改?
AttributeError using pyBrain _splitWithPortion - object type changed?
我正在按照基本分类教程 here and a different take on it with some more realistic data here 测试 pybrain。但是我在应用 trndata._convertToOneOfMany() 时收到此错误错误:
AttributeError: 'SupervisedDataSet' object has no attribute '_convertToOneOfMany
数据集创建为 classification.ClassificationDataSet 对象,但是调用 splitWithProportion 似乎更改了它 supervised.SupervisedDataSet 对象,所以对于 Python 来说这个错误似乎不是一个令人惊讶的是 supervised.SupervisedDataSet 没有那个方法,classification.ClassificationDataSet 有。 Code here。
然而,在这么多教程中使用了完全相同的代码,我觉得我一定遗漏了一些东西,因为很多其他人都在使用它。我查看了 github 上代码库的更改,但此功能没有任何变化,我还在 Python 3 和 2.7 下尝试了 运行,但没有区别。如果有人有任何指示让我回到正确的道路上,我将不胜感激。
#flatten the 64x64 data in to one dimensional 4096
ds = ClassificationDataSet(4096, 1 , nb_classes=40)
for k in xrange(len(X)): #length of X is 400
ds.addSample(np.ravel(X[k]),y[k])
# a new sample consisting of input and target
print(type(ds))
tstdata, trndata = ds.splitWithProportion( 0.25 )
print(type(trndata))
trndata._convertToOneOfMany()
tstdata._convertToOneOfMany()
因此,我执行了以下操作而没有出现错误:
from pybrain.datasets import ClassificationDataSet
ds = ClassificationDataSet(4096, 1 , nb_classes=40)
for k in range(400):
ds.addSample(k,k%4)
print(type(ds))
# <class 'pybrain.datasets.classification.ClassificationDataSet'>
tstdata, trndata = ds.splitWithProportion(0.25)
print(type(trndata))
# <class 'pybrain.datasets.classification.ClassificationDataSet'>
print(type(tstdata))
# <class 'pybrain.datasets.classification.ClassificationDataSet'>
trndata._convertToOneOfMany()
tstdata._convertToOneOfMany()
我看到我的代码和你的代码之间的唯一区别是你对 X 的使用。也许你可以确认我的代码在你的机器上工作,如果是这样的话我们可以看看 X 是什么,如果混淆的话?
我遇到了同样的问题。我添加了以下代码以使其在我的机器上运行。
tstdata_temp, trndata_temp = alldata.splitWithProportion(0.25)
tstdata = ClassificationDataSet(2, 1, nb_classes=3)
for n in xrange(0, tstdata_temp.getLength()):
tstdata.addSample( tstdata_temp.getSample(n)[0], tstdata_temp.getSample(n)[1] )
trndata = ClassificationDataSet(2, 1, nb_classes=3)
for n in xrange(0, trndata_temp.getLength()):
trndata.addSample( trndata_temp.getSample(n)[0], trndata_temp.getSample(n)[1] )
这会将 tstdata
和 trndata
转换回 ClassificationDataSet
类型。
我有同样的问题,我想我已经解决了:看这个 pull request。
(Python 2.7.6,PyBrain 0.3.3,OS X 10.9.5)
splitWithProportion
的实现在 PyBrain 版本 0.3.2 和 0.3.3 之间发生了变化,引入了这个破坏多态性的错误。
截至目前,该库自 2015 年 1 月以来尚未更新,因此使用某种变通办法是目前唯一的行动方案。
您可以在此处查看负责的提交:https://github.com/pybrain/pybrain/commit/2f02b8d9e4e9d6edbc135a355ab387048a00f1af
我尝试了 Muhammed Miah, but I still was tripped up when running the tutorial 中建议的解决方法:
print( trndata['input'][0], trndata['target'][0], trndata['class'][0])
trndata['class'] 是一个空数组,因此索引 [0] 引发了错误。
我可以通过创建自己的函数 ConvertToOneOfMany 来解决问题:
def ConvertToOneOfMany(d,nb_classes,bounds=(0,1)):
d2 = ClassificationDataSet(d.indim, d.outdim, nb_classes=nb_classes)
for n in range(d.getLength()):
d2.addSample( d.getSample(n)[0], d.getSample(n)[1] )
oldtarg=d.getField('target')
newtarg=np.zeros([len(d),nb_classes],dtype='Int32')+bounds[0]
for i in range(len(d)):
newtarg[i,int(oldtarg[i])]=bounds[1]
d2.setField('class',oldtarg)
d2.setField('target',newtarg)
return(d2)
我发现最简单的解决方法是先执行 splitWithProportion(),更新 类 的数量,然后执行 _convertToOneOfMany()。
tstdata, trndata = alldata.splitWithProportion( 0.25 )
tstdata.nClasses = alldata.nClasses
trndata.nClasses = alldata.nClasses
tstdata._convertToOneOfMany(bounds=[0, 1])
trndata._convertToOneOfMany(bounds=[0, 1])
并且随着testdata和trndata的nClasses的更新,保证你不会在目标字段中得到不同的维度。
如果我首先执行 _convertToOneOfMany 和第二个 splitWithProportion,或者在使用 ClassificationDataSet 时反过来,我会遇到错误。因此,我建议并更新 splitWithProportion 函数。您可以在 pullRequest.
中查看完整代码
我正在按照基本分类教程 here and a different take on it with some more realistic data here 测试 pybrain。但是我在应用 trndata._convertToOneOfMany() 时收到此错误错误:
AttributeError: 'SupervisedDataSet' object has no attribute '_convertToOneOfMany
数据集创建为 classification.ClassificationDataSet 对象,但是调用 splitWithProportion 似乎更改了它 supervised.SupervisedDataSet 对象,所以对于 Python 来说这个错误似乎不是一个令人惊讶的是 supervised.SupervisedDataSet 没有那个方法,classification.ClassificationDataSet 有。 Code here。
然而,在这么多教程中使用了完全相同的代码,我觉得我一定遗漏了一些东西,因为很多其他人都在使用它。我查看了 github 上代码库的更改,但此功能没有任何变化,我还在 Python 3 和 2.7 下尝试了 运行,但没有区别。如果有人有任何指示让我回到正确的道路上,我将不胜感激。
#flatten the 64x64 data in to one dimensional 4096
ds = ClassificationDataSet(4096, 1 , nb_classes=40)
for k in xrange(len(X)): #length of X is 400
ds.addSample(np.ravel(X[k]),y[k])
# a new sample consisting of input and target
print(type(ds))
tstdata, trndata = ds.splitWithProportion( 0.25 )
print(type(trndata))
trndata._convertToOneOfMany()
tstdata._convertToOneOfMany()
因此,我执行了以下操作而没有出现错误:
from pybrain.datasets import ClassificationDataSet
ds = ClassificationDataSet(4096, 1 , nb_classes=40)
for k in range(400):
ds.addSample(k,k%4)
print(type(ds))
# <class 'pybrain.datasets.classification.ClassificationDataSet'>
tstdata, trndata = ds.splitWithProportion(0.25)
print(type(trndata))
# <class 'pybrain.datasets.classification.ClassificationDataSet'>
print(type(tstdata))
# <class 'pybrain.datasets.classification.ClassificationDataSet'>
trndata._convertToOneOfMany()
tstdata._convertToOneOfMany()
我看到我的代码和你的代码之间的唯一区别是你对 X 的使用。也许你可以确认我的代码在你的机器上工作,如果是这样的话我们可以看看 X 是什么,如果混淆的话?
我遇到了同样的问题。我添加了以下代码以使其在我的机器上运行。
tstdata_temp, trndata_temp = alldata.splitWithProportion(0.25)
tstdata = ClassificationDataSet(2, 1, nb_classes=3)
for n in xrange(0, tstdata_temp.getLength()):
tstdata.addSample( tstdata_temp.getSample(n)[0], tstdata_temp.getSample(n)[1] )
trndata = ClassificationDataSet(2, 1, nb_classes=3)
for n in xrange(0, trndata_temp.getLength()):
trndata.addSample( trndata_temp.getSample(n)[0], trndata_temp.getSample(n)[1] )
这会将 tstdata
和 trndata
转换回 ClassificationDataSet
类型。
我有同样的问题,我想我已经解决了:看这个 pull request。
(Python 2.7.6,PyBrain 0.3.3,OS X 10.9.5)
splitWithProportion
的实现在 PyBrain 版本 0.3.2 和 0.3.3 之间发生了变化,引入了这个破坏多态性的错误。
截至目前,该库自 2015 年 1 月以来尚未更新,因此使用某种变通办法是目前唯一的行动方案。
您可以在此处查看负责的提交:https://github.com/pybrain/pybrain/commit/2f02b8d9e4e9d6edbc135a355ab387048a00f1af
我尝试了 Muhammed Miah, but I still was tripped up when running the tutorial 中建议的解决方法:
print( trndata['input'][0], trndata['target'][0], trndata['class'][0])
trndata['class'] 是一个空数组,因此索引 [0] 引发了错误。
我可以通过创建自己的函数 ConvertToOneOfMany 来解决问题:
def ConvertToOneOfMany(d,nb_classes,bounds=(0,1)):
d2 = ClassificationDataSet(d.indim, d.outdim, nb_classes=nb_classes)
for n in range(d.getLength()):
d2.addSample( d.getSample(n)[0], d.getSample(n)[1] )
oldtarg=d.getField('target')
newtarg=np.zeros([len(d),nb_classes],dtype='Int32')+bounds[0]
for i in range(len(d)):
newtarg[i,int(oldtarg[i])]=bounds[1]
d2.setField('class',oldtarg)
d2.setField('target',newtarg)
return(d2)
我发现最简单的解决方法是先执行 splitWithProportion(),更新 类 的数量,然后执行 _convertToOneOfMany()。
tstdata, trndata = alldata.splitWithProportion( 0.25 )
tstdata.nClasses = alldata.nClasses
trndata.nClasses = alldata.nClasses
tstdata._convertToOneOfMany(bounds=[0, 1])
trndata._convertToOneOfMany(bounds=[0, 1])
并且随着testdata和trndata的nClasses的更新,保证你不会在目标字段中得到不同的维度。
如果我首先执行 _convertToOneOfMany 和第二个 splitWithProportion,或者在使用 ClassificationDataSet 时反过来,我会遇到错误。因此,我建议并更新 splitWithProportion 函数。您可以在 pullRequest.
中查看完整代码