def map_structure(s): if isinstance(s, int): return flt[s] elif isinstance(s, list): return [map_structure(item) for item in s] elif isinstance(s, tuple): return tuple([map_structure(item) for item in s]) elif isinstance(s, dict): return {key: map_structure(s[key]) for key in sorted(s.keys())} else: raise TypeError
def map_structure(s): if isinstance(s, np.ndarray): flt.append(s) return len(flt) - 1 elif isinstance(s, list): return [map_structure(item) for item in s] elif isinstance(s, tuple): return tuple([map_structure(item) for item in s]) elif isinstance(s, dict): return {key: map_structure(s[key]) for key in sorted(s.keys())} else: raise TypeError
def export(self, exe, program, eval_model_spec, eval_result, state): """doc""" log.debug('New evaluate result: %s \nold: %s' % (repr(eval_result), repr(self._best))) if self._best is None and state['best_model'] is not None: self._best = state['best_model'] log.debug('restoring best state %s' % repr(self._best)) self._best_result = eval_result if self._best is None or self.cmp_fn(old=self._best, new=eval_result): if self.is_export: log.debug('[Best Exporter]: export to %s' % self._export_dir) eval_program = program.train_program # FIXME: all eval datasets has same name/types/shapes now!!! so every eval program are the smae saver = Saver( self._export_dir, exe, program=program, max_ckpt_to_keep=1) saver.save(state) eval_result = map_structure(float, eval_result) self._best = eval_result state['best_model'] = eval_result self._best_result = eval_result else: log.debug('[Best Exporter]: skip step %s' % state.gstep) self._epoch_count += 1 if self._epoch_count % 10 == 0: log.info("EPOCH_%s: %s" % (self._epoch_count, repr(self._best_result)))
def export(self, exe, program, eval_model_spec, eval_result, state): """doc""" if self.model_class_or_model_fn is not None and self.hparams is not None \ and self.dataset is not None: log.info('Building program by user defined model function') if issubclass(self.model_class_or_model_fn, Model): _model_fn = _build_model_fn(self.model_class_or_model_fn) elif inspect.isfunction(self.model_class_or_model_fn): _model_fn = self.model_class_or_model_fn else: raise ValueError('unknown model %s' % self.model_class_or_model_fn) # build net infer_program = F.Program() startup_prog = F.Program() with F.program_guard(infer_program, startup_prog): #share var with Train net with F.unique_name.guard(): log.info('Building Infer Graph') infer_fea = self.dataset.features() # run_config is None self.model_spec = _build_net(_model_fn, infer_fea, RunMode.PREDICT, self.hparams, None) log.info('Done') infer_program = infer_program.clone(for_test=True) self.program = ProgramPair(train_program=infer_program, startup_program=startup_prog) else: self.program = program self.model_spec = eval_model_spec if self._best is None and state['best_inf_model'] is not None: self._best = state['best_inf_model'] log.debug('restoring best state %s' % repr(self._best)) log.debug('New evaluate result: %s \nold: %s' % (repr(eval_result), repr(self._best))) if self._best is None or self.cmp_fn(old=self._best, new=eval_result): log.debug('[Best Exporter]: export to %s' % self._export_dir) if self.model_spec.inference_spec is None: raise ValueError('model_fn didnt return InferenceSpec') inf_spec_dict = self.model_spec.inference_spec if not isinstance(inf_spec_dict, dict): inf_spec_dict = {'inference': inf_spec_dict} for inf_spec_name, inf_spec in six.iteritems(inf_spec_dict): if not isinstance(inf_spec, InferenceSpec): raise ValueError('unknow inference spec type: %s' % inf_spec) save_dir = os.path.join(self._export_dir, inf_spec_name) log.debug('[Best Exporter]: save inference model: "%s" to %s' % (inf_spec_name, save_dir)) feed_var = [i.name for i in inf_spec.inputs] fetch_var = inf_spec.outputs infer_program = self.program.train_program startup_prog = F.Program() F.io.save_inference_model(save_dir, feed_var, fetch_var, exe, main_program=infer_program) eval_result = map_structure(float, eval_result) state['best_inf_model'] = eval_result self._best = eval_result else: log.debug('[Best Exporter]: skip step %s' % state.gstep)