I am working on openface. Openface has unknown classification python code.
I am testing lfw-classification-unknown.py's train part.
It has training using
nolearn-DBN classifier
I installed nolearn version 0.5.
DBN classifier has a function call to /usr/local/lib/python2.7/dist-packages/gnumpy.py and
I have error as
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'
How can I fix the error?
The whole errors are
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: If not in Debug mode, the error is as follow.
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
You haven't posted any actual code, so it's literally impossible to know exactly what your problem is.Edit
From your stack trace, it's clear that the problem you're having is due to
pdbtrying to grab and print the value of agarrayimmediately aftergarray.__new__is called. This is before__init__is called, so the.sizeattribute doesn't exist yet.It doesn't seem like the redefinition of
__new__is even necessary in thegnumpy.garraycode, so you might be able to fix your problem by just opening up/usr/local/lib/python2.7/dist-packages/gnumpy.pyand then commenting out line 735 (ie the line with the definition of__new__).Even simpler, what happens when you just run the script without using
pdb(egpython lfw-classification-unknown.py)? It seems like this specific error would vanish. On the other hand, you were presumably using the debugger for an actual reason in the first place. Were you originally getting a different error? In that case, this is an XY problem, and you should probably just post a new question asking about the original error.Unfortunately,
gnumpy.garrayrequires an actual NVidia GPU to run, which I don't have, so I can't test these solutions myself directly.The general problem
That being said, it seems that somehow a
garrayobject is being created without it's.sizeattribute being set. This could be due a bug in your own code, or in any of 4 different packages (openfaceplus 3 dependencies). Here's a very general overview of how that might be happening.openfacehas a dependency onnolearn, which has a dependency ongbdn, which has a dependency ongnumpy. In detail:The
openfacecode you link to has a dependency on thenolearn.dbn.DBNclass.nolearn.dbn.DBNhas a dependency on thegdbn.dbn.buldDBNfunction, and through it thegdbn.dbn.DBNclass.Both
gdbn.dbn.buldDBNandgdbn.dbn.DBNhave code that creates arrays of classgnumpy.garraySo, presumably, something is getting screwed up with the creation of one of the
garrays's inbuildDBNorDBN. The.sizeattribute only gets set when thegnumpy.garray._set_shape_infomethod is called. A cursory look over the implementation ofgarraydoesn't reveal any obvious way in which_set_shape_infocan fail to be called during initialization. However, one thing that does jump out is that there's at least a dozen different code paths by which initialization of agarraymay occur. It wouldn't exactly be surprising if there's an edge case that slips past without calling_set_shape_info.