idxs=dict_users_test[user]) if best_acc is None or acc_test > best_acc: best_acc = acc_test net_best = copy.deepcopy(net_local) # torch.save(net_local_list[user].state_dict(), model_save_path) print('User {}, Epoch {}, Acc {:.2f}'.format(user, iter, acc_test)) if iter > 50 and acc_test >= 99: break net_local_list[user] = net_best acc_test_local, loss_test_local = test_img_local_all( net_local_list, args, dataset_test, dict_users_test) acc_test_avg, loss_test_avg = test_img_avg_all(net_glob, net_local_list, args, dataset_test) acc_test_ens_avg, loss_test, acc_test_ens_maj = test_img_ensemble_all( net_local_list, args, dataset_test) print( 'Final: acc: {:.2f}, acc (avg): {:.2f}, acc (ens,avg): {:.2f}, acc (ens,maj): {:.2f}' .format(acc_test_local, acc_test_avg, acc_test_ens_avg, acc_test_ens_maj)) final_results = np.array( [[acc_test_local, acc_test_avg, acc_test_ens_avg, acc_test_ens_maj]]) final_results = pd.DataFrame(final_results, columns=[ 'acc_test_local', 'acc_test_avg', 'acc_test_ens_avg', 'acc_test_ens_maj' ])
num_param_glob = 0 num_param_local = 0 for key in net_glob.state_dict().keys(): num_param_local += net_glob.state_dict()[key].numel() if key in w_glob_keys: num_param_glob += net_glob.state_dict()[key].numel() percentage_param = 100 * float(num_param_glob) / num_param_local print('# Params: {} (local), {} (global); Percentage {:.2f} ({}/{})'.format( num_param_local, num_param_glob, percentage_param, num_param_glob, num_param_local)) # generate list of local models for each user net_local_list = [] for user in range(args.num_users): net_local_list.append(copy.deepcopy(net_glob)) acc_test_avg, loss_test_avg = test_img_avg_all(net_glob, net_local_list, args, dataset_test) acc_test_local_list, _ = test_img_local_all(net_local_list, args, dataset_test, dict_users_test, return_all=True) acc_test_local = acc_test_local_list.mean() # training results_save_path = os.path.join(base_save_dir, 'results.csv') results_columns = ['epoch', 'acc_test_local', 'acc_test_avg', 'best_acc_local', 'acc_test_ens_avg', 'acc_test_ens_maj'] loss_train = [] best_iter = -1 best_acc_local = -1 best_acc_list = acc_test_local_list best_net_list = copy.deepcopy(net_local_list) fina_net_list = copy.deepcopy(net_local_list) results = []