|
|
|
@ -26,6 +26,15 @@ class IScanner(object):
|
|
|
|
|
if not isinstance(self.input_type, dp2.InputType):
|
|
|
|
|
raise ValueError("input type should be dataprovider2.InputType")
|
|
|
|
|
self.pos = pos
|
|
|
|
|
# data_in_gpu is used to indicate whether to create argument on GPU
|
|
|
|
|
# or not in GPU mode. Now if using one thread (trainer_count=1),
|
|
|
|
|
# trainer uses NeuralNetwork which needs to create argument on GPU
|
|
|
|
|
# before calling forward function. So, set data_in_gpu to True.
|
|
|
|
|
# Otherwise, trainer uses MultiGradientMachine which will transfer
|
|
|
|
|
# data from CPU to GPU in the forward function, set data_in_gpu to
|
|
|
|
|
# False in this case.
|
|
|
|
|
self.data_in_gpu = swig_paddle.isUsingGpu(
|
|
|
|
|
) and swig_paddle.getTrainerCount() == 1
|
|
|
|
|
|
|
|
|
|
def scan(self, dat):
|
|
|
|
|
pass
|
|
|
|
@ -53,7 +62,8 @@ class DenseScanner(IScanner):
|
|
|
|
|
assert isinstance(argument, swig_paddle.Arguments)
|
|
|
|
|
if self.__mat__.dtype != numpy.float32:
|
|
|
|
|
self.__mat__ = self.__mat__.astype(numpy.float32)
|
|
|
|
|
m = swig_paddle.Matrix.createDenseFromNumpy(self.__mat__, True, False)
|
|
|
|
|
m = swig_paddle.Matrix.createDenseFromNumpy(self.__mat__, True,
|
|
|
|
|
self.data_in_gpu)
|
|
|
|
|
argument.setSlotValue(self.pos, m)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -75,10 +85,13 @@ class SparseBinaryScanner(IScanner):
|
|
|
|
|
|
|
|
|
|
def finish_scan(self, argument):
|
|
|
|
|
assert isinstance(argument, swig_paddle.Arguments)
|
|
|
|
|
m = swig_paddle.Matrix.createSparse(self.__height__,
|
|
|
|
|
self.input_type.dim,
|
|
|
|
|
len(self.__cols__),
|
|
|
|
|
len(self.__value__) == 0)
|
|
|
|
|
m = swig_paddle.Matrix.createSparse(
|
|
|
|
|
self.__height__,
|
|
|
|
|
self.input_type.dim,
|
|
|
|
|
len(self.__cols__),
|
|
|
|
|
len(self.__value__) == 0,
|
|
|
|
|
False, # trans
|
|
|
|
|
False) # TODO supoort GPU
|
|
|
|
|
assert isinstance(m, swig_paddle.Matrix)
|
|
|
|
|
m.sparseCopyFrom(self.__rows__, self.__cols__, self.__value__)
|
|
|
|
|
argument.setSlotValue(self.pos, m)
|
|
|
|
@ -102,7 +115,7 @@ class IndexScanner(IScanner):
|
|
|
|
|
self.__ids__.append(dat)
|
|
|
|
|
|
|
|
|
|
def finish_scan(self, argument):
|
|
|
|
|
ids = swig_paddle.IVector.create(self.__ids__)
|
|
|
|
|
ids = swig_paddle.IVector.create(self.__ids__, self.data_in_gpu)
|
|
|
|
|
assert isinstance(argument, swig_paddle.Arguments)
|
|
|
|
|
argument.setSlotIds(self.pos, ids)
|
|
|
|
|
|
|
|
|
|