Нейронная сеть Pybrain: ошибка _convertToOneOfMany
Я новичок в Pybrain и пытаюсь собрать нейронную сеть. Сначала я наткнулся на ошибку, описанную здесь:
AttributeError: 'SupervisedDataSet' object has no attribute '_convertToOneOfMany'
Я попробовал обходной путь, описанный в принятом ответе этой темы. Хотя кажется, что это работает, теперь я получаю новую ошибку. Это соответствующие фрагменты моего кода:
Часть, которая читает файл в набор классификационных данных. 3 входных атрибута, 2 класса, разбивают массив чтения, первые 3 столбца для "ввода" и последний для "назначения":
ds = ClassificationDataSet(inp=3, target=1, nb_classes=2)
tf = open('datafile.txt')
a = np.loadtxt(tf)
a = np.hsplit(a, (3,4))
ds.setField('input', a[0])
ds.setField('target', a[1])
Часть, которая строит простую сеть, довольно стандартную для pybrain:
inLayer = SigmoidLayer(3)
hiddenLayer = SigmoidLayer(5)
outLayer = SigmoidLayer(2)
fnn.addInputModule(inLayer)
fnn.addModule(hiddenLayer)
fnn.addOutputModule(outLayer)
in_to_hidden = FullConnection(inLayer, hiddenLayer)
hidden_to_out = FullConnection(hiddenLayer, outLayer)
fnn.addConnection(in_to_hidden)
fnn.addConnection(hidden_to_out)
fnn.sortModules()
Это обходной путь, как описано выше:
tstdata_temp, trndata_temp = ds.splitWithProportion(0.25)
tstdata = ClassificationDataSet(3, target=1, nb_classes=2)
for n in xrange(0, tstdata_temp.getLength()):
tstdata.addSample( tstdata_temp.getSample(n)[0], tstdata_temp.getSample(n)[1] )
trndata = ClassificationDataSet(3, target=1, nb_classes=2)
for n in xrange(0, trndata_temp.getLength()):
trndata.addSample( trndata_temp.getSample(n)[0], trndata_temp.getSample(n)[1] )
trndata._convertToOneOfMany()
tstdata._convertToOneOfMany()
И это ошибка, которую я получаю в первой строке конвертации:
IndexError: index 2 is out of bounds for axis 1 with size 2
1 ответ
Я не знаю, какие значения имеют ваши элементы поля target, но я получил ту же ошибку с _convertToOneOfMany() из-за того, что метки классов начинаются с 1, а не с 0.
_convertToOneOfMany() преобразует поле 'target' набора данных из массива меток классов, таких как 0, 1, 2 размера [n_samples,1], в массив меток, таких как 100, 010, 001 размера [n_samples,n_classes] (так оно и есть: 0 -> 100, 1->010 и 2->001). Следовательно, если у вас есть 3 класса, помеченные как 1, 2 и 3, _convertToOneOfMany() сделает 1->010, 2->001, 3-> error!
Код этой функции приведен здесь: https://github.com/pybrain/pybrain/blob/master/pybrain/datasets/classification.py а в строке 144 метки классов (oldtarg[i]) используются в качестве индексов столбцов. для новичка.