Browse Source

[MNT] Update Image Ensemble

tags/v0.3.2
chenzx 3 years ago
parent
commit
f41d0645db
3 changed files with 36 additions and 10 deletions
  1. +12
    -2
      examples/example_image/main.py
  2. +7
    -3
      examples/example_image/utils.py
  3. +17
    -5
      learnware/learnware/reuse.py

+ 12
- 2
examples/example_image/main.py View File

@@ -4,7 +4,7 @@ from get_data import *
import os
import random
from utils import generate_uploader, generate_user, ImageDataLoader, train, eval_prediction
from learnware.learnware import Learnware, JobSelectorReuser
from learnware.learnware import Learnware, JobSelectorReuser, EnsembleReuser
import time

from learnware.market import EasyMarket, BaseUserInfo
@@ -143,6 +143,7 @@ def test_search(gamma=0.1, load_market=True):
avg_list = []
improve_list = []
job_selector_score_list = []
ensemble_score_list = []
for i in range(n_users):
user_data_path = os.path.join(user_save_root, "user_%d_X.npy" % (i))
user_label_path = os.path.join(user_save_root, "user_%d_y.npy" % (i))
@@ -171,8 +172,14 @@ def test_search(gamma=0.1, load_market=True):
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 = EnsembleReuser(learnware_list=mixture_learnware_list, mode="vote")
ensemble_predict_y = reuse_ensemble.predict(user_data=user_data)
ensemble_score = eval_prediction(ensemble_predict_y, user_label)
ensemble_score_list.append(ensemble_score)
print(f"mixture reuse accuracy (ensemble): {ensemble_score}\n")
select_list.append(acc_list[0])
avg_list.append(np.mean(acc_list))
improve_list.append((acc_list[0] - np.mean(acc_list)) / np.mean(acc_list))
@@ -182,6 +189,9 @@ def test_search(gamma=0.1, load_market=True):
)
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(
"Ensemble Reuse Performance: %.3f +/- %.3f" % (np.mean(ensemble_score_list), np.std(ensemble_score_list))
)


if __name__ == "__main__":


+ 7
- 3
examples/example_image/utils.py View File

@@ -162,9 +162,13 @@ def test(test_X, test_y, model, batch_size=128):

def eval_prediction(pred_y, target_y):
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
_, predicted = torch.max(pred_y.data, 1)
annos = torch.from_numpy(target_y).to(device)
total = annos.size(0)
if not isinstance(pred_y, np.ndarray):
pred_y = pred_y.detach().cpu().numpy()
predicted = np.argmax(pred_y, 1)
# print(predicted)
# annos = torch.from_numpy(target_y).to(device)
annos = target_y
total = annos.shape[0]
correct = (predicted == annos).sum().item()
criterion = nn.CrossEntropyLoss()
return correct / total

+ 17
- 5
learnware/learnware/reuse.py View File

@@ -9,6 +9,7 @@ import learnware.specification as specification
from .base import BaseReuser
from ..specification import RKMEStatSpecification
from ..logger import get_module_logger
from scipy.special import softmax

logger = get_module_logger("Reuser")

@@ -228,7 +229,7 @@ class JobSelectorReuser(BaseReuser):
class EnsembleReuser(BaseReuser):
"""Baseline Multiple Learnware Reuser uing Ensemble Method"""

def __init__(self, learnware_list: List[Learnware]):
def __init__(self, learnware_list: List[Learnware], mode="mean"):
"""The initialization method for ensemble reuser

Parameters
@@ -237,6 +238,7 @@ class EnsembleReuser(BaseReuser):
The learnware list, which should have RKME Specification for each learnweare
"""
super(EnsembleReuser, self).__init__(learnware_list)
self.mode = mode

def predict(self, user_data: np.ndarray) -> np.ndarray:
"""Give prediction for user data using baseline ensemble method
@@ -256,10 +258,20 @@ class EnsembleReuser(BaseReuser):
for idx in range(len(self.learnware_list)):
pred_y = self.learnware_list[idx].predict(user_data)

if mean_pred_y is None:
mean_pred_y = pred_y
else:
mean_pred_y += pred_y
if self.mode == "mean":
if mean_pred_y is None:
mean_pred_y = pred_y
else:
mean_pred_y += pred_y
elif self.mode == "vote":
# print(pred_y.shape)
if not isinstance(pred_y, np.ndarray):
pred_y = pred_y.detach().cpu().numpy()
softmax_pred = softmax(pred_y, axis=1)
if mean_pred_y is None:
mean_pred_y = softmax_pred
else:
mean_pred_y += softmax_pred

mean_pred_y /= len(self.learnware_list)



Loading…
Cancel
Save