{"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/online-continual-learning-without-the-storage","title":"Online Continual Learning Without the Storage Constraint","arxiv_id":"2305.09253","date":"2023-05-16","proceeding":null,"authors":["Ameya Prabhu","Zhipeng Cai","Puneet Dokania","Philip Torr","Vladlen Koltun","Ozan Sener"],"abstract":"Traditional online continual learning (OCL) research has primarily focused on mitigating catastrophic forgetting with fixed and limited storage allocation throughout an agent's lifetime. However, a broad range of real-world applications are primarily constrained by computational costs rather than storage limitations. In this paper, we target such applications, investigating the online continual learning problem under relaxed storage constraints and limited computational budgets. We contribute a simple algorithm, which updates a kNN classifier continually along with a fixed, pretrained feature extractor. We selected this algorithm due to its exceptional suitability for online continual learning. It can adapt to rapidly changing streams, has zero stability gap, operates within tiny computational budgets, has low storage requirements by only storing features, and has a consistency property: It never forgets previously seen data. These attributes yield significant improvements, allowing our proposed algorithm to outperform existing methods by over 20% in accuracy on two large-scale OCL datasets: Continual LOCalization (CLOC) with 39M images and 712 classes and Continual Google Landmarks V2 (CGLM) with 580K images and 10,788 classes, even when existing methods retain all previously seen images. Furthermore, we achieve this superior performance with considerably reduced computational and storage expenses. We provide code to reproduce our results at github.com/drimpossible/ACM.","url_abs":"https://arxiv.org/abs/2305.09253v2","url_pdf":"https://arxiv.org/pdf/2305.09253v2.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":"online-continual-learning-without-the-storage","repo_url":"https://github.com/drimpossible/acm","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"continual-learning","task_name":"Continual Learning"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2305.09253","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2305.09253"}},"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/drimpossible/acm","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran_honours":1,"unverified":5},"by_repo_kind":{"official":{"samples":6,"ran":1,"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":"f321f54723433661","entry":"pil_loader","repo":"drimpossible/acm","repo_kind":"official","path":"src/features/torchutils.py","file_url":"https://github.com/drimpossible/acm/blob/HEAD/src/features/torchutils.py","link_basis":"harvester_set","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"f321f54723433661"}},{"code_sha256_prefix":"d58772dfca04d238","entry":"convert_imgfolder_to_imglist","repo":"drimpossible/acm","repo_kind":"official","path":"src/features/trainutils.py","file_url":"https://github.com/drimpossible/acm/blob/HEAD/src/features/trainutils.py","link_basis":"first_harvest_node","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":"d58772dfca04d238"}},{"code_sha256_prefix":"87b6e899753a3578","entry":"get_preds","repo":"drimpossible/acm","repo_kind":"official","path":"src/run_blind.py","file_url":"https://github.com/drimpossible/acm/blob/HEAD/src/run_blind.py","link_basis":"first_harvest_node","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":"87b6e899753a3578"}},{"code_sha256_prefix":"68117ced7d4c9043","entry":"load_filelist","repo":"drimpossible/acm","repo_kind":"official","path":"src/run_blind.py","file_url":"https://github.com/drimpossible/acm/blob/HEAD/src/run_blind.py","link_basis":"first_harvest_node","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":"68117ced7d4c9043"}},{"code_sha256_prefix":"1ec1441e033ad0e8","entry":"load_images","repo":"drimpossible/acm","repo_kind":"official","path":"src/features/trainutils.py","file_url":"https://github.com/drimpossible/acm/blob/HEAD/src/features/trainutils.py","link_basis":"first_harvest_node","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":"1ec1441e033ad0e8"}},{"code_sha256_prefix":"07b184b35e9e3570","entry":"make_data","repo":"drimpossible/acm","repo_kind":"official","path":"src/features/trainutils.py","file_url":"https://github.com/drimpossible/acm/blob/HEAD/src/features/trainutils.py","link_basis":"first_harvest_node","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":"07b184b35e9e3570"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}