Python AttributeError使用pyBrain _SplitWithParty-对象类型已更改?

Python AttributeError使用pyBrain _SplitWithParty-对象类型已更改?,python,pybrain,Python,Pybrain,我正在按照基本分类教程测试pybrain,并使用一些更真实的数据对其进行不同的测试。但是,我在应用trnda时收到此错误。_convertToOneOfMany(),错误如下: AttributeError: 'SupervisedDataSet' object has no attribute '_convertToOneOfMany 数据集是作为classification.ClassificationDataSet对象创建的,但是调用SplitWithPiration似乎会改变它的sup

我正在按照基本分类教程测试pybrain,并使用一些更真实的数据对其进行不同的测试。但是,我在应用trnda时收到此错误。_convertToOneOfMany(),错误如下:

AttributeError: 'SupervisedDataSet' object has no attribute '_convertToOneOfMany
数据集是作为classification.ClassificationDataSet对象创建的,但是调用SplitWithPiration似乎会改变它的supervised.SupervisedDataSet对象,因此对于Python来说,这个错误是非常新的,因为supervised.SupervisedDataSet没有这个方法classification.ClassificationDataSet

然而,同样的代码在很多教程中使用,我觉得我肯定遗漏了一些东西,因为很多其他人都在使用它。我在github上查看了对代码库的更改,但这个函数没有任何变化,我也尝试过在Python3和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()
从pybrain.dataset导入ClassificationDataSet
ds=分类数据集(4096,1,nb_类=40)
对于范围(400)内的k:
ds.addSample(k,k%4)
打印(类型(ds))
# 
tstdata,trndata=ds.按比例拆分(0.25)
打印(类型(trnda))
# 
打印(类型(tstdata))
# 
trnda._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
trnda
转换回
ClassificationDataSet
类型。

我也有同样的问题,我想我已经解决了:请看这个


(Python2.7.6、PyBrain 0.3.3、OS X 10.9.5)

PyBrain 0.3.2和0.3.3版之间的
SplitWithProtopy
的实现发生了变化,引入了打破多态性的错误。
到目前为止,该库自2015年1月以来一直没有更新过,因此使用某种解决方案是目前唯一的行动方案


您可以在此处检查负责的提交:

我尝试了建议的解决方法,但在生产线上运行时仍被绊倒:

print( trndata['input'][0], trndata['target'][0], trndata['class'][0])
trnda['class']是一个空数组,因此索引[0]引发了一个错误

我可以通过将自己的函数转换为Neofmany来解决问题:

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)

我发现的最简单的解决方法是首先执行SplitWithPiration(),更新类的数量,然后执行_convertToOneOfMany()

随着testdata和trndata的NClass的更新,可以保证在目标字段中不会得到不同的维度


在处理ClassificationDataSet时,如果我先转换为NEOFMANY,然后按比例进行第二次拆分,或者以其他方式进行拆分,那么我就会出现错误。因此,我建议在SplitWithPiration函数中进行更新。您可以在这里看到完整的代码。

非常感谢您的想法,不幸的是它仍然失败,所以我的设置一定有些奇怪。我正在使用github(和你一样?)的最新版本pybrain和Ubuntu13.10上的Python2.7.5(也尝试了3)。我将尝试设置一个虚拟机,看看它是否在那里工作!很好的解决方法,谢谢你的发帖,我已经开始尝试其他框架,但会在某个时候回来尝试。现在我正在使用Muhammed Miah的解决方法。但我在这里提出了一个问题:对不起,我是新来的活跃用户。但你想让我补充什么?有人更改了代码中的某些内容,带来了无法预料的后果。希望这很快就能解决。但就目前而言,唯一需要注意的是:“是的,库有一个bug。请使用变通方法。”您是否介意在本教程的上下文中解释ConvertToOneOfMany的帮助?它说“对于神经网络分类,最好用每个类一个输出神经元对类进行编码”,但我并不真正理解这种说法。这种说法指的是一种热编码。例如,如果您有一个MNIST分类器,它对数字0-9进行手写分类,那么输出层应该是10个神经元,并且每个数字都有一个映射,在其他位置有零(例如7=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),这是有意义的!谢谢你,我在打印trnda['class'][0]时遇到了同样的索引[0]问题。您能否举例说明此函数如何解决此问题?np变量在哪里定义?这不是本文讨论的pybrain教程的一部分?
tstdata, trndata = alldata.splitWithProportion( 0.25 )
tstdata.nClasses = alldata.nClasses
trndata.nClasses = alldata.nClasses
tstdata._convertToOneOfMany(bounds=[0, 1])
trndata._convertToOneOfMany(bounds=[0, 1])