{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/protogcd-unified-and-unbiased-prototype","title":"ProtoGCD: Unified and Unbiased Prototype Learning for Generalized Category Discovery","arxiv_id":"2504.03755","date":"2025-04-02","proceeding":null,"authors":["Shijie Ma","Fei Zhu","Xu-Yao Zhang","Cheng-Lin Liu"],"abstract":"Generalized category discovery (GCD) is a pragmatic but underexplored problem, which requires models to automatically cluster and discover novel categories by leveraging the labeled samples from old classes. The challenge is that unlabeled data contain both old and new classes. Early works leveraging pseudo-labeling with parametric classifiers handle old and new classes separately, which brings about imbalanced accuracy between them. Recent methods employing contrastive learning neglect potential positives and are decoupled from the clustering objective, leading to biased representations and sub-optimal results. To address these issues, we introduce a unified and unbiased prototype learning framework, namely ProtoGCD, wherein old and new classes are modeled with joint prototypes and unified learning objectives, {enabling unified modeling between old and new classes}. Specifically, we propose a dual-level adaptive pseudo-labeling mechanism to mitigate confirmation bias, together with two regularization terms to collectively help learn more suitable representations for GCD. Moreover, for practical considerations, we devise a criterion to estimate the number of new classes. Furthermore, we extend ProtoGCD to detect unseen outliers, achieving task-level unification. Comprehensive experiments show that ProtoGCD achieves state-of-the-art performance on both generic and fine-grained datasets. The code is available at https://github.com/mashijie1028/ProtoGCD.","url_abs":"https://arxiv.org/abs/2504.03755v1","url_pdf":"https://arxiv.org/pdf/2504.03755v1.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"protogcd-unified-and-unbiased-prototype","repo_url":"https://github.com/mashijie1028/protogcd","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"contrastive-learning","task_name":"Contrastive Learning"}],"methods":[{"method_slug":"contrastive-learning","method_name":"Contrastive Learning"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2504.03755","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2504.03755"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/mashijie1028/protogcd","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran_fixture":3,"ran_draft_wrong":2,"ran_honours":1,"unverified":9},"by_repo_kind":{"official":{"samples":15,"ran":6,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"55120f2026b56aa2","entry":"drop_path","repo":"mashijie1028/protogcd","repo_kind":"official","path":"models/vision_transformer.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/models/vision_transformer.py","link_basis":"harvester_set","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"55120f2026b56aa2"}},{"code_sha256_prefix":"ec22c16f1e0653f7","entry":"get_params_groups","repo":"mashijie1028/protogcd","repo_kind":"official","path":"models/model.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/models/model.py","link_basis":"harvester_set","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ec22c16f1e0653f7"}},{"code_sha256_prefix":"b3c2e94d4887d26b","entry":"info_nce_logits","repo":"mashijie1028/protogcd","repo_kind":"official","path":"models/loss.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/models/loss.py","link_basis":"harvester_set","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"b3c2e94d4887d26b"}},{"code_sha256_prefix":"50edbf115e750bdd","entry":"split_cluster_acc_v2_balanced","repo":"mashijie1028/protogcd","repo_kind":"official","path":"my_utils/cluster_and_log_utils.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/my_utils/cluster_and_log_utils.py","link_basis":"harvester_set","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"50edbf115e750bdd"}},{"code_sha256_prefix":"d4acb3120a027622","entry":"stable_cumsum","repo":"mashijie1028/protogcd","repo_kind":"official","path":"my_utils/ood_utils.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/my_utils/ood_utils.py","link_basis":"harvester_set","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"d4acb3120a027622"}},{"code_sha256_prefix":"fabe0899316ffaa5","entry":"trunc_normal_","repo":"mashijie1028/protogcd","repo_kind":"official","path":"models/vision_transformer.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/models/vision_transformer.py","link_basis":"harvester_set","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"fabe0899316ffaa5"}},{"code_sha256_prefix":"7a96a31292b7e97a","entry":"entropy_regularization_loss","repo":"mashijie1028/protogcd","repo_kind":"official","path":"models/loss.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/models/loss.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"7a96a31292b7e97a"}},{"code_sha256_prefix":"655d96ad1b7b3de4","entry":"get_ood_scores","repo":"mashijie1028/protogcd","repo_kind":"official","path":"my_utils/ood_utils.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/my_utils/ood_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"655d96ad1b7b3de4"}},{"code_sha256_prefix":"db00ee40ebe7a2dd","entry":"get_ood_scores_in","repo":"mashijie1028/protogcd","repo_kind":"official","path":"my_utils/ood_utils.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/my_utils/ood_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"db00ee40ebe7a2dd"}},{"code_sha256_prefix":"3c5ee964462a01ff","entry":"init_experiment","repo":"mashijie1028/protogcd","repo_kind":"official","path":"my_utils/general_utils.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/my_utils/general_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"3c5ee964462a01ff"}},{"code_sha256_prefix":"ce9a1c162b7bb795","entry":"init_experiment_estimate_k","repo":"mashijie1028/protogcd","repo_kind":"official","path":"my_utils/general_utils.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/my_utils/general_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ce9a1c162b7bb795"}},{"code_sha256_prefix":"fde9e423d59feca8","entry":"old_cluster_acc","repo":"mashijie1028/protogcd","repo_kind":"official","path":"my_utils/cluster_and_log_utils.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/my_utils/cluster_and_log_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"fde9e423d59feca8"}},{"code_sha256_prefix":"502c820b11521b6a","entry":"prototype_separation_loss","repo":"mashijie1028/protogcd","repo_kind":"official","path":"models/loss.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/models/loss.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"502c820b11521b6a"}},{"code_sha256_prefix":"965fcd5f9ab03841","entry":"split_cluster_acc_v2","repo":"mashijie1028/protogcd","repo_kind":"official","path":"my_utils/cluster_and_log_utils.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/my_utils/cluster_and_log_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"965fcd5f9ab03841"}},{"code_sha256_prefix":"059df77687f34567","entry":"vit_tiny","repo":"mashijie1028/protogcd","repo_kind":"official","path":"models/vision_transformer.py","file_url":"https://github.com/mashijie1028/protogcd/blob/HEAD/models/vision_transformer.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"059df77687f34567"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}