{"id":24408009,"url":"https://github.com/ayasyrev/model_constructor","last_synced_at":"2025-09-15T06:09:44.053Z","repository":{"id":36949576,"uuid":"232753379","full_name":"ayasyrev/model_constructor","owner":"ayasyrev","description":"Constructor for pytorch models.","archived":false,"fork":false,"pushed_at":"2024-07-27T08:33:10.000Z","size":2249,"stargazers_count":3,"open_issues_count":9,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-04T02:54:19.719Z","etag":null,"topics":["pytorch-model"],"latest_commit_sha":null,"homepage":"https://ayasyrev.github.io/model_constructor/","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ayasyrev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-01-09T07:54:29.000Z","updated_at":"2022-11-16T08:26:56.000Z","dependencies_parsed_at":"2023-12-09T14:26:43.754Z","dependency_job_id":"a717ba8a-422d-47cb-ab08-c472fbcec28c","html_url":"https://github.com/ayasyrev/model_constructor","commit_stats":{"total_commits":186,"total_committers":4,"mean_commits":46.5,"dds":"0.34408602150537637","last_synced_commit":"57f9fc29f857e894945743ffb07013347daafc4f"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":"fastai/nbdev_template","purl":"pkg:github/ayasyrev/model_constructor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayasyrev%2Fmodel_constructor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayasyrev%2Fmodel_constructor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayasyrev%2Fmodel_constructor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayasyrev%2Fmodel_constructor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ayasyrev","download_url":"https://codeload.github.com/ayasyrev/model_constructor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayasyrev%2Fmodel_constructor/sbom","scorecard":{"id":220465,"data":{"date":"2025-08-11","repo":{"name":"github.com/ayasyrev/model_constructor","commit":"32d49d96f0e36169c05e5a1268515adfb60a84be"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/10 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/ayasyrev/model_constructor/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/ayasyrev/model_constructor/ci.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:16","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:17","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"11 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2021-47 / GHSA-5jqp-qgf6-3pvh","Warn: Project is vulnerable to: GHSA-mr82-8j83-vxmv","Warn: Project is vulnerable to: GHSA-3749-ghw9-m3mg","Warn: Project is vulnerable to: PYSEC-2022-43015 / GHSA-47fc-vmwq-366v","Warn: Project is vulnerable to: PYSEC-2025-41 / GHSA-53q9-r3pm-6pq6","Warn: Project is vulnerable to: PYSEC-2024-252 / GHSA-5pcm-hx3q-hm94","Warn: Project is vulnerable to: GHSA-887c-mr87-cxwp","Warn: Project is vulnerable to: PYSEC-2024-251 / GHSA-pg7h-5qx3-wjr3","Warn: Project is vulnerable to: PYSEC-2024-250","Warn: Project is vulnerable to: PYSEC-2024-259","Warn: Project is vulnerable to: PYSEC-2024-48 / GHSA-fj7x-q9j7-g6q6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T02:21:07.806Z","repository_id":36949576,"created_at":"2025-08-17T02:21:07.806Z","updated_at":"2025-08-17T02:21:07.806Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275213915,"owners_count":25424888,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-15T02:00:09.272Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pytorch-model"],"created_at":"2025-01-20T05:18:35.509Z","updated_at":"2025-09-15T06:09:44.017Z","avatar_url":"https://github.com/ayasyrev.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# model_constructor\n\n\u003e Constructor to create pytorch model. \n\n## Install\n\n`pip install model-constructor`\n\nOr install from repo:\n\n`pip install git+https://github.com/ayasyrev/model_constructor.git`\n\n## How to use\n\nFirst import constructor class, then create model constructor object.\n\nNow you can change every part of model.\n\n\n```python\nfrom model_constructor import ModelConstructor\n```\n\n\n```python\nmc = ModelConstructor()\n```\n\nCheck base parameters:\n\n\n```python\nmc\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eModelConstructor\n      in_chans: 3, num_classes: 1000\n      expansion: 1, groups: 1, dw: False, div_groups: None\n      act_fn: ReLU, sa: False, se: False\n      stem sizes: [64], stride on 0\n      body sizes [64, 128, 256, 512]\n      layers: [2, 2, 2, 2]\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\nCheck all parameters with `print_cfg` method:\n\n\n```python\nmc.print_cfg()\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eModelConstructor(\n      in_chans=3\n      num_classes=1000\n      block='BasicBlock'\n      conv_layer='ConvBnAct'\n      block_sizes=[64, 128, 256, 512]\n      layers=[2, 2, 2, 2]\n      norm='BatchNorm2d'\n      act_fn='ReLU'\n      expansion=1\n      groups=1\n      bn_1st=True\n      zero_bn=True\n      stem_sizes=[64]\n      stem_pool=\"MaxPool2d {'kernel_size': 3, 'stride': 2, 'padding': 1}\"\n      init_cnn='init_cnn'\n      make_stem='make_stem'\n      make_layer='make_layer'\n      make_body='make_body'\n      make_head='make_head')\n    \u003c/pre\u003e\n\u003c/details\u003e\n\nNow we have model constructor, default setting as resnet18. And we can get model after call it.\n\n\n```python\n\nmodel = mc()\nmodel\n```\n\u003cdetails\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eModelConstructor(\n      (stem): Sequential(\n        (conv_1): ConvBnAct(\n          (conv): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n          (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (act_fn): ReLU(inplace=True)\n        )\n        (stem_pool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n      )\n      (body): Sequential(\n        (l_0): Sequential(\n          (bl_0): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): ReLU(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): ReLU(inplace=True)\n          )\n          (bl_1): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): ReLU(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): ReLU(inplace=True)\n          )\n        )\n        (l_1): Sequential(\n          (bl_0): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): ReLU(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (id_conv): Sequential(\n              (id_conv): ConvBnAct(\n                (conv): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): ReLU(inplace=True)\n          )\n          (bl_1): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): ReLU(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): ReLU(inplace=True)\n          )\n        )\n        (l_2): Sequential(\n          (bl_0): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): ReLU(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (id_conv): Sequential(\n              (id_conv): ConvBnAct(\n                (conv): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): ReLU(inplace=True)\n          )\n          (bl_1): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): ReLU(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): ReLU(inplace=True)\n          )\n        )\n        (l_3): Sequential(\n          (bl_0): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): ReLU(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (id_conv): Sequential(\n              (id_conv): ConvBnAct(\n                (conv): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): ReLU(inplace=True)\n          )\n          (bl_1): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): ReLU(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): ReLU(inplace=True)\n          )\n        )\n      )\n      (head): Sequential(\n        (pool): AdaptiveAvgPool2d(output_size=1)\n        (flat): Flatten(start_dim=1, end_dim=-1)\n        (fc): Linear(in_features=512, out_features=1000, bias=True)\n      )\n    )\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\nIf you want to change model, just change constructor parameters.  \nLets create resnet50.\n\n\n```python\nmc.expansion = 4\nmc.layers = [3,4,6,3]\n```\n\nWe can check, what we changed (compare to default constructor).\n\n\n```python\nmc.changed_fields\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003e{'layers': [3, 4, 6, 3], 'expansion': 4}\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\n\n```python\nmc.print_changed_fields()\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eChanged fields:\n    layers: [3, 4, 6, 3]\n    expansion: 4\n    \u003c/pre\u003e\n\u003c/details\u003e\n\nWe can compare changed with defaults.\n\n\n```python\nmc.print_changed_fields(show_default=True)\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eChanged fields:\n    layers: [3, 4, 6, 3] | [2, 2, 2, 2]\n    expansion: 4 | 1\n    \u003c/pre\u003e\n\u003c/details\u003e\n\nNow we can look at model parts - stem, body, head.  \n\n\n```python\n\nmc.body\n```\n\u003cdetails\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eSequential(\n      (l_0): Sequential(\n        (bl_0): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_1): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_2): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n      )\n      (l_1): Sequential(\n        (bl_0): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (id_conv): Sequential(\n            (id_conv): ConvBnAct(\n              (conv): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n              (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_1): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_2): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_3): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n      )\n      (l_2): Sequential(\n        (bl_0): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (id_conv): Sequential(\n            (id_conv): ConvBnAct(\n              (conv): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_1): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_2): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_3): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_4): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_5): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n      )\n      (l_3): Sequential(\n        (bl_0): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (id_conv): Sequential(\n            (id_conv): ConvBnAct(\n              (conv): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n              (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_1): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n        (bl_2): BasicBlock(\n          (convs): Sequential(\n            (conv_0): ConvBnAct(\n              (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              (act_fn): ReLU(inplace=True)\n            )\n            (conv_1): ConvBnAct(\n              (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n              (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n            )\n          )\n          (act_fn): ReLU(inplace=True)\n        )\n      )\n    )\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\n## Create constructor from config.\n\nAlternative we can create config first and than create constructor from it. \n\n\n```python\nfrom model_constructor import ModelCfg\n```\n\n\n```python\ncfg = ModelCfg(\n    num_classes=10,\n    act_fn=nn.Mish,\n)\nprint(cfg)\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eModelCfg(\n      in_chans=3\n      num_classes=10\n      block='BasicBlock'\n      conv_layer='ConvBnAct'\n      block_sizes=[64, 128, 256, 512]\n      layers=[2, 2, 2, 2]\n      norm='BatchNorm2d'\n      act_fn='Mish'\n      expansion=1\n      groups=1\n      bn_1st=True\n      zero_bn=True\n      stem_sizes=[64]\n      stem_pool=\"MaxPool2d {'kernel_size': 3, 'stride': 2, 'padding': 1}\")\n    \u003c/pre\u003e\n\u003c/details\u003e\n\nWhen creating config or constructor we can use string annotation for nn.Modules - it useful when creating model from config files.\n\n\n```python\ncfg = ModelCfg(\n    num_classes=10,\n    act_fn=\"nn.SELU\",\n)\nprint(cfg.act_fn)\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eclass 'torch.nn.modules.activation.SELU'\u003c/pre\u003e\n\u003c/details\u003e\n\nNow we can create constructor from config:\n\n\n```python\nmc = ModelConstructor.from_cfg(cfg)\nmc\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eModelConstructor\n      in_chans: 3, num_classes: 10\n      expansion: 1, groups: 1, dw: False, div_groups: None\n      act_fn: SELU, sa: \u003cclass 'model_constructor.layers.SimpleSelfAttention'\u003e, se: SEModule\n      stem sizes: [64], stride on 0\n      body sizes [64, 128, 256, 512]\n      layers: [2, 2, 2, 2]\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\n## More modification.\n\nMain purpose of this module - fast and easy modify model.\nAnd here is the link to more modification to beat Imagenette leaderboard with add MaxBlurPool and modification to ResBlock [notebook](https://github.com/ayasyrev/imagenette_experiments/blob/master/ResnetTrick_create_model_fit.ipynb)  \n\nBut now lets create model as mxresnet50 from [fastai forums tread](https://forums.fast.ai/t/how-we-beat-the-5-epoch-imagewoof-leaderboard-score-some-new-techniques-to-consider)  \n\n\nLets create mxresnet constructor.\n\n\n```python\nmc = ModelConstructor(name='MxResNet')\n```\n\nThen lets modify stem.\n\n\n```python\nfrom model_constructor.xresnet import xresnet_stem\n```\n\n\n```python\nmc.make_stem = xresnet_stem\nmc.stem_sizes = [3,32,64,64]\n```\n\nNow lets change activation function to Mish.\nHere is link to [forum discussion](https://forums.fast.ai/t/meet-mish-new-activation-function-possible-successor-to-relu)    \nWe'v got Mish is in model_constructor.activations, but from pytorch 1.9 take it from torch:\n\n\n```python\nfrom torch.nn import Mish\n```\n\n\n```python\nmc.act_fn = Mish\n```\n\n\n```python\nmc\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eMxResNet\n      in_chans: 3, num_classes: 1000\n      expansion: 1, groups: 1, dw: False, div_groups: None\n      act_fn: Mish, sa: False, se: False\n      stem sizes: [3, 32, 64, 64], stride on 0\n      body sizes [64, 128, 256, 512]\n      layers: [2, 2, 2, 2]\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\n\n```python\nmc.print_changed_fields()\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eChanged fields:\n    name: MxResNet\n    act_fn: Mish\n    stem_sizes: [3, 32, 64, 64]\n    make_stem: xresnet_stem\n    \u003c/pre\u003e\n\u003c/details\u003e\n\nHere is model:  \n\n\n```python\n\nmc()\n```\n\u003cdetails\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eMxResNet(\n      act_fn: Mish, stem_sizes: [3, 32, 64, 64], make_stem: xresnet_stem\n      (stem): Sequential(\n        (conv_0): ConvBnAct(\n          (conv): Conv2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n          (bn): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (act_fn): Mish(inplace=True)\n        )\n        (conv_1): ConvBnAct(\n          (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n          (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (act_fn): Mish(inplace=True)\n        )\n        (conv_2): ConvBnAct(\n          (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n          (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (act_fn): Mish(inplace=True)\n        )\n        (conv_3): ConvBnAct(\n          (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n          (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (act_fn): Mish(inplace=True)\n        )\n        (stem_pool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n      )\n      (body): Sequential(\n        (l_0): Sequential(\n          (bl_0): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): Mish(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): Mish(inplace=True)\n          )\n          (bl_1): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): Mish(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): Mish(inplace=True)\n          )\n        )\n        (l_1): Sequential(\n          (bl_0): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): Mish(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (id_conv): Sequential(\n              (id_conv): ConvBnAct(\n                (conv): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): Mish(inplace=True)\n          )\n          (bl_1): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): Mish(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): Mish(inplace=True)\n          )\n        )\n        (l_2): Sequential(\n          (bl_0): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): Mish(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (id_conv): Sequential(\n              (id_conv): ConvBnAct(\n                (conv): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): Mish(inplace=True)\n          )\n          (bl_1): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): Mish(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): Mish(inplace=True)\n          )\n        )\n        (l_3): Sequential(\n          (bl_0): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): Mish(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (id_conv): Sequential(\n              (id_conv): ConvBnAct(\n                (conv): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): Mish(inplace=True)\n          )\n          (bl_1): BasicBlock(\n            (convs): Sequential(\n              (conv_0): ConvBnAct(\n                (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n                (act_fn): Mish(inplace=True)\n              )\n              (conv_1): ConvBnAct(\n                (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n                (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n              )\n            )\n            (act_fn): Mish(inplace=True)\n          )\n        )\n      )\n      (head): Sequential(\n        (pool): AdaptiveAvgPool2d(output_size=1)\n        (flat): Flatten(start_dim=1, end_dim=-1)\n        (fc): Linear(in_features=512, out_features=1000, bias=True)\n      )\n    )\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\n## MXResNet50\n\nNow lets make MxResNet50\n\n\n```python\nmc.expansion = 4\nmc.layers = [3,4,6,3]\nmc.name = \"mxresnet50\"\n```\n\n\n```python\nmc.print_changed_fields()\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eChanged fields:\n    name: mxresnet50\n    layers: [3, 4, 6, 3]\n    act_fn: Mish\n    expansion: 4\n    stem_sizes: [3, 32, 64, 64]\n    make_stem: xresnet_stem\n    \u003c/pre\u003e\n\u003c/details\u003e\n\nNow we have mxresnet50 constructor.  \nWe can inspect every parts of it.  \nAnd after call it we got model.\n\n\n```python\nmc\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003emxresnet50\n      in_chans: 3, num_classes: 1000\n      expansion: 4, groups: 1, dw: False, div_groups: None\n      act_fn: Mish, sa: False, se: False\n      stem sizes: [3, 32, 64, 64], stride on 0\n      body sizes [64, 128, 256, 512]\n      layers: [3, 4, 6, 3]\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\n\n```python\n\nmc.stem.conv_1\n```\n\u003cdetails\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eConvBnAct(\n      (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n      (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (act_fn): Mish(inplace=True)\n    )\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\n\n```python\n\nmc.body.l_0.bl_0\n```\n\u003cdetails\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eBasicBlock(\n      (convs): Sequential(\n        (conv_0): ConvBnAct(\n          (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n          (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (act_fn): Mish(inplace=True)\n        )\n        (conv_1): ConvBnAct(\n          (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n          (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        )\n      )\n      (act_fn): Mish(inplace=True)\n    )\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\nWe can get model direct way:\n\n\n```python\nmc = ModelConstructor(\n    name=\"MxResNet\",\n    act_fn=Mish,\n    layers=[3,4,6,3],\n    expansion=4,\n    make_stem=xresnet_stem,\n    stem_sizes=[32,64,64]\n)\nmodel = mc()\n```\n\nAnother way:\n\n\n```python\nmodel = ModelConstructor.create_model(\n    name=\"MxResNet\",\n    act_fn=Mish,\n    layers=[3,4,6,3],\n    expansion=4,\n    make_stem=xresnet_stem,\n    stem_sizes=[32,64,64]\n)\n```\n\n## YaResNet\n\nNow lets change Resblock to YaResBlock (Yet another ResNet, former NewResBlock) is in lib from version 0.1.0\n\n\n```python\nfrom model_constructor.yaresnet import YaBasicBlock\n```\n\n\n```python\nmc = ModelConstructor(name=\"YaResNet\")\nmc.block = YaBasicBlock\n```\n\nOr in one line:\n\n\n```python\nmc = ModelConstructor(name=\"YaResNet\", block=YaBasicBlock)\n```\n\nThat all. Now we have YaResNet constructor\n\n\n```python\n\nmc.print_cfg()\n```\n\u003cdetails\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eModelConstructor(\n      name='YaResNet'\n      in_chans=3\n      num_classes=1000\n      block='YaBasicBlock'\n      conv_layer='ConvBnAct'\n      block_sizes=[64, 128, 256, 512]\n      layers=[2, 2, 2, 2]\n      norm='BatchNorm2d'\n      act_fn='ReLU'\n      expansion=1\n      groups=1\n      bn_1st=True\n      zero_bn=True\n      stem_sizes=[64]\n      stem_pool=\"MaxPool2d {'kernel_size': 3, 'stride': 2, 'padding': 1}\"\n      init_cnn='init_cnn'\n      make_stem='make_stem'\n      make_layer='make_layer'\n      make_body='make_body'\n      make_head='make_head')\n    \u003c/pre\u003e\n\u003c/details\u003e\n\nLet see what we have.\n\n\n```python\n\nmc.body.l_1.bl_0\n```\n\u003cdetails\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eYaBasicBlock(\n      (reduce): ConvBnAct(\n        (conv): Conv2d(64, 64, kernel_size=(1, 1), stride=(2, 2), bias=False)\n        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (act_fn): ReLU(inplace=True)\n      )\n      (convs): Sequential(\n        (conv_0): ConvBnAct(\n          (conv): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n          (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (act_fn): ReLU(inplace=True)\n        )\n        (conv_1): ConvBnAct(\n          (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n          (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        )\n      )\n      (id_conv): ConvBnAct(\n        (conv): Conv2d(64, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n      (merge): ReLU(inplace=True)\n    )\u003c/pre\u003e\n\u003c/details\u003e\n\n\n\nLets create `xResnet34` like model constructor:\n\n\n```python\nfrom typing import Callable\n\nfrom model_constructor.helpers import ModSeq\n\n\nclass YaResnet34(ModelConstructor):\n    block: type[nn.Module] = YaBasicBlock\n    layers: list[int] = [3, 4, 6, 3]\n    make_stem: Callable[[ModelCfg], ModSeq] = xresnet_stem\n```\n\n\n```python\nmc = YaResnet34()\nmc.print_cfg()\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eYaResnet34(\n      in_chans=3\n      num_classes=1000\n      block='YaBasicBlock'\n      conv_layer='ConvBnAct'\n      block_sizes=[64, 128, 256, 512]\n      layers=[3, 4, 6, 3]\n      norm='BatchNorm2d'\n      act_fn='ReLU'\n      expansion=1\n      groups=1\n      bn_1st=True\n      zero_bn=True\n      stem_sizes=[64]\n      stem_pool=\"MaxPool2d {'kernel_size': 3, 'stride': 2, 'padding': 1}\"\n      init_cnn='init_cnn'\n      make_stem='xresnet_stem'\n      make_layer='make_layer'\n      make_body='make_body'\n      make_head='make_head')\n    \u003c/pre\u003e\n\u003c/details\u003e\n\nAnd `xResnet50` like model can be inherited from `YaResnet34`:\n\n\n```python\nclass YaResnet50(YaResnet34):\n    expansion: int = 4\n```\n\n\n```python\nmc = YaResnet50()\nmc\n```\n\u003cdetails open\u003e \u003csummary\u003eoutput\u003c/summary\u003e  \n    \u003cpre\u003eYaResnet50\n      in_chans: 3, num_classes: 1000\n      expansion: 4, groups: 1, dw: False, div_groups: None\n      act_fn: ReLU, sa: False, se: False\n      stem sizes: [64], stride on 0\n      body sizes [64, 128, 256, 512]\n      layers: [3, 4, 6, 3]\u003c/pre\u003e\n\u003c/details\u003e\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fayasyrev%2Fmodel_constructor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fayasyrev%2Fmodel_constructor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fayasyrev%2Fmodel_constructor/lists"}