diff --git a/examples/example_image/main.py b/examples/example_image/main.py index 90a34e5..485b76b 100644 --- a/examples/example_image/main.py +++ b/examples/example_image/main.py @@ -167,11 +167,13 @@ def test_search(gamma=0.1, load_market=True): acc_list.append(acc) logger.info("search rank: %d, score: %.3f, learnware_id: %s, acc: %.3f" % (idx, score, learnware.id, acc)) # test reuse + """ reuse_baseline = JobSelectorReuser(learnware_list=mixture_learnware_list) reuse_predict = reuse_baseline.predict(user_data=user_data) reuse_score = eval_prediction(reuse_predict, user_label) job_selector_score_list.append(reuse_score) print(f"mixture reuse loss: {reuse_score}\n") + """ reuse_ensemble = AveragingReuser(learnware_list=mixture_learnware_list, mode="vote") ensemble_predict_y = reuse_ensemble.predict(user_data=user_data) @@ -186,10 +188,10 @@ def test_search(gamma=0.1, load_market=True): % (np.mean(select_list), np.std(select_list), np.mean(avg_list), np.std(avg_list)) ) logger.info("Average performance improvement: %.3f" % (np.mean(improve_list))) - logger.info( - "Average Job Selector Reuse Performance: %.3f +/- %.3f" - % (np.mean(job_selector_score_list), np.std(job_selector_score_list)) - ) + # logger.info( + # "Average Job Selector Reuse Performance: %.3f +/- %.3f" + # % (np.mean(job_selector_score_list), np.std(job_selector_score_list)) + # ) logger.info( "Ensemble Reuse Performance: %.3f +/- %.3f" % (np.mean(ensemble_score_list), np.std(ensemble_score_list)) ) diff --git a/learnware/learnware/reuse.py b/learnware/learnware/reuse.py index ccd1da8..6bb075f 100644 --- a/learnware/learnware/reuse.py +++ b/learnware/learnware/reuse.py @@ -17,7 +17,7 @@ logger = get_module_logger("Reuser") class JobSelectorReuser(BaseReuser): """Baseline Multiple Learnware Reuser uing Job Selector Method""" - def __init__(self, learnware_list: List[Learnware], herding_num: int = 1000): + def __init__(self, learnware_list: List[Learnware], herding_num: int = 1000, use_herding: bool = True): """The initialization method for job selector reuser Parameters @@ -29,6 +29,7 @@ class JobSelectorReuser(BaseReuser): """ super(JobSelectorReuser, self).__init__(learnware_list) self.herding_num = herding_num + self.use_herding = use_herding def predict(self, user_data: np.ndarray) -> np.ndarray: """Give prediction for user data using baseline job-selector method @@ -53,13 +54,15 @@ class JobSelectorReuser(BaseReuser): return selector_pred_y - def job_selector(self, user_data: np.ndarray): + def job_selector(self, user_data: np.ndarray, use_herding: bool = True): """Train job selector based on user's data, which predicts which learnware in the pool should be selected Parameters ---------- user_data : np.ndarray User's labeled raw data. + use_herding: bool + Whether create job selector training samples by herding """ if len(self.learnware_list) == 1: user_data_num = user_data.shape[0] @@ -69,11 +72,12 @@ class JobSelectorReuser(BaseReuser): learnware.specification.get_stat_spec_by_name("RKMEStatSpecification") for learnware in self.learnware_list ] - task_matrix = np.zeros((len(learnware_rkme_spec_list), len(learnware_rkme_spec_list))) + task_matrix = np.zeros((len(learnware_rkme_spec_list), len(learnware_rkme_spec_list))) for i in range(len(self.learnware_list)): task_rkme1 = learnware_rkme_spec_list[i] - for j in range(i, len(self.learnware_list)): + task_matrix[i][i] = task_rkme1.inner_prod(task_rkme1) + for j in range(i + 1, len(self.learnware_list)): task_rkme2 = learnware_rkme_spec_list[j] task_matrix[i][j] = task_matrix[j][i] = task_rkme1.inner_prod(task_rkme2) @@ -87,8 +91,12 @@ class JobSelectorReuser(BaseReuser): task_spec = learnware_rkme_spec_list[i] task_herding_num = max(5, int(self.herding_num * task_mixture_weight[i])) task_val_num = task_herding_num // 5 + + if self.use_herding: + herding_X_i = task_spec.herding(task_herding_num).detach().cpu().numpy() + else: + herding_X_i = task_spec.z.detach().cpu().numpy() - herding_X_i = task_spec.herding(task_herding_num).detach().cpu().numpy() train_X_i = herding_X_i[:-task_val_num] val_X_i = herding_X_i[-task_val_num:] diff --git a/learnware/market/easy.py b/learnware/market/easy.py index 7e2de88..b8d9e1d 100644 --- a/learnware/market/easy.py +++ b/learnware/market/easy.py @@ -639,7 +639,6 @@ class EasyMarket(BaseMarket): weight_list = [] mixture_learnware_list = [] - # convert dist to score if mixture_dist is None: sorted_score_list = self._convert_dist_to_score(sorted_dist_list) mixture_score = None