Объект 'garray' не имеет атрибута 'size' с использованием классификатора nolearn-DBN - PullRequest
0 голосов
/ 12 января 2019

Я работаю над openface . Openface имеет неизвестная классификация Python Cod е.

Я тестирую lfw-classification-unknown.py's часть поезда. Тренировка с использованием

nolearn-DBN classifier

Я установил nolearn version 0.5. DBN classifier имеет вызов функции к /usr/local/lib/python2.7/dist-packages/gnumpy.py и У меня ошибка как

File "/usr/local/lib/python2.7/dist-packages/gnumpy.py", line 738, in as_numpy_array
    if self.size==0: return numpy.zeros(self.shape, dtype)
AttributeError: 'garray' object has no attribute 'size'

Как я могу исправить ошибку?

Все ошибки

Traceback (most recent call last):
  File "/usr/lib/python2.7/pdb.py", line 1314, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib/python2.7/pdb.py", line 1233, in _runscript
    self.run(statement)
  File "/usr/lib/python2.7/bdb.py", line 400, in run
    exec cmd in globals, locals
  File "<string>", line 1, in <module>
  File "evaluation/lfw-classification-unknown.py", line 519, in <module>
    train(args)
  File "evaluation/lfw-classification-unknown.py", line 130, in train
    clf.fit(embeddings, labelsNum)
  File "/usr/local/lib/python2.7/dist-packages/nolearn/dbn.py", line 409, in fit
    self.use_dropout,
  File "/usr/local/lib/python2.7/dist-packages/gdbn/dbn.py", line 202, in fineTune
    err, outMB = step(inpMB, targMB, self.learnRates, self.momentum, self.L2Costs, useDropout)
  File "/usr/local/lib/python2.7/dist-packages/gdbn/dbn.py", line 296, in stepNesterov
    targetBatch = targetBatch if isinstance(targetBatch, gnp.garray) else gnp.garray(targetBatch)
  File "/usr/local/lib/python2.7/dist-packages/gnumpy.py", line 735, in __new__
    def __new__(cls, *args, **kwarg): return object.__new__(cls)
  File "/usr/lib/python2.7/bdb.py", line 53, in trace_dispatch
    return self.dispatch_return(frame, arg)
  File "/usr/lib/python2.7/bdb.py", line 88, in dispatch_return
    self.user_return(frame, arg)
  File "/usr/lib/python2.7/pdb.py", line 190, in user_return
    self.interaction(frame, None)
  File "/usr/lib/python2.7/pdb.py", line 209, in interaction
    self.print_stack_entry(self.stack[self.curindex])
  File "/usr/lib/python2.7/pdb.py", line 900, in print_stack_entry
    prompt_prefix)
  File "/usr/lib/python2.7/bdb.py", line 381, in format_stack_entry
    s = s + repr.repr(rv)
  File "/usr/lib/python2.7/repr.py", line 24, in repr
    return self.repr1(x, self.maxlevel)
  File "/usr/lib/python2.7/repr.py", line 34, in repr1
    s = __builtin__.repr(x)
  File "/usr/local/lib/python2.7/dist-packages/gnumpy.py", line 1133, in __repr__
    def __repr__(self): return self.as_numpy_array().__repr__().replace('array(', 'garray(').replace('\n', '\n ').replace(', dtype=float32', '').replace(', dtype=float64', '') # 64 happens for empty arrays
  File "/usr/local/lib/python2.7/dist-packages/gnumpy.py", line 738, in as_numpy_array
    if self.size==0: return numpy.zeros(self.shape, dtype)
AttributeError: 'garray' object has no attribute 'size'
> Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /usr/local/lib/python2.7/dist-packages/gnumpy.py(738)as_numpy_array()
-> if self.size==0: return numpy.zeros(self.shape, dtype)

EDIT: Если не в режиме отладки, ошибка выглядит следующим образом.

Traceback (most recent call last):
  File "evaluation/lfw-classification-unknown.py", line 519, in <module>
    train(args)
  File "evaluation/lfw-classification-unknown.py", line 130, in train
    clf.fit(embeddings, labelsNum)
  File "/usr/local/lib/python2.7/dist-packages/nolearn/dbn.py", line 407, in fit
    self.use_dropout,
  File "/usr/local/lib/python2.7/dist-packages/gdbn/dbn.py", line 202, in fineTune
    err, outMB = step(inpMB, targMB, self.learnRates, self.momentum, self.L2Costs, useDropout)
  File "/usr/local/lib/python2.7/dist-packages/gdbn/dbn.py", line 303, in stepNesterov
    errSignals, outputActs, error = self.fpropBprop(inputBatch, targetBatch, useDropout)
  File "/usr/local/lib/python2.7/dist-packages/gdbn/dbn.py", line 262, in fpropBprop
    outputErrSignal = -self.outputActFunct.dErrordNetInput(targetBatch, self.state[-1], outputActs)
  File "/usr/local/lib/python2.7/dist-packages/gdbn/activationFunctions.py", line 138, in dErrordNetInput
    return acts - targets
  File "/usr/local/lib/python2.7/dist-packages/gnumpy.py", line 965, in __sub__
    else: return self + -as_garray(other) # if i need to broadcast, making use of the row add and col add methods is probably faster
  File "/usr/local/lib/python2.7/dist-packages/gnumpy.py", line 926, in __add__
    def __add__(self, other): return _check_number_types(self._broadcastable_op(as_garray_or_scalar(other), 'add'))
  File "/usr/local/lib/python2.7/dist-packages/gnumpy.py", line 614, in _broadcastable_op
    if reduce(operator.or_, ( other.shape[i] not in (1, self.shape[i]) for i in range(self.ndim)), False): raise ValueError('shape mismatch: objects cannot be broadcast to a single shape')
ValueError: shape mismatch: objects cannot be broadcast to a single shape

1 Ответ

0 голосов
/ 12 января 2019

Вы не опубликовали ни одного фактического кода, поэтому буквально невозможно точно знать, в чем ваша проблема.

Редактировать

Из вашей трассировки стека ясно, что у вас возникла проблема из-за pdb попытки получить и вывести значение garray сразу после вызова garray.__new__. Это до вызова __init__, поэтому атрибут .size еще не существует.

Не похоже, что переопределение __new__ даже необходимо в коде gnumpy.garray, так что вы можете решить вашу проблему, просто открыв /usr/local/lib/python2.7/dist-packages/gnumpy.py и затем закомментировав строку 735 (т.е. строка с определением __new__).

Еще проще, что происходит, когда вы просто запускаете скрипт без использования pdb (например, python lfw-classification-unknown.py)? Кажется, что эта конкретная ошибка исчезнет. С другой стороны, вы предположительно использовали отладчик по фактической причине. Вы изначально получали другую ошибку? В этом случае это XY проблема , и вам, вероятно, следует просто опубликовать новый вопрос с вопросом об исходной ошибке.

К сожалению, gnumpy.garray требует для работы реального графического процессора NVidia, которого у меня нет, поэтому я не могу самостоятельно протестировать эти решения.

Общая проблема

При этом кажется, что каким-то образом объект garray создается без его атрибута .size. Это может быть связано с ошибкой в ​​вашем собственном коде или в любом из 4 различных пакетов (openface плюс 3 зависимости). Вот очень общий обзор того, как это может происходить.

openface имеет зависимость от nolearn, которая зависит от gbdn, которая зависит от gnumpy. Подробно:

Итак, предположительно, что-то напортачило с созданием одного из garrays в buildDBN или DBN. Атрибут .size устанавливается только при вызове метода gnumpy.garray._set_shape_info . Беглый взгляд на реализацию garray не обнаруживает очевидного способа, которым _set_shape_info может не вызываться во время инициализации. Тем не менее, одна вещь, которая бросается в глаза, это то, что есть по крайней мере дюжина различных путей кода, по которым может происходить инициализация garray. Не было бы удивительно, если бы крайний случай проскальзывал без вызова _set_shape_info.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...