|
|
@ -202,7 +202,7 @@ class Learner(Process):
|
|
|
|
|
|
|
|
|
|
|
|
super(Learner, self).__init__()
|
|
|
|
super(Learner, self).__init__()
|
|
|
|
if 'gpu' in _args :
|
|
|
|
if 'gpu' in _args :
|
|
|
|
print (_args['gpu'])
|
|
|
|
|
|
|
|
os.environ['CUDA_VISIBLE_DEVICES'] = str(_args['gpu'])
|
|
|
|
os.environ['CUDA_VISIBLE_DEVICES'] = str(_args['gpu'])
|
|
|
|
self.gpu = int(_args['gpu'])
|
|
|
|
self.gpu = int(_args['gpu'])
|
|
|
|
else:
|
|
|
|
else:
|
|
|
@ -224,9 +224,13 @@ class Learner(Process):
|
|
|
|
self._encoder = None
|
|
|
|
self._encoder = None
|
|
|
|
self._map = None
|
|
|
|
self._map = None
|
|
|
|
self._df = _args['data'] if 'data' in _args else None
|
|
|
|
self._df = _args['data'] if 'data' in _args else None
|
|
|
|
|
|
|
|
self.name = self.__class__.__name__+'::'+self.info['context']+'::'+self.info['from']
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# @TODO: allow for verbose mode so we have a sens of what is going on within the newtork
|
|
|
|
# @TODO: allow for verbose mode so we have a sens of what is going on within the newtork
|
|
|
|
#
|
|
|
|
#
|
|
|
|
|
|
|
|
if self.logger :
|
|
|
|
|
|
|
|
_args = {'module':self.name,'action':'init','context':self.info['context'],'gpu':(self.gpu if self.gpu is not None else -1)}
|
|
|
|
|
|
|
|
self.logger.write(_args)
|
|
|
|
|
|
|
|
|
|
|
|
# self.logpath= _args['logpath'] if 'logpath' in _args else 'logs'
|
|
|
|
# self.logpath= _args['logpath'] if 'logpath' in _args else 'logs'
|
|
|
|
# sel.max_epoc
|
|
|
|
# sel.max_epoc
|
|
|
@ -249,6 +253,9 @@ class Learner(Process):
|
|
|
|
if self._map :
|
|
|
|
if self._map :
|
|
|
|
_args['map'] = self._map
|
|
|
|
_args['map'] = self._map
|
|
|
|
self._encoder = prepare.Input(**_args) if self._df.shape[0] > 0 else None
|
|
|
|
self._encoder = prepare.Input(**_args) if self._df.shape[0] > 0 else None
|
|
|
|
|
|
|
|
if self.logger :
|
|
|
|
|
|
|
|
_args = {'module':self.name,'action':'data-prep','input':{'rows':self._df.shape[0],'cols':self._df.shape[1]} }
|
|
|
|
|
|
|
|
self.logger.write(_args)
|
|
|
|
class Trainer(Learner):
|
|
|
|
class Trainer(Learner):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
This will perform training using a GAN
|
|
|
|
This will perform training using a GAN
|
|
|
@ -257,10 +264,11 @@ class Trainer(Learner):
|
|
|
|
super().__init__(**_args)
|
|
|
|
super().__init__(**_args)
|
|
|
|
# self.info = _args['info']
|
|
|
|
# self.info = _args['info']
|
|
|
|
self.limit = int(_args['limit']) if 'limit' in _args else None
|
|
|
|
self.limit = int(_args['limit']) if 'limit' in _args else None
|
|
|
|
self.name = _args['name']
|
|
|
|
|
|
|
|
self.autopilot = _args['autopilot'] if 'autopilot' in _args else False
|
|
|
|
self.autopilot = _args['autopilot'] if 'autopilot' in _args else False
|
|
|
|
self.generate = None
|
|
|
|
self.generate = None
|
|
|
|
self.candidates = int(_args['candidates']) if 'candidates' in _args else 1
|
|
|
|
self.candidates = int(_args['candidates']) if 'candidates' in _args else 1
|
|
|
|
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
def run(self):
|
|
|
|
self.initalize()
|
|
|
|
self.initalize()
|
|
|
|
if self._encoder is None :
|
|
|
|
if self._encoder is None :
|
|
|
@ -277,7 +285,7 @@ class Trainer(Learner):
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# At this point we have the binary matrix, we can initiate training
|
|
|
|
# At this point we have the binary matrix, we can initiate training
|
|
|
|
#
|
|
|
|
#
|
|
|
|
|
|
|
|
beg = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
gTrain = gan.Train(**_args)
|
|
|
|
gTrain = gan.Train(**_args)
|
|
|
|
gTrain.apply()
|
|
|
|
gTrain.apply()
|
|
|
|
|
|
|
|
|
|
|
@ -293,6 +301,10 @@ class Trainer(Learner):
|
|
|
|
_args['gpu'] = self.gpu
|
|
|
|
_args['gpu'] = self.gpu
|
|
|
|
g = Generator(**_args)
|
|
|
|
g = Generator(**_args)
|
|
|
|
# g.run()
|
|
|
|
# g.run()
|
|
|
|
|
|
|
|
if self.logger :
|
|
|
|
|
|
|
|
end = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
|
|
|
|
logs = {'module':self.name,'action':'train','input':{'start':beg,'end':end}}
|
|
|
|
|
|
|
|
self.logger.write(logs)
|
|
|
|
self.generate = g
|
|
|
|
self.generate = g
|
|
|
|
if self.autopilot :
|
|
|
|
if self.autopilot :
|
|
|
|
self.generate.run()
|
|
|
|
self.generate.run()
|
|
|
@ -335,27 +347,36 @@ class Generator (Learner):
|
|
|
|
gHandler.load_meta(columns=None)
|
|
|
|
gHandler.load_meta(columns=None)
|
|
|
|
_iomatrix = gHandler.apply()
|
|
|
|
_iomatrix = gHandler.apply()
|
|
|
|
_candidates= [ self._encoder.revert(matrix=_item) for _item in _iomatrix]
|
|
|
|
_candidates= [ self._encoder.revert(matrix=_item) for _item in _iomatrix]
|
|
|
|
|
|
|
|
if self.logger :
|
|
|
|
|
|
|
|
_size = np.sum([len(_item) for _item in _iomatrix])
|
|
|
|
|
|
|
|
_log = {'module':self.name,'action':'io-data','input':{'candidates':len(_candidates),'rows':_size}}
|
|
|
|
|
|
|
|
self.logger.write(_log)
|
|
|
|
self.post(_candidates)
|
|
|
|
self.post(_candidates)
|
|
|
|
def approximate(self,_df):
|
|
|
|
def approximate(self,_df):
|
|
|
|
_columns = self.info['approximate']
|
|
|
|
_columns = self.info['approximate']
|
|
|
|
# _schema = {}
|
|
|
|
|
|
|
|
# for _info in self.get_schema() :
|
|
|
|
|
|
|
|
# _schema[_info['name']] = _info['type']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for name in _columns :
|
|
|
|
for name in _columns :
|
|
|
|
batches = np.array_split(_df[name].fillna(np.nan).values,2)
|
|
|
|
if _df[name].size > 100 :
|
|
|
|
|
|
|
|
BATCH_SIZE = 10
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
BATCH_SIZE = 1
|
|
|
|
|
|
|
|
batches = np.array_split(_df[name].fillna(np.nan).values,BATCH_SIZE)
|
|
|
|
_type = np.int64 if 'int' in self.info['approximate'][name]else np.float64
|
|
|
|
_type = np.int64 if 'int' in self.info['approximate'][name]else np.float64
|
|
|
|
x = []
|
|
|
|
x = []
|
|
|
|
|
|
|
|
_log = {'module':self.name,'action':'approximate','input':{'batch':BATCH_SIZE,'col':name}}
|
|
|
|
for values in batches :
|
|
|
|
for values in batches :
|
|
|
|
|
|
|
|
|
|
|
|
index = np.where(values != '')
|
|
|
|
index = [ _x not in ['',None,np.nan] for _x in values]
|
|
|
|
_values = np.random.dirichlet(values[index].astype(_type))
|
|
|
|
_values = np.random.dirichlet(values[index].astype(_type))
|
|
|
|
values[index] = list(values[index] + _values )if np.random.randint(0,2) else list(values[index] - _values)
|
|
|
|
values[index] = list(values[index] + _values )if np.random.randint(0,2) else list(values[index] - _values)
|
|
|
|
values[index] = values[index].astype(_type)
|
|
|
|
values[index] = values[index].astype(_type)
|
|
|
|
x += values.tolist()
|
|
|
|
x += values.tolist()
|
|
|
|
if x :
|
|
|
|
if x :
|
|
|
|
|
|
|
|
_log['input']['diff'] = 1 - np.divide( (_df[name].dropna() == x).sum(),_df[name].dropna().size)
|
|
|
|
_df[name] = x #np.array(x,dtype=np.int64) if 'int' in _type else np.arry(x,dtype=np.float64)
|
|
|
|
_df[name] = x #np.array(x,dtype=np.int64) if 'int' in _type else np.arry(x,dtype=np.float64)
|
|
|
|
|
|
|
|
if self.logger :
|
|
|
|
|
|
|
|
self.logger.write(_log)
|
|
|
|
return _df
|
|
|
|
return _df
|
|
|
|
def make_date(self,**_args) :
|
|
|
|
def make_date(self,**_args) :
|
|
|
|
"""
|
|
|
|
"""
|
|
|
@ -402,10 +423,11 @@ class Generator (Learner):
|
|
|
|
if 'table' not in _store :
|
|
|
|
if 'table' not in _store :
|
|
|
|
_store['table'] = self.info['from']
|
|
|
|
_store['table'] = self.info['from']
|
|
|
|
writer = transport.factory.instance(**_store)
|
|
|
|
writer = transport.factory.instance(**_store)
|
|
|
|
|
|
|
|
N = 0
|
|
|
|
for _iodf in _candidates :
|
|
|
|
for _iodf in _candidates :
|
|
|
|
_df = self._df.copy()
|
|
|
|
_df = self._df.copy()
|
|
|
|
_df[self.columns] = _iodf[self.columns]
|
|
|
|
_df[self.columns] = _iodf[self.columns]
|
|
|
|
|
|
|
|
N += _df.shape[0]
|
|
|
|
#
|
|
|
|
#
|
|
|
|
#@TODO:
|
|
|
|
#@TODO:
|
|
|
|
# Improve formatting with better post-processing pipeline
|
|
|
|
# Improve formatting with better post-processing pipeline
|
|
|
@ -422,8 +444,10 @@ class Generator (Learner):
|
|
|
|
_df[name] = _dates
|
|
|
|
_df[name] = _dates
|
|
|
|
_schema = self.get_schema()
|
|
|
|
_schema = self.get_schema()
|
|
|
|
_schema = [{'name':_item.name,'type':_item.field_type} for _item in _schema]
|
|
|
|
_schema = [{'name':_item.name,'type':_item.field_type} for _item in _schema]
|
|
|
|
writer.write(_df[self.columns],schema=_schema)
|
|
|
|
|
|
|
|
pass
|
|
|
|
writer.write(_df,schema=_schema)
|
|
|
|
|
|
|
|
if self.logger :
|
|
|
|
|
|
|
|
self.logger.write({'module':self.name,'action':'write','input':{'rows':N,'candidates':len(_candidates)}})
|
|
|
|
class factory :
|
|
|
|
class factory :
|
|
|
|
_infocache = {}
|
|
|
|
_infocache = {}
|
|
|
|
@staticmethod
|
|
|
|
@staticmethod
|
|
|
|