{"record":{"id":"b468b7ff3c22a5ba","repo":"Unity-Technologies/ml-agents","slug":"when-using-a-recurrent-network-memory-size-must-b","errorCode":null,"errorMessage":"When using a recurrent network, memory size must be greater than 0.","messagePattern":"When using a recurrent network, memory size must be greater than 0\\.","errorType":"validation","errorClass":"TrainerConfigError","httpStatus":null,"severity":"error","filePath":"ml-agents/mlagents/trainers/settings.py","lineNumber":127,"sourceCode":"    # LESSON = \"lesson\"\n\n\nclass ConditioningType(Enum):\n    HYPER = \"hyper\"\n    NONE = \"none\"\n\n\n@attr.s(auto_attribs=True)\nclass NetworkSettings:\n    @attr.s\n    class MemorySettings:\n        sequence_length: int = attr.ib(default=64)\n        memory_size: int = attr.ib(default=128)\n\n        @memory_size.validator\n        def _check_valid_memory_size(self, attribute, value):\n            if value <= 0:\n                raise TrainerConfigError(\n                    \"When using a recurrent network, memory size must be greater than 0.\"\n                )\n            elif value % 2 != 0:\n                raise TrainerConfigError(\n                    \"When using a recurrent network, memory size must be divisible by 2.\"\n                )\n\n    normalize: bool = False\n    hidden_units: int = 128\n    num_layers: int = 2\n    vis_encode_type: EncoderType = EncoderType.SIMPLE\n    memory: Optional[MemorySettings] = None\n    goal_conditioning_type: ConditioningType = ConditioningType.HYPER\n    deterministic: bool = parser.get_default(\"deterministic\")\n\n\n@attr.s(auto_attribs=True)\nclass BehavioralCloningSettings:","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/Unity-Technologies/ml-agents/blob/3ecb446f75d1e7400eb404c562dc005d3164cffc/ml-agents/mlagents/trainers/settings.py#L109-L145","documentation":"TrainerConfigError raised by the attrs validator _check_valid_memory_size on NetworkSettings when use_recurrent is enabled but memory_size is not a positive even integer. Recurrent policies require an LSTM hidden state whose size must be > 0 and divisible by 2 (multiplied internally for bidirectional layer computation).","triggerScenarios":"Setting use_recurrent: true with memory_size: 0, a negative value, or an odd number (e.g. memory_size: 127) in network_settings of the trainer YAML.","commonSituations":"Copying a config where memory_size was zeroed out; hand-tuning LSTM size to odd values like 129; forgetting memory_size defaults matter when first enabling use_recurrent.","solutions":["Set memory_size to a positive even number, e.g. memory_size: 128 or 256.","If you don't need memory, set use_recurrent: false instead of zeroing memory_size.","Halve/double the value as needed — the LSTM size you request is scaled internally, so even round numbers are safest."],"exampleFix":"# before\nnetwork_settings:\n  use_recurrent: true\n  memory_size: 127\n# after\nnetwork_settings:\n  use_recurrent: true\n  memory_size: 128","handlingStrategy":"validation","validationCode":"config = yaml.safe_load(open(\"config.yaml\"))\nns = config[\"behavior\"].get(\"network_settings\", {})\nif ns.get(\"use_recurrent\", False):\n    ms = ns.get(\"memory_size\", 128)\n    assert ms > 0 and ms % 2 == 0, f\"memory_size must be a positive even integer, got {ms}\"","typeGuard":"def memory_size_is_valid(use_recurrent: bool, memory_size: int) -> bool:\n    return (not use_recurrent) or (memory_size > 0 and memory_size % 2 == 0)","tryCatchPattern":"from mlagents.trainers.exception import TrainerConfigError\ntry:\n    run_training(config)\nexcept TrainerConfigError as e:\n    if \"memory size\" in str(e):\n        config.network_settings.memory_size = 128\n        run_training(config)","preventionTips":["Use even memory_size values (64, 128, 256) whenever use_recurrent is true","Disable use_recurrent instead of setting memory_size to 0","Validate config programmatically before launching long training runs"],"tags":["ml-agents","configuration","validation","lstm","yaml"],"backgroundTag":"invalid-config-value","analyzedSha":"3ecb446f75d1e7400eb404c562dc005d3164cffc","analyzedAt":"2026-09-02T16:33:12.832Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T21:17:11.164Z"}