├── .gitignore ├── LICENSE ├── README.md ├── fig └── lion-optimizer.png ├── logs ├── .DS_Store ├── adam │ └── version_0 │ │ ├── .DS_Store │ │ └── metrics.csv ├── adamW │ └── version_0 │ │ ├── .DS_Store │ │ └── metrics.csv ├── lion │ ├── .DS_Store │ └── version_0 │ │ ├── .DS_Store │ │ ├── checkpoints │ │ └── .DS_Store │ │ └── metrics.csv └── sgd-cosine │ └── version_0 │ └── metrics.csv ├── plot-results.ipynb └── src ├── adam.py ├── adamW.py ├── lion.py └── sgd-cosine.py /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | # Byte-compiled / optimized / DLL files 3 | __pycache__/ 4 | *.py[cod] 5 | *$py.class 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | pip-wheel-metadata/ 25 | share/python-wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | MANIFEST 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | *.py,cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | db.sqlite3-journal 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | .python-version 87 | 88 | # pipenv 89 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 90 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 91 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 92 | # install all needed dependencies. 93 | #Pipfile.lock 94 | 95 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 96 | __pypackages__/ 97 | 98 | # Celery stuff 99 | celerybeat-schedule 100 | celerybeat.pid 101 | 102 | # SageMath parsed files 103 | *.sage.py 104 | 105 | # Environments 106 | .env 107 | .venv 108 | env/ 109 | venv/ 110 | ENV/ 111 | env.bak/ 112 | venv.bak/ 113 | 114 | # Spyder project settings 115 | .spyderproject 116 | .spyproject 117 | 118 | # Rope project settings 119 | .ropeproject 120 | 121 | # mkdocs documentation 122 | /site 123 | 124 | # mypy 125 | .mypy_cache/ 126 | .dmypy.json 127 | dmypy.json 128 | 129 | # Pyre type checker 130 | .pyre/ 131 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # try-lion-optimizer 2 | 3 | Simple comparison between the [Mar 2023 Lion optimizer](https://github.com/lucidrains/lion-pytorch) and Adam and SGD for finetuning DistilBert. 4 | 5 | ![lion-optimizer](fig/lion-optimizer.png) -------------------------------------------------------------------------------- /fig/lion-optimizer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rasbt/try-lion-optimizer/d3bd8c86714079e3c9e228895e49a254a011111e/fig/lion-optimizer.png -------------------------------------------------------------------------------- /logs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rasbt/try-lion-optimizer/d3bd8c86714079e3c9e228895e49a254a011111e/logs/.DS_Store -------------------------------------------------------------------------------- /logs/adam/version_0/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rasbt/try-lion-optimizer/d3bd8c86714079e3c9e228895e49a254a011111e/logs/adam/version_0/.DS_Store -------------------------------------------------------------------------------- /logs/adam/version_0/metrics.csv: -------------------------------------------------------------------------------- 1 | train_loss,epoch,step,val_loss,val_acc,train_acc,accuracy 2 | 0.51416015625,0,9,,,, 3 | 0.3232421875,0,19,,,, 4 | 0.26904296875,0,29,,,, 5 | 0.20947265625,0,39,,,, 6 | 0.2041015625,0,49,,,, 7 | 0.15185546875,0,59,,,, 8 | 0.19482421875,0,69,,,, 9 | 0.334228515625,0,79,,,, 10 | 0.290771484375,0,89,,,, 11 | 0.2393798828125,0,99,,,, 12 | 0.189453125,0,109,,,, 13 | 0.097900390625,0,119,,,, 14 | 0.1590576171875,0,129,,,, 15 | ,0,136,0.17516562342643738,0.9264000058174133,, 16 | ,0,136,,,0.8913142681121826, 17 | 0.171142578125,1,139,,,, 18 | 0.220703125,1,149,,,, 19 | 0.2294921875,1,159,,,, 20 | 0.29736328125,1,169,,,, 21 | 0.1453857421875,1,179,,,, 22 | 0.355712890625,1,189,,,, 23 | 0.080322265625,1,199,,,, 24 | 0.1341552734375,1,209,,,, 25 | 0.177978515625,1,219,,,, 26 | 0.12176513671875,1,229,,,, 27 | 0.035369873046875,1,239,,,, 28 | 0.06689453125,1,249,,,, 29 | 0.07733154296875,1,259,,,, 30 | 0.142578125,1,269,,,, 31 | ,1,273,0.1814499944448471,0.9233999848365784,, 32 | ,1,273,,,0.9526000022888184, 33 | 0.0390625,2,279,,,, 34 | 0.1492919921875,2,289,,,, 35 | 0.029205322265625,2,299,,,, 36 | 0.07342529296875,2,309,,,, 37 | 0.033111572265625,2,319,,,, 38 | 0.1715087890625,2,329,,,, 39 | 0.1143798828125,2,339,,,, 40 | 0.028900146484375,2,349,,,, 41 | 0.11279296875,2,359,,,, 42 | 0.09161376953125,2,369,,,, 43 | 0.0179595947265625,2,379,,,, 44 | 0.1082763671875,2,389,,,, 45 | 0.1324462890625,2,399,,,, 46 | 0.1007080078125,2,409,,,, 47 | ,2,410,0.1741539090871811,0.928600013256073,, 48 | ,2,410,,,0.9713714122772217, 49 | 0.01885986328125,3,419,,,, 50 | 0.021453857421875,3,429,,,, 51 | 0.010711669921875,3,439,,,, 52 | 0.078857421875,3,449,,,, 53 | 0.019683837890625,3,459,,,, 54 | 0.0421142578125,3,469,,,, 55 | 0.1068115234375,3,479,,,, 56 | 0.04345703125,3,489,,,, 57 | 0.011627197265625,3,499,,,, 58 | 0.043060302734375,3,509,,,, 59 | 0.0271148681640625,3,519,,,, 60 | 0.0828857421875,3,529,,,, 61 | 0.03460693359375,3,539,,,, 62 | ,3,547,0.1523476541042328,0.9340000152587891,, 63 | ,3,547,,,0.9829714298248291, 64 | 0.0181732177734375,4,549,,,, 65 | 0.07647705078125,4,559,,,, 66 | 0.0176239013671875,4,569,,,, 67 | 0.019317626953125,4,579,,,, 68 | 0.0232696533203125,4,589,,,, 69 | 0.05218505859375,4,599,,,, 70 | 0.0097198486328125,4,609,,,, 71 | 0.0084686279296875,4,619,,,, 72 | 0.0784912109375,4,629,,,, 73 | 0.128173828125,4,639,,,, 74 | 0.0214080810546875,4,649,,,, 75 | 0.110595703125,4,659,,,, 76 | 0.0142822265625,4,669,,,, 77 | 0.003143310546875,4,679,,,, 78 | ,4,684,0.22097812592983246,0.9205999970436096,, 79 | ,4,684,,,0.9892285466194153, 80 | 0.0902099609375,5,689,,,, 81 | 0.049835205078125,5,699,,,, 82 | 0.01531219482421875,5,709,,,, 83 | 0.00212860107421875,5,719,,,, 84 | 0.048431396484375,5,729,,,, 85 | 0.01318359375,5,739,,,, 86 | 0.017486572265625,5,749,,,, 87 | 0.08184814453125,5,759,,,, 88 | 0.0178070068359375,5,769,,,, 89 | 0.0182037353515625,5,779,,,, 90 | 0.026275634765625,5,789,,,, 91 | 0.0169677734375,5,799,,,, 92 | 0.07196044921875,5,809,,,, 93 | 0.10345458984375,5,819,,,, 94 | ,5,821,0.18147186934947968,0.9300000071525574,, 95 | ,5,821,,,0.9905428290367126, 96 | 0.015960693359375,6,829,,,, 97 | 0.012359619140625,6,839,,,, 98 | 0.01111602783203125,6,849,,,, 99 | 0.0017614364624023438,6,859,,,, 100 | 0.001312255859375,6,869,,,, 101 | 0.0134735107421875,6,879,,,, 102 | 0.0073394775390625,6,889,,,, 103 | 0.0031890869140625,6,899,,,, 104 | 0.006870269775390625,6,909,,,, 105 | 0.0035457611083984375,6,919,,,, 106 | 0.029510498046875,6,929,,,, 107 | 0.0245819091796875,6,939,,,, 108 | 0.016204833984375,6,949,,,, 109 | ,6,958,0.24487186968326569,0.9279999732971191,, 110 | ,6,958,,,0.9937142729759216, 111 | 0.01291656494140625,7,959,,,, 112 | 0.06072998046875,7,969,,,, 113 | 0.040008544921875,7,979,,,, 114 | 0.0498046875,7,989,,,, 115 | 0.0023593902587890625,7,999,,,, 116 | 0.0020656585693359375,7,1009,,,, 117 | 0.006252288818359375,7,1019,,,, 118 | 0.0020008087158203125,7,1029,,,, 119 | 0.0477294921875,7,1039,,,, 120 | 0.0014438629150390625,7,1049,,,, 121 | 0.00337982177734375,7,1059,,,, 122 | 0.00620269775390625,7,1069,,,, 123 | 0.002628326416015625,7,1079,,,, 124 | 0.034515380859375,7,1089,,,, 125 | ,7,1095,0.24886171519756317,0.9330000281333923,, 126 | ,7,1095,,,0.9942857027053833, 127 | 0.0496826171875,8,1099,,,, 128 | 0.00933074951171875,8,1109,,,, 129 | 0.0013208389282226562,8,1119,,,, 130 | 0.0028705596923828125,8,1129,,,, 131 | 0.005413055419921875,8,1139,,,, 132 | 0.0036602020263671875,8,1149,,,, 133 | 0.0216064453125,8,1159,,,, 134 | 0.00469207763671875,8,1169,,,, 135 | 0.012298583984375,8,1179,,,, 136 | 0.1295166015625,8,1189,,,, 137 | 0.002864837646484375,8,1199,,,, 138 | 0.00289154052734375,8,1209,,,, 139 | 0.03277587890625,8,1219,,,, 140 | 0.003631591796875,8,1229,,,, 141 | ,8,1232,0.20588672161102295,0.9336000084877014,, 142 | ,8,1232,,,0.9950857162475586, 143 | 0.004344940185546875,9,1239,,,, 144 | 0.0113525390625,9,1249,,,, 145 | 0.005367279052734375,9,1259,,,, 146 | 0.0013933181762695312,9,1269,,,, 147 | 0.027557373046875,9,1279,,,, 148 | 0.003337860107421875,9,1289,,,, 149 | 0.0009937286376953125,9,1299,,,, 150 | 0.08441162109375,9,1309,,,, 151 | 0.08209228515625,9,1319,,,, 152 | 0.040557861328125,9,1329,,,, 153 | 0.0007767677307128906,9,1339,,,, 154 | 0.0017061233520507812,9,1349,,,, 155 | 0.0576171875,9,1359,,,, 156 | 0.0004811286926269531,9,1369,,,, 157 | ,9,1369,0.21884258091449738,0.9344000220298767,, 158 | ,9,1369,,,0.9957714080810547, 159 | ,10,1370,,,,0.929099977016449 160 | -------------------------------------------------------------------------------- /logs/adamW/version_0/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rasbt/try-lion-optimizer/d3bd8c86714079e3c9e228895e49a254a011111e/logs/adamW/version_0/.DS_Store -------------------------------------------------------------------------------- /logs/adamW/version_0/metrics.csv: -------------------------------------------------------------------------------- 1 | train_loss,epoch,step,val_loss,val_acc,train_acc,accuracy 2 | 0.63037109375,0,9,,,, 3 | 0.398193359375,0,19,,,, 4 | 0.2484130859375,0,29,,,, 5 | 0.2919921875,0,39,,,, 6 | 0.173583984375,0,49,,,, 7 | 0.20703125,0,59,,,, 8 | 0.13525390625,0,69,,,, 9 | 0.216552734375,0,79,,,, 10 | 0.19384765625,0,89,,,, 11 | 0.144287109375,0,99,,,, 12 | 0.119384765625,0,109,,,, 13 | 0.1524658203125,0,119,,,, 14 | 0.10980224609375,0,129,,,, 15 | ,0,136,0.20938125252723694,0.9085999727249146,, 16 | ,0,136,,,0.8852857351303101, 17 | 0.130615234375,1,139,,,, 18 | 0.21044921875,1,149,,,, 19 | 0.11492919921875,1,159,,,, 20 | 0.06903076171875,1,169,,,, 21 | 0.1019287109375,1,179,,,, 22 | 0.109619140625,1,189,,,, 23 | 0.068115234375,1,199,,,, 24 | 0.12841796875,1,209,,,, 25 | 0.04779052734375,1,219,,,, 26 | 0.0947265625,1,229,,,, 27 | 0.4501953125,1,239,,,, 28 | 0.148681640625,1,249,,,, 29 | 0.262939453125,1,259,,,, 30 | 0.120361328125,1,269,,,, 31 | ,1,273,0.17482031881809235,0.9308000206947327,, 32 | ,1,273,,,0.9512571692466736, 33 | 0.04486083984375,2,279,,,, 34 | 0.0855712890625,2,289,,,, 35 | 0.160888671875,2,299,,,, 36 | 0.1575927734375,2,309,,,, 37 | 0.235595703125,2,319,,,, 38 | 0.039215087890625,2,329,,,, 39 | 0.12469482421875,2,339,,,, 40 | 0.028076171875,2,349,,,, 41 | 0.0640869140625,2,359,,,, 42 | 0.1883544921875,2,369,,,, 43 | 0.0535888671875,2,379,,,, 44 | 0.0941162109375,2,389,,,, 45 | 0.047698974609375,2,399,,,, 46 | 0.11273193359375,2,409,,,, 47 | ,2,410,0.16592499613761902,0.9291999936103821,, 48 | ,2,410,,,0.9700571298599243, 49 | 0.015960693359375,3,419,,,, 50 | 0.0203857421875,3,429,,,, 51 | 0.1048583984375,3,439,,,, 52 | 0.09112548828125,3,449,,,, 53 | 0.015655517578125,3,459,,,, 54 | 0.05401611328125,3,469,,,, 55 | 0.0252227783203125,3,479,,,, 56 | 0.0228729248046875,3,489,,,, 57 | 0.0197601318359375,3,499,,,, 58 | 0.01239013671875,3,509,,,, 59 | 0.00528717041015625,3,519,,,, 60 | 0.0185394287109375,3,529,,,, 61 | 0.004856109619140625,3,539,,,, 62 | ,3,547,0.21281719207763672,0.9348000288009644,, 63 | ,3,547,,,0.9832857251167297, 64 | 0.0035572052001953125,4,549,,,, 65 | 0.0147705078125,4,559,,,, 66 | 0.038055419921875,4,569,,,, 67 | 0.0208587646484375,4,579,,,, 68 | 0.054779052734375,4,589,,,, 69 | 0.0124053955078125,4,599,,,, 70 | 0.087646484375,4,609,,,, 71 | 0.0067596435546875,4,619,,,, 72 | 0.01444244384765625,4,629,,,, 73 | 0.09454345703125,4,639,,,, 74 | 0.00478363037109375,4,649,,,, 75 | 0.005680084228515625,4,659,,,, 76 | 0.0073699951171875,4,669,,,, 77 | 0.0028285980224609375,4,679,,,, 78 | ,4,684,0.20251406729221344,0.9330000281333923,, 79 | ,4,684,,,0.9888571500778198, 80 | 0.08544921875,5,689,,,, 81 | 0.02545166015625,5,699,,,, 82 | 0.01137542724609375,5,709,,,, 83 | 0.004177093505859375,5,719,,,, 84 | 0.01409912109375,5,729,,,, 85 | 0.0179443359375,5,739,,,, 86 | 0.005123138427734375,5,749,,,, 87 | 0.005828857421875,5,759,,,, 88 | 0.00727081298828125,5,769,,,, 89 | 0.00984954833984375,5,779,,,, 90 | 0.007106781005859375,5,789,,,, 91 | 0.004199981689453125,5,799,,,, 92 | 0.08709716796875,5,809,,,, 93 | 0.0039005279541015625,5,819,,,, 94 | ,5,821,0.21743124723434448,0.9305999875068665,, 95 | ,5,821,,,0.9899428486824036, 96 | 0.005580902099609375,6,829,,,, 97 | 0.00597381591796875,6,839,,,, 98 | 0.0223541259765625,6,849,,,, 99 | 0.0023746490478515625,6,859,,,, 100 | 0.005374908447265625,6,869,,,, 101 | 0.0011301040649414062,6,879,,,, 102 | 0.0229339599609375,6,889,,,, 103 | 0.0025196075439453125,6,899,,,, 104 | 0.0011587142944335938,6,909,,,, 105 | 0.0025463104248046875,6,919,,,, 106 | 0.042724609375,6,929,,,, 107 | 0.007152557373046875,6,939,,,, 108 | 0.007434844970703125,6,949,,,, 109 | ,6,958,0.27390626072883606,0.9279999732971191,, 110 | ,6,958,,,0.9939428567886353, 111 | 0.07159423828125,7,959,,,, 112 | 0.022186279296875,7,969,,,, 113 | 0.0269927978515625,7,979,,,, 114 | 0.01336669921875,7,989,,,, 115 | 0.002468109130859375,7,999,,,, 116 | 0.140380859375,7,1009,,,, 117 | 0.0024051666259765625,7,1019,,,, 118 | 0.054107666015625,7,1029,,,, 119 | 0.07806396484375,7,1039,,,, 120 | 0.004207611083984375,7,1049,,,, 121 | 0.0022640228271484375,7,1059,,,, 122 | 0.004730224609375,7,1069,,,, 123 | 0.0019311904907226562,7,1079,,,, 124 | 0.00060272216796875,7,1089,,,, 125 | ,7,1095,0.27032187581062317,0.9283999800682068,, 126 | ,7,1095,,,0.9958000183105469, 127 | 0.00164031982421875,8,1099,,,, 128 | 0.0017976760864257812,8,1109,,,, 129 | 0.0025768280029296875,8,1119,,,, 130 | 0.140625,8,1129,,,, 131 | 0.006824493408203125,8,1139,,,, 132 | 0.001171112060546875,8,1149,,,, 133 | 0.022064208984375,8,1159,,,, 134 | 0.0017414093017578125,8,1169,,,, 135 | 0.004302978515625,8,1179,,,, 136 | 0.0023403167724609375,8,1189,,,, 137 | 0.0022716522216796875,8,1199,,,, 138 | 0.020721435546875,8,1209,,,, 139 | 0.002803802490234375,8,1219,,,, 140 | 0.0192413330078125,8,1229,,,, 141 | ,8,1232,0.22902968525886536,0.9355999827384949,, 142 | ,8,1232,,,0.9953428506851196, 143 | 0.005916595458984375,9,1239,,,, 144 | 0.0013017654418945312,9,1249,,,, 145 | 0.0014581680297851562,9,1259,,,, 146 | 0.0013017654418945312,9,1269,,,, 147 | 0.0044708251953125,9,1279,,,, 148 | 0.004329681396484375,9,1289,,,, 149 | 0.0015468597412109375,9,1299,,,, 150 | 0.00127410888671875,9,1309,,,, 151 | 0.004894256591796875,9,1319,,,, 152 | 0.00144195556640625,9,1329,,,, 153 | 0.0028972625732421875,9,1339,,,, 154 | 0.0019626617431640625,9,1349,,,, 155 | 0.0018014907836914062,9,1359,,,, 156 | 0.030670166015625,9,1369,,,, 157 | ,9,1369,0.3095046877861023,0.9254000186920166,, 158 | ,9,1369,,,0.99528568983078, 159 | ,10,1370,,,,0.930899977684021 160 | -------------------------------------------------------------------------------- /logs/lion/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rasbt/try-lion-optimizer/d3bd8c86714079e3c9e228895e49a254a011111e/logs/lion/.DS_Store -------------------------------------------------------------------------------- /logs/lion/version_0/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rasbt/try-lion-optimizer/d3bd8c86714079e3c9e228895e49a254a011111e/logs/lion/version_0/.DS_Store -------------------------------------------------------------------------------- /logs/lion/version_0/checkpoints/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rasbt/try-lion-optimizer/d3bd8c86714079e3c9e228895e49a254a011111e/logs/lion/version_0/checkpoints/.DS_Store -------------------------------------------------------------------------------- /logs/lion/version_0/metrics.csv: -------------------------------------------------------------------------------- 1 | train_loss,epoch,step,val_loss,val_acc,train_acc,accuracy 2 | 0.724609375,0,9,,,, 3 | 0.303955078125,0,19,,,, 4 | 0.31982421875,0,29,,,, 5 | 0.53125,0,39,,,, 6 | 0.28076171875,0,49,,,, 7 | 0.285888671875,0,59,,,, 8 | 0.399658203125,0,69,,,, 9 | 0.2061767578125,0,79,,,, 10 | 0.10321044921875,0,89,,,, 11 | 0.248779296875,0,99,,,, 12 | 0.423828125,0,109,,,, 13 | 0.20263671875,0,119,,,, 14 | 0.261474609375,0,129,,,, 15 | ,0,136,0.21321874856948853,0.9067999720573425,, 16 | ,0,136,,,0.8577714562416077, 17 | 0.1685791015625,1,139,,,, 18 | 0.253662109375,1,149,,,, 19 | 0.136474609375,1,159,,,, 20 | 0.10198974609375,1,169,,,, 21 | 0.2135009765625,1,179,,,, 22 | 0.2294921875,1,189,,,, 23 | 0.2034912109375,1,199,,,, 24 | 0.07122802734375,1,209,,,, 25 | 0.201416015625,1,219,,,, 26 | 0.294189453125,1,229,,,, 27 | 0.0770263671875,1,239,,,, 28 | 0.26171875,1,249,,,, 29 | 0.1221923828125,1,259,,,, 30 | 0.155029296875,1,269,,,, 31 | ,1,273,0.2445874959230423,0.8966000080108643,, 32 | ,1,273,,,0.9399428367614746, 33 | 0.1513671875,2,279,,,, 34 | 0.143310546875,2,289,,,, 35 | 0.1890869140625,2,299,,,, 36 | 0.08087158203125,2,309,,,, 37 | 0.0753173828125,2,319,,,, 38 | 0.135498046875,2,329,,,, 39 | 0.11865234375,2,339,,,, 40 | 0.061981201171875,2,349,,,, 41 | 0.135009765625,2,359,,,, 42 | 0.08660888671875,2,369,,,, 43 | 0.124755859375,2,379,,,, 44 | 0.1448974609375,2,389,,,, 45 | 0.0867919921875,2,399,,,, 46 | 0.135498046875,2,409,,,, 47 | ,2,410,0.2945062518119812,0.876800000667572,, 48 | ,2,410,,,0.9526000022888184, 49 | 0.060821533203125,3,419,,,, 50 | 0.07562255859375,3,429,,,, 51 | 0.046356201171875,3,439,,,, 52 | 0.23095703125,3,449,,,, 53 | 0.26123046875,3,459,,,, 54 | 0.2030029296875,3,469,,,, 55 | 0.07830810546875,3,479,,,, 56 | 0.1317138671875,3,489,,,, 57 | 0.1583251953125,3,499,,,, 58 | 0.1177978515625,3,509,,,, 59 | 0.082763671875,3,519,,,, 60 | 0.1881103515625,3,529,,,, 61 | 0.30322265625,3,539,,,, 62 | ,3,547,0.4205000102519989,0.8676000237464905,, 63 | ,3,547,,,0.9610285758972168, 64 | 0.050140380859375,4,549,,,, 65 | 0.05682373046875,4,559,,,, 66 | 0.0430908203125,4,569,,,, 67 | 0.10479736328125,4,579,,,, 68 | 0.08837890625,4,589,,,, 69 | 0.059417724609375,4,599,,,, 70 | 0.09808349609375,4,609,,,, 71 | 0.1114501953125,4,619,,,, 72 | 0.1881103515625,4,629,,,, 73 | 0.03741455078125,4,639,,,, 74 | 0.1402587890625,4,649,,,, 75 | 0.155517578125,4,659,,,, 76 | 0.294189453125,4,669,,,, 77 | 0.09881591796875,4,679,,,, 78 | ,4,684,0.5323812365531921,0.8324000239372253,, 79 | ,4,684,,,0.9539714455604553, 80 | 0.166015625,5,689,,,, 81 | 0.1268310546875,5,699,,,, 82 | 0.20947265625,5,709,,,, 83 | 0.08447265625,5,719,,,, 84 | 0.167236328125,5,729,,,, 85 | 0.1666259765625,5,739,,,, 86 | 0.12371826171875,5,749,,,, 87 | 0.2496337890625,5,759,,,, 88 | 0.281005859375,5,769,,,, 89 | 0.2763671875,5,779,,,, 90 | 0.255615234375,5,789,,,, 91 | 0.4296875,5,799,,,, 92 | 0.290771484375,5,809,,,, 93 | 0.339111328125,5,819,,,, 94 | ,5,821,0.49053749442100525,0.7771999835968018,, 95 | ,5,821,,,0.9190571308135986, 96 | 0.2548828125,6,829,,,, 97 | 0.410888671875,6,839,,,, 98 | 0.352783203125,6,849,,,, 99 | 0.332763671875,6,859,,,, 100 | 0.2242431640625,6,869,,,, 101 | 0.478759765625,6,879,,,, 102 | 0.401611328125,6,889,,,, 103 | 0.2484130859375,6,899,,,, 104 | 0.259033203125,6,909,,,, 105 | 0.482177734375,6,919,,,, 106 | 0.37109375,6,929,,,, 107 | 0.341064453125,6,939,,,, 108 | 0.263427734375,6,949,,,, 109 | ,6,958,0.5179562568664551,0.7785999774932861,, 110 | ,6,958,,,0.8577428460121155, 111 | 0.328125,7,959,,,, 112 | 0.357421875,7,969,,,, 113 | 0.43505859375,7,979,,,, 114 | 0.35498046875,7,989,,,, 115 | 0.3369140625,7,999,,,, 116 | 0.498291015625,7,1009,,,, 117 | 0.501953125,7,1019,,,, 118 | 0.431640625,7,1029,,,, 119 | 0.283935546875,7,1039,,,, 120 | 0.4345703125,7,1049,,,, 121 | 0.392333984375,7,1059,,,, 122 | 0.48046875,7,1069,,,, 123 | 0.388671875,7,1079,,,, 124 | 0.3369140625,7,1089,,,, 125 | ,7,1095,0.5916875004768372,0.715399980545044,, 126 | ,7,1095,,,0.8349999785423279, 127 | 0.36962890625,8,1099,,,, 128 | 0.5302734375,8,1109,,,, 129 | 0.42724609375,8,1119,,,, 130 | 0.4462890625,8,1129,,,, 131 | 0.56591796875,8,1139,,,, 132 | 0.60888671875,8,1149,,,, 133 | 0.5048828125,8,1159,,,, 134 | 0.439697265625,8,1169,,,, 135 | 0.50732421875,8,1179,,,, 136 | 0.488525390625,8,1189,,,, 137 | 0.4658203125,8,1199,,,, 138 | 0.429931640625,8,1209,,,, 139 | 0.425537109375,8,1219,,,, 140 | 0.58740234375,8,1229,,,, 141 | ,8,1232,0.5718500018119812,0.7099999785423279,, 142 | ,8,1232,,,0.769514262676239, 143 | 0.45751953125,9,1239,,,, 144 | 0.51953125,9,1249,,,, 145 | 0.492919921875,9,1259,,,, 146 | 0.5341796875,9,1269,,,, 147 | 0.338623046875,9,1279,,,, 148 | 0.47900390625,9,1289,,,, 149 | 0.460205078125,9,1299,,,, 150 | 0.414794921875,9,1309,,,, 151 | 0.56005859375,9,1319,,,, 152 | 0.416015625,9,1329,,,, 153 | 0.376220703125,9,1339,,,, 154 | 0.57421875,9,1349,,,, 155 | 0.51220703125,9,1359,,,, 156 | 0.49072265625,9,1369,,,, 157 | ,9,1369,0.5965374708175659,0.7035999894142151,, 158 | ,9,1369,,,0.7782571315765381, 159 | ,10,1370,,,,0.8996999859809875 160 | -------------------------------------------------------------------------------- /logs/sgd-cosine/version_0/metrics.csv: -------------------------------------------------------------------------------- 1 | train_loss,epoch,step,val_loss,val_acc,train_acc,accuracy 2 | 0.6806640625,0,9,,,, 3 | 0.74462890625,0,19,,,, 4 | 0.689453125,0,29,,,, 5 | 0.6748046875,0,39,,,, 6 | 0.67529296875,0,49,,,, 7 | 0.65380859375,0,59,,,, 8 | 0.6240234375,0,69,,,, 9 | 0.6708984375,0,79,,,, 10 | 0.67919921875,0,89,,,, 11 | 0.59619140625,0,99,,,, 12 | 0.6376953125,0,109,,,, 13 | 0.58203125,0,119,,,, 14 | 0.6298828125,0,129,,,, 15 | ,0,136,0.5218499898910522,0.8123999834060669,, 16 | ,0,136,,,0.6092285513877869, 17 | 0.48486328125,1,139,,,, 18 | 0.4482421875,1,149,,,, 19 | 0.63671875,1,159,,,, 20 | 0.4140625,1,169,,,, 21 | 0.44384765625,1,179,,,, 22 | 0.3759765625,1,189,,,, 23 | 0.521484375,1,199,,,, 24 | 0.2315673828125,1,209,,,, 25 | 0.269775390625,1,219,,,, 26 | 0.5341796875,1,229,,,, 27 | 0.23681640625,1,239,,,, 28 | 0.40625,1,249,,,, 29 | 0.303955078125,1,259,,,, 30 | 0.2156982421875,1,269,,,, 31 | ,1,273,0.22027187049388885,0.9056000113487244,, 32 | ,1,273,,,0.8375428318977356, 33 | 0.1641845703125,2,279,,,, 34 | 0.2130126953125,2,289,,,, 35 | 0.2454833984375,2,299,,,, 36 | 0.321044921875,2,309,,,, 37 | 0.1136474609375,2,319,,,, 38 | 0.2451171875,2,329,,,, 39 | 0.263427734375,2,339,,,, 40 | 0.1719970703125,2,349,,,, 41 | 0.192626953125,2,359,,,, 42 | 0.1954345703125,2,369,,,, 43 | 0.154052734375,2,379,,,, 44 | 0.2861328125,2,389,,,, 45 | 0.182373046875,2,399,,,, 46 | 0.1676025390625,2,409,,,, 47 | ,2,410,0.2152562439441681,0.9085999727249146,, 48 | ,2,410,,,0.9024571180343628, 49 | 0.2509765625,3,419,,,, 50 | 0.18505859375,3,429,,,, 51 | 0.272216796875,3,439,,,, 52 | 0.2227783203125,3,449,,,, 53 | 0.2314453125,3,459,,,, 54 | 0.0648193359375,3,469,,,, 55 | 0.142333984375,3,479,,,, 56 | 0.1201171875,3,489,,,, 57 | 0.193603515625,3,499,,,, 58 | 0.205322265625,3,509,,,, 59 | 0.2276611328125,3,519,,,, 60 | 0.1900634765625,3,529,,,, 61 | 0.138671875,3,539,,,, 62 | ,3,547,0.19834375381469727,0.9124000072479248,, 63 | ,3,547,,,0.9256571531295776, 64 | 0.26123046875,4,549,,,, 65 | 0.2301025390625,4,559,,,, 66 | 0.25341796875,4,569,,,, 67 | 0.37060546875,4,579,,,, 68 | 0.0994873046875,4,589,,,, 69 | 0.358154296875,4,599,,,, 70 | 0.087646484375,4,609,,,, 71 | 0.08575439453125,4,619,,,, 72 | 0.279541015625,4,629,,,, 73 | 0.15087890625,4,639,,,, 74 | 0.16064453125,4,649,,,, 75 | 0.10125732421875,4,659,,,, 76 | 0.1634521484375,4,669,,,, 77 | 0.1654052734375,4,679,,,, 78 | ,4,684,0.18313750624656677,0.9175999760627747,, 79 | ,4,684,,,0.9366571307182312, 80 | 0.057861328125,5,689,,,, 81 | 0.11602783203125,5,699,,,, 82 | 0.1395263671875,5,709,,,, 83 | 0.1402587890625,5,719,,,, 84 | 0.1839599609375,5,729,,,, 85 | 0.1451416015625,5,739,,,, 86 | 0.1873779296875,5,749,,,, 87 | 0.04925537109375,5,759,,,, 88 | 0.2296142578125,5,769,,,, 89 | 0.098388671875,5,779,,,, 90 | 0.11553955078125,5,789,,,, 91 | 0.055267333984375,5,799,,,, 92 | 0.285888671875,5,809,,,, 93 | 0.137451171875,5,819,,,, 94 | ,5,821,0.2120453119277954,0.9175999760627747,, 95 | ,5,821,,,0.9509999752044678, 96 | 0.148681640625,6,829,,,, 97 | 0.3046875,6,839,,,, 98 | 0.039215087890625,6,849,,,, 99 | 0.07086181640625,6,859,,,, 100 | 0.1561279296875,6,869,,,, 101 | 0.06597900390625,6,879,,,, 102 | 0.10052490234375,6,889,,,, 103 | 0.2454833984375,6,899,,,, 104 | 0.0675048828125,6,909,,,, 105 | 0.09735107421875,6,919,,,, 106 | 0.0806884765625,6,929,,,, 107 | 0.08233642578125,6,939,,,, 108 | 0.08154296875,6,949,,,, 109 | ,6,958,0.19378437101840973,0.9225999712944031,, 110 | ,6,958,,,0.9599999785423279, 111 | 0.0838623046875,7,959,,,, 112 | 0.10693359375,7,969,,,, 113 | 0.052032470703125,7,979,,,, 114 | 0.050201416015625,7,989,,,, 115 | 0.045928955078125,7,999,,,, 116 | 0.08984375,7,1009,,,, 117 | 0.044281005859375,7,1019,,,, 118 | 0.09368896484375,7,1029,,,, 119 | 0.0777587890625,7,1039,,,, 120 | 0.0462646484375,7,1049,,,, 121 | 0.157470703125,7,1059,,,, 122 | 0.051025390625,7,1069,,,, 123 | 0.06402587890625,7,1079,,,, 124 | 0.038177490234375,7,1089,,,, 125 | ,7,1095,0.19774062931537628,0.9233999848365784,, 126 | ,7,1095,,,0.9683428406715393, 127 | 0.02557373046875,8,1099,,,, 128 | 0.190185546875,8,1109,,,, 129 | 0.06500244140625,8,1119,,,, 130 | 0.04180908203125,8,1129,,,, 131 | 0.020477294921875,8,1139,,,, 132 | 0.04559326171875,8,1149,,,, 133 | 0.0330810546875,8,1159,,,, 134 | 0.1290283203125,8,1169,,,, 135 | 0.092529296875,8,1179,,,, 136 | 0.02557373046875,8,1189,,,, 137 | 0.07012939453125,8,1199,,,, 138 | 0.05755615234375,8,1209,,,, 139 | 0.062408447265625,8,1219,,,, 140 | 0.0865478515625,8,1229,,,, 141 | ,8,1232,0.22511719167232513,0.9197999835014343,, 142 | ,8,1232,,,0.9755714535713196, 143 | 0.037811279296875,9,1239,,,, 144 | 0.277099609375,9,1249,,,, 145 | 0.0276947021484375,9,1259,,,, 146 | 0.0147705078125,9,1269,,,, 147 | 0.2457275390625,9,1279,,,, 148 | 0.03521728515625,9,1289,,,, 149 | 0.01149749755859375,9,1299,,,, 150 | 0.07635498046875,9,1309,,,, 151 | 0.0094757080078125,9,1319,,,, 152 | 0.0110321044921875,9,1329,,,, 153 | 0.1259765625,9,1339,,,, 154 | 0.0243682861328125,9,1349,,,, 155 | 0.0751953125,9,1359,,,, 156 | 0.06854248046875,9,1369,,,, 157 | ,9,1369,0.25340938568115234,0.9211999773979187,, 158 | ,9,1369,,,0.980314314365387, 159 | ,10,1370,,,,0.9157000184059143 160 | -------------------------------------------------------------------------------- /plot-results.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 30, 6 | "id": "3226d0c9-2c18-46fb-ba6a-1451a48f71f0", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "### Plot\n", 11 | "import matplotlib.pyplot as plt\n", 12 | "\n", 13 | "\n", 14 | "def plot_loss_acc(which, version, plot=False):\n", 15 | " metrics = pd.read_csv(f\"logs/{which}/version_{version}/metrics.csv\")\n", 16 | "\n", 17 | " aggreg_metrics = []\n", 18 | " agg_col = \"epoch\"\n", 19 | " for i, dfg in metrics.groupby(agg_col):\n", 20 | " agg = dict(dfg.mean())\n", 21 | " agg[agg_col] = i\n", 22 | " aggreg_metrics.append(agg)\n", 23 | "\n", 24 | " df_metrics = pd.DataFrame(aggreg_metrics)\n", 25 | " df_metrics[[\"train_loss\", \"val_loss\"]].plot(\n", 26 | " grid=True, legend=True, xlabel=\"Epoch\", ylabel=\"Loss\"\n", 27 | " )\n", 28 | " plt.ylim([0., .6])\n", 29 | " if plot:\n", 30 | " \n", 31 | " plt.savefig(f\"{which}-{version}-loss.pdf\")\n", 32 | "\n", 33 | " df_metrics[[\"train_acc\", \"val_acc\"]].plot(\n", 34 | " grid=True, legend=True, xlabel=\"Epoch\", ylabel=\"ACC\"\n", 35 | " )\n", 36 | "\n", 37 | " plt.ylim([.6, 1.])\n", 38 | " if plot:\n", 39 | " plt.savefig(f\"{which}-{version}-acc.pdf\")\n", 40 | "\n", 41 | " plt.show()" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 38, 47 | "id": "0ad6cb52-ed58-4806-9bbc-7d9788ab47f1", 48 | "metadata": {}, 49 | "outputs": [ 50 | { 51 | "data": { 52 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEKCAYAAAAfGVI8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA0vElEQVR4nO3dd3xV9fnA8c+TPUlCQkLIImzZIyRBHMGJoFIXZWm1VYpKHa1Wsdtqta3dUilatQoKigsVpb8iAQd7g+yRxQqBQEIIWd/fH+cSkhAghJycm9zn/Xrd1733jHuf+yWc55zvOmKMQSmllOfycjoApZRSztJEoJRSHk4TgVJKeThNBEop5eE0ESillIfTRKCUUh7O1kQgIsNFZKuI7BCRJ8+yTYaIrBWRTSKyyM54lFJKnUnsGkcgIt7ANuBaIBdYAYw1xnxbY5tw4BtguDEmW0SijTEHbQlIKaVUvey8IkgFdhhjdhljyoBZwKg624wD3jfGZANoElBKqebnY+NnxwE5Nd7nAml1tukG+IpIJhAK/M0Y80bdDxKRicBEgMDAwEEJCQmNCqiqqgovL20WOUXLozYtj9O0LGprDeWxbdu2Q8aYdvWtszMRSD3L6tZD+QCDgKuBQGCJiCw1xmyrtZMx04HpACkpKWblypWNCigzM5OMjIxG7dsaaXnUpuVxmpZFba2hPEQk62zr7EwEuUDNU/d4YG892xwyxhwHjovIYqAfVtuCUkqpZmDntc4KoKuIJIuIHzAGmFtnm4+Ay0XER0SCsKqONtsYk1JKqTpsuyIwxlSIyGRgPuANvGqM2SQik1zrpxljNovI58B6oAp4xRiz0a6YlFJKncnOqiGMMfOAeXWWTavz/o/AH+2MQynl3srLy8nNzaW0tNTpUOoVFhbG5s0to7IiICCA+Ph4fH19G7yPrYlAKaUaIjc3l9DQUDp27IhIff1MnFVUVERoaKjTYZyXMYaCggJyc3NJTk5u8H4tuz+UUqpVKC0tJTIy0i2TQEsiIkRGRl7wlZUmAqWUW9Ak0DQaU46aCJRSysNpIlBKKQ+niUAp5fEKCwv55z//ecH7jRgxgsLCwgve7+6772bOnDkXvJ9dNBEopTze2RJBZWXlOfebN28e4eHhNkXVfLT7qFLKrfzm4018u/dYk35mzw5t+NVNvc66/sknn2Tnzp30798fX19fQkJCiI2NZe3atXz77beMHTuWffv2UVpaysMPP8zEiRMB6NixIytXrqS4uJgbbriByy67jG+++Ya4uDg++ugjAgMDzxvbggULeOyxx6ioqGDw4MG89NJL+Pv78+STTzJ37lx8fHy47rrreOGFF3j33Xf5zW9+g7e3N2FhYSxevLhJykcTgVLK4z3//PNs3LiRtWvXkpmZyciRI9m4cWN1X/ypU6eSlJTEiRMnGDx4MLfddhuRkZG1PmP79u28/fbbvPzyy4wePZr33nuPCRMmnPN7S0tLufvuu1mwYAHdunXjrrvu4qWXXuKuu+7igw8+YMuWLYhIdfXT008/zfz584mLi2tUldTZaCJQSrmVc525N5fU1NRaA7KmTZvGvHnWJAk5OTls3779jESQnJxM//79ARg0aBB79uw57/ds3bqV5ORkunXrBsD3vvc9pk6dyuTJkwkICODee+9l5MiR3HjjjQAMHTqUu+++m9GjR3Prrbc2wS+1aBuBUkrVERwcXP06MzOTzMxMlixZwrp16xgwYEC9A7b8/f2rX3t7e1NRUXHe7znbHSJ9fHxYvnw5t912Gx9++CHDhw8HrIT0zDPPkJOTQ//+/SkoKLjQn1b/9zXJpyilVAsWGhpKUVFRveuOHj1KeHg4QUFBbNmyhaVLlzbZ9/bo0YM9e/awY8cOunTpwptvvsmVV15JcXExJSUljBgxgvT0dLp06QLAzp07SUtLIy0tjY8//picnJwzrkwaQxOBUsrjRUZGMnToUHr37k1gYCAxMTHV64YPH86LL75I37596d69O+np6U32vQEBAbz22mvccccd1Y3FkyZN4vDhw4waNYrS0lKMMfzlL38B4PHHH2f79u0YY7j66qvp169fk8ShiUAppYC33nqr3uX+/v68//779U46d6odICoqio0bT8+g/9hjj53zu15//fXq11dffTVr1qyptT42Npbly5efsd/7779/zs9tLG0jUEopD6dXBEopZZMHH3yQr7/+utayhx9+mHvuucehiOqniUAppWwydepUp0NoEK0aUkopD6eJQCmlPJwmAqWU8nCaCJRSysNpIlBKqUYICQk567o9e/bQu3fvZozm4mgiUEopD6fdR5VS7uWzJ2H/hqb9zPZ94Ibnz7nJE088QVJSEg888AAAv/71rxERFi9eTEFBAZWVlTzzzDOMGjXqgr66tLSU+++/n5UrV+Lj48Of//xnhg0bxqZNm7jnnnsoKyujqqqK9957jw4dOjB69Ghyc3OprKzkF7/4Bd/97ncb/bMbShOBUkoBY8aM4ZFHHqlOBO+88w6ff/45jz76KCLCyZMnSU9P5+abb0ZEGvy5p8YSbNiwgS1btnDdddexbds2pk2bxsMPP8z48eMpKyujsrKSefPm0aFDBz799FPAmvCuOWgiUEq5l/OcudtlwIABHDx4kL1795Kfn09ERASxsbE8+uijZGZm4uPjQ15eHgcOHKB9+/YN/tyvvvqKH/3oR4A122hSUhLbtm1jyJAhPPvss+Tm5nLrrbfStWtX+vTpw2OPPcYTTzzBjTfeyOWXX27Xz61F2wiUUsrl9ttvZ86cOcyePZsxY8Ywc+ZM8vPzWbx4MWvXriUmJqbeexGcy9nuOTBu3Djmzp1LYGAg119/PV988QXdunVj1apV9OnThylTpvD00083xc86L1sTgYgMF5GtIrJDRJ6sZ32GiBwVkbWuxy/tjEcppc5lzJgxzJo1izlz5nD77bdz9OhRoqOj8fX1ZeHChWRlZV3wZ15xxRXMnDkTgG3btpGdnU337t3ZtWsXnTp14qGHHuLmm29m/fr17N27l6CgICZMmMBjjz3G6tWrm/on1su2qiER8QamAtcCucAKEZlrjPm2zqZfGmNutCsOpZRqqF69elFUVERcXByxsbGMHz+em266iSuvvJKBAwfSo0ePC/7MBx54gEmTJtGnTx98fHx4/fXX8ff3Z/bs2cyYMQNfX1/at2/PL3/5S1asWMHjjz+Ol5cXvr6+vPTSSzb8yjPZ2UaQCuwwxuwCEJFZwCigbiJQSim3sWHD6R5LUVFRLFmyhKKiojPuR1BcXHzWz+jYsWP1/QkCAgJq3X/glClTpjBlypRay66//nquv/76i4i+ceysGooDcmq8z3Utq2uIiKwTkc9ExPm7ViullIex84qgvv5VdVtNVgNJxphiERkBfAh0PeODRCYCEwFiYmLIzMxsVEDFxcWN3rc10vKoTcvjtOYui7CwsLPeM9gdVFZW1hvfpk2bmDhxYq1lfn5+LFy4sLlCq1dpaekF/fvJ2Vq0L5aIDAF+bYy53vV+CoAx5rlz7LMHSDHGHDrbNikpKWblypWNiikzM5OMjIxG7dsaaXnUpuVxWnOXxebNm+nRo8cF9c9vTvVVDbkrYwxbtmzhkksuqbVcRFYZY1Lq28fOqqEVQFcRSRYRP2AMMLdOYO3F9S8vIqmueApsjEkp5YYCAgIoKCg4a1dL1TDGGAoKCggICLig/WyrGjLGVIjIZGA+4A28aozZJCKTXOunAbcD94tIBXACGGP0L0EpjxMfH09ubi75+flOh1Kv0tLSCz64OiUgIID4+PgL2sfWkcXGmHnAvDrLptV4/SLwop0xKKXcn6+vL8nJyU6HcVaZmZkMGDDA6TBsoyOLlVLKw2kiUEopD6eJQCmlPJwmAqWU8nCaCJRSysNpIlBKKQ+niUAppTycJgKllPJwmgiUUsrDaSJQSikPp4lAKaU8nCYCpZTycJoIlFLKw2kiUEopD6eJQCmlPJwmAqWU8nCaCJRSysNpIlBKKQ+niUAppTycJgKllPJwmgiUUsrDaSJQSikPp4lAKaU8nCYCpZTycJoIlFLKw2kiUEopD6eJQCmlPJwmAqWU8nC2JgIRGS4iW0Vkh4g8eY7tBotIpYjcbmc8SimlzmRbIhARb2AqcAPQExgrIj3Pst3vgfl2xaKUUurs7LwiSAV2GGN2GWPKgFnAqHq2+xHwHnDQxliUUkqdhY+Nnx0H5NR4nwuk1dxAROKAW4CrgMFn+yARmQhMBIiJiSEzM7NRARUXFzd639ZIy6M2LY/TtCxqa+3lYWcikHqWmTrv/wo8YYypFKlvc9dOxkwHpgOkpKSYjIyMRgWUmZlJY/dtjbQ8atPyOE3LorbWXh52JoJcIKHG+3hgb51tUoBZriQQBYwQkQpjzIc2xqWUUqoGOxPBCqCriCQDecAYYFzNDYwxyadei8jrwCeaBJRSqnnZlgiMMRUiMhmrN5A38KoxZpOITHKtn2bXdyullGo4O68IMMbMA+bVWVZvAjDG3G1nLEoppeqnI4uVUsrDaSJQSikPp4lAKaU8nCYCpZTycJoIlFLKw2kiUEopD6eJQCmlPJxHJYJjZXWnOlJKKeUxieCjtXk8srCErILjToeilFJuxWMSQXqnSADeWpbtcCRKKeVePCYRxLQJYGC0N++szKG0vNLpcJRSym14TCIAuCrRlyMl5Xy2cZ/ToSillNvwqERwSVsvOkUFM2OpVg8ppdQpHpUIRIRxaYmsyjrC5n3HnA5HKaXcgkclAoDbB8Xj7+PFjKVZToeilFJuweMSQXiQHzf168CHa/IoPlnhdDhKKeU4j0sEABPSkzheVskHa/KcDkUppRznkYmgX3wYvePaMHNpFsboaGOllGfzyEQgIkxIS2LL/iJWZR1xOhyllHKURyYCgJv7dyDU30cbjZVSHs9jE0GQnw+3Doxj3ob9FBSfdDocpZRyjMcmAoDx6UmUVVbx7qpcp0NRSinHNCgRiEiwiHi5XncTkZtFxNfe0OzXLSaU1OS2vLUsm6oqbTRWSnmmhl4RLAYCRCQOWADcA7xuV1DNaUJ6EtmHS1i8Pd/pUJRS7ih7GW2ObnY6Cls1NBGIMaYEuBX4hzHmFqCnfWE1n+G92hMV4qfzDymlzrRhDrx2AwPXPAnv3AWFrfM40eBEICJDgPHAp65lPvaE1Lz8fLwYnZLAF1sOkFd4wulwlFLuYvWb8N69kJjO7o5jYdt/4cXBsPA5KCtxOrom1dBE8AgwBfjAGLNJRDoBC22LqpmNTU3EALOWt85sr5S6QMumw9zJ0HkYjJ9DVscxMHkFdL8BFj0PU1Nh04fQSgakNigRGGMWGWNuNsb83tVofMgY89D59hOR4SKyVUR2iMiT9awfJSLrRWStiKwUkcsa8RsuWkLbIIZ1j2bWihzKK6ucCEEp5S6++it89jh0HwljZ4FfkLU8PAHueB3u/hQCwuDd78F/boIDm5yMtkk0tNfQWyLSRkSCgW+BrSLy+Hn28QamAjdgtSeMFZG67QoLgH7GmP7A94FXLjD+JjMhPZH8opP8d9MBp0JQSjnJGFj4O/jfr6D3bTD6P+Djf+Z2HS+DiYtg5J/gwEaYdhl8+hiUHG7+mJtIQ6uGehpjjgHfAeYBicCd59knFdhhjNlljCkDZgGjam5gjCk2pyf7CQYcu866sls0ceGBzFymI42V8jjGwH9/Dot+D/0nwK0vg/c5esh7+8Dge+FHqyHl+7Dy3/CPgbDiFahqebfClYZMuiYim4D+wFvAi8aYRSKyzhjT7xz73A4MN8bc63p/J5BmjJlcZ7tbgOeAaGCkMWZJPZ81EZgIEBMTM2jWrFkN/Hm1FRcXExISctb1n+wsY872cp67LJDYkNY/1u585eFptDxO86iyMFV03T6duL2fkddhBNu73gdS+///+cojuHgPXXa8TEThRoqDk9ne9T6OhveyO/ILMmzYsFXGmJR6VxpjzvsAHgLysK4GBEgCvjzPPncAr9R4fydW19OzbX8F8L/zxTJo0CDTWAsXLjzn+vyiUtPlqU/Nb+ZuavR3tCTnKw9Po+VxmseURWWFMR/cb8yv2hgz/+fGVFXVu1mDyqOqypiN7xvzp57W571ztzGFOU0b70UAVpqzHFcb2lj8d2NMnDFmhOszs4Bh59ktF0io8T4e2HuO71gMdBaRqIbEZIeoEH+G945lzqocTpS1vMs7pdQFqCyH934Aa2dCxlNw7dMg0vjPE4Fet1i9i658ErbOg3+kwKI/QLl7d01vaGNxmIj82dWzZ6WI/AmrTv9cVgBdRSRZRPyAMcDcOp/bRcQqeREZCPgBBRf8K5rQhLREjpVW8PH6s+YspVRLV14Ks++ETR/Atb+FjCcuLgnU5BcEw6bAg8uh23Ww8Fmru+m3c922u2lDK8JfBYqA0a7HMeC1c+1gjKkAJgPzgc3AO8YagzBJRCa5NrsN2Cgia7F6GH3XdQnjmNTktnSLCWGmTk+tVOtUVgJvj4Ftn8GIF2DoeXvCN05EEox+A773MfiFwDt3whuj4KD7TVfR0ETQ2RjzK2P1ANpljPkN0Ol8Oxlj5hljuhljOhtjnnUtm2aMmeZ6/XtjTC9jTH9jzBBjzFeN/ylNQ0QYn5bEutyjbMg96nQ4SqmmVHoMZtwGuxfBqH9C6n32f2fyFfDDL+GGP8K+dfDSUPjsCTjhPjfFamgiOFFzsJeIDAXcu9LrItwyMI5AX2+9aY1SrUnJYeuMPHc53PYKDBjffN/t7QNpE63upoO+B8v+Bf8YBCtfc4vupg1NBJOAqSKyR0T2AC8CP7QtKoe1CfBlVP8OfLQuj6Mnyp0ORyl1sYrzXaOAN8LoN60BY04IjoQb/wI/XAxR3eGTR2B6BmSd0Wu+WTW019CpMQN9gb7GmAHAVbZG5rAJ6UmUllfx/mq9aY1SLdqxvfD6CCjYaU0Z0WOE0xFBbF+4Zx7c9m8oKYDXhsOcH8DRPEfCuaBRU8aYY8YaYQzwYxvicRu948LolxDOzGXZONx+rZRqrCNZ8NoNVjKY8B50udrpiE4TgT63W91Nr3gcNn8ML6bA4hesXk3N6GKGzzZRXyv3NSEtkR0Hi1m6q+XOIaKUxzq0w0oCJ47AXXOh41CnI6qfXzBc9XOYvBw6XwVf/Bb+mQabP2m27qYXkwha/WnyTf06EBboywydf0ipluXAt1YSqDhpzRYaP8jpiM4voiOMmQl3fgg+ATB7PLx5C+Rvtf2rz5kIRKRIRI7V8ygCOtgencMCfL25fVA88zfu52BR816qKaUaae8aeH0keHlb9fDt+zgd0YXpPAwmfQXDn4e81fDSpfD5FDhRaNtXnjMRGGNCjTFt6nmEGmNaxR3Kzmd8WiIVVYZ3VuQ4HYpq7Q5utu5+dXCL05G0XNnL4D83WwO47pkH7bo7HVHjePtC+v3w0GoYMAGWvmR1N90wx5ava/1TbF6kTu1CGNolkreX51BZ1eprw5QTjhfApz+xzvwWPQ/ThsL8n1mDn1TD7VpkVaUER1lJoO15x7y6v+AouOlvMDETIjtDWbEtX6OJoAEmpCWRV3iChVsOOh2Kak0qyuCbF+HvA6yBRYPvhckrof94WDLV6kGybrbbzk/jVrb/H7w1GsIT4Z7PrLuJtSYd+sP358OAu2z5eE0EDXBNzxiiQ/210Vg1DWNgy6dWz5D//gwSBsP938CIP0JUV7j573DvAmgTBx9MhNdGwP6NTkftvr6dC2+PtaqB7v4UQts7HZE9RMDLnkO2JoIG8PX2YkxqIou25ZNzuMTpcFRLtn8jvHEzzBoHXr4wfo7Vvz26R+3t4gdZyeCmv0P+FvjX5TDvp7Y2GLZI69+Bd++GDgOsLqLBkU5H1CJpImigsakJeIkwc1m206Golqg4Hz5+2Dqg799gTUB2/9fQ9dqz7+PlZc1L86NV1u0QV7xsNRiumQFVVc0Xu7ta9Tq8PxGSLoU7P4DAcKcjarE0ETRQbFggV/eI5p2VOZyscH6SKNVCVJyEr/5qtQOsmQFpk+ChNdYEZOe6J25NQW2tG6VPzLQaQD96EF69zuom6amWvmQl1i7XwPh3wd9DbqtpE00EF2BCehKHj5fx+cb9Toei3J0xVt311FT436+sUa0PLIXhz0FgROM+M7af1WD4nWnW1AnTh8Enj1qzanqSxS/A509CjxutAVi+gU5H1OJpIrgAl3WJIikyiJlLtXpIncO+dfD6jdaNSHyDrGqLcbOthuCL5eUF/cfCj1Za/cxX/Qf+MRBWvuoW0xnbyhhY8FtrCoY+d8Ad/wEff6ejahU0EVwALy9hfFoiy/ccZuv+IqfDUe6maL9VbfOvKyF/M4z8s3VDks42TNQbEGZdXUz6EqJ7WlcGL18FuSub/rvcgTEw/yn48gUYeBfc8i9rjn/VJDQRXKDbByXg5+PFTO1Kqk4pL4Uv/2Q15K6bDZdOtm5AMvgH9h+sYnpZXSZv+zcUH4BXrraS0fFD9n5vc6qqsubtX/pPq43lpr9b00eoJqOJ4AK1DfZjZJ9Y3l+dx/GTFU6Ho5xkDGx8H14cDAuehk4Z8OAyuO6Z5u3BUnM640sfgnWzrOqiZdOhsoX/jVZWwIeTrB5Cl/3Ymn+nqW4yr6ppImiECemJFJ+s4KO1e50ORTklbzW8Ohzm3GNV03zvY6vhMrKzczH5h8J1v4X7l1j96j973C3uftVoFWVW+a6fbU3TfM2vNAnYRCvZGmFgYgQ92ocyY2kWY1MTEP3j9BzH9lpn/+vehuB2VjXFgAnuVVXRrps1lfHmufD5U9bdr/p+F6592r1H3Z4shrxV1j2Fc1ZYzyeOwPW/gyEPOh1dq6aJoBFEhAnpSfz8w42sySlkYGIjuwOqlqOsBJa8CF/9BaoqYOgjcPlPIKCN05HVTwR6jrL62X/5Z/jm77BlHgybAqkXMIbBLsbAkT2Qs9x14F8GBzaBcQ2Ui+pudQ+95Cbodr2joXoCTQSN9J0BcTw3bzMzlmZpImjNjLGm/v3fr+BYnnVwveY30DbZ6cgaxi8Yrv4F9B8Hnz1h9bxZ/SaM+AMkX9F8cZSfsAbA5Sw/ffA/nu+KMQTiU+DyxyAhzZpeo7FjLVSjaCJopBB/H24ZGMc7K3P5xcieRAT7OR2Samo5K2D+FMhdYQ3muvVl973d4flEdrZG4G79zBqM9Z+boNetVsN2WFzTf9/RXOssP2eF9bx/vXUlBdC2s3WlkpAK8akQfYl7Va15IE0EF2FCehIzlmYzZ1Uu913RCuY+V5ajufC/X8OGdyEkBkb9E/qNtW3mx2YjAj1GWHfA+vpvVjXXtvlw5eOQ/iD4NPJkpuIk7Ft/uoonZwUUuTpS+ARC3CC49Eeus/3B1hz7yq1oIrgIPdq3ISUpgpnLsvjBZcl4eWmjcUvmVVkKC38HX/8dMFZVxWWPtr55bHwDIeNJ6DfGakz+36+teZBu+AN0ufr8+xftr1G3vxz2roXKk9a68ERrEriENGt67ZjezrdHqPPSRHCRJqQn8cjstXy98xCXd23ndDiqoYyB0qNQfNAaiJW/hbRlv4Oyw9D7Nrjm19ZBrTWL6Ahj37Ju6vLZT2HGrVbj7PW/O71NZTkc2Hi6iid3ORS6pljx9rdumJJ6n+vAn+revZLUWdmaCERkOPA3wBt4xRjzfJ3144EnXG+LgfuNMevsjKmp3dCnPU9/4seMpVmaCNxBRRkcdx3ciw9aZ6+nDva1HgehorTWridDu+I/4W1ITHcoeId0vRaSl1q9oha/ANtT6R41FHb/EfauhnLXPThCY62Dfdokq24/tq/O9dNK2JYIRMQbmApcC+QCK0RkrjHm2xqb7QauNMYcEZEbgOlAml0x2cHfx5s7UuJ55cvd7D9aSvuwAKdDan2MgdJCKKpxEC/eX//B/sRZZuIMbGudrYZEQ+IQq+7/1CM0BkLas3pjLhmelgRO8fG3usP2GQ3//Tkxmz+F2D4w8HtWFU98KoTF64CuVsrOK4JUYIcxZheAiMwCRgHVicAY802N7ZcC8TbGY5vxqUlMX7yLt5dn8+i13ZwOp2UpPmhVNZw6Uz/jYO86wFeWnbmvt7/rIB5j9YpJurTGgT3GOuiHtLcGfjWkIVR0pDjhCTD6PyxeuJCMYcOcjkY1EzsTQRyQU+N9Luc+2/8B8Fl9K0RkIjARICYmhszMzAsORqoqOH78eKP2bYjekd7856sd9PHOw6eFNBoXFxfbVh5nMIaA0v2EFu0ipHgXIcW7CSnehX/ZkTM2LfNtQ5lfhPUI6ExZm8GU+YWfXuYXQZlfOBU+wfWfoRa5HtUvtjcoxGYtDzdXbOP/lZaotf9t2JkI6jsamno3FBmGlQguq2+9MWY6VrURKSkpJiMj48Kj2fIpVbPvwSs80RoMFNERIpJdr13vL6J3SHn0Ae57YyUV0T24pndsoz+nOWVmZtKosjyfynLI32r1Hd+33nrevwFOHrPWize06wGXDIf2fax+5SHRVtVNcDv8vH1xYlSGbeXRAmlZ1Nbay8PORJALJNR4Hw+cce0tIn2BV4AbjDEFtkUTkUxOwi0khVZaQ9vzVlv1zjUFt6uRHDrWThQh0eesH72qRzQdwgKYsTSb4S0kETSJshJraoD966yD/r51cHDz6e6EPoHWVMl97rAaF9v3tebP99W2FKXchZ2JYAXQVUSSgTxgDDCu5gYikgi8D9xpjNlmYywQ05Pdne4kqWZWP3EEDu+2EsOR3adfZ30D69+h1gWMb1Cd5FDjdVgC3j5+jE1N5E//t43dh46THBVs689xRMnh2mf5+9ZDwfbT88MEhFsH+9T7rJG47ftad+XSUaNKuTXbEoExpkJEJgPzsbqPvmqM2SQik1zrpwG/BCKBf7pm8KwwxqTYFdMZAiMgLgLiBp65ruKk1Yh5ZI8rQbgSxeFdsPMLqDhxelvxgjbx/DAskXa+fuz+4EuSL007nSgCwprtJzUJY6x5dWoe8Pevh6M1mnzaxFkH+l7fsZ5j+0JYgvYqUaoFsnUcgTFmHjCvzrJpNV7fC9xrZwyN5uNvnc3Wd59ZY6wui7WuJHbjd2QPI/02Epr3Bbz70untAyNqX0m06WD1ePH2s+5g5e0HXr7WCExvX9dyX9cyv9rL6253sWfbVZVQsNN1wF93+sBf3Q1TILKL1X988L2u6p1+EBx5cd+rlHIbOrK4MUSgTaz1SBpSa9WGHYeY+MpC/npdBNe0L6ld5ZS3CjZ9CKYpbzIurmTR0KTiU739gL3b4euc0wOGvP2sCcB6jDxdtRPTq/VNsaCUqkUTQRMb0jmS6HbtmLrFl2uuuubMDSrLoaTAeq4qt54ry1zPp5bVeF9ZZs3aWFnmerheV+9bY/vqfWtsX72va9uyEqg6CpXlGPG2bgR+qmonqnvjJx5TSrVYmgiamIgwPi2J337yLZv2HqVXhzrtA96+bjMfy9pW3iVOKdUwLXxeXfd0+8B4Any9mLE02+lQlFLqvDQR2CAsyJeb+nbgo7V5FJWWOx2OUkqdkyYCm0xIT6KkrJIP1uQ5HYpSSp2TJgKb9EsIp09cGDOWZmFMvTNrKKWUW9BEYKMJ6YlsO1DMij1nTqymlFLuQhOBjW7q14HQAB9mLM1yOhSllDorTQQ2CvLz4baB8Xy2cR+Hik86HY5SStVLE4HNJqQnUl5peGdlzvk3VkopB2gisFmX6FDSO7XlrWXZVFZpo7FSyv1oImgGE9KTyD1ygsXb8p0ORSmlzqCJoBlc17M9USH+2mislHJLmgiagZ+PF2MGJ/DF1oPkHilxOhyllKpFE0EzGZuWiABvL9f5h5RS7kUTQTOJCw/kqh7RzF6RQ1lFldPhKKVUNU0EzWh8ehKHisuYv2m/06EopVQ1TQTN6Iqu7YiPCOSVr3aTX6QDzJRS7kETQTPy9hIeyOjCupxCLn1+AQ++tZolOwt0UjqllKP0DmXNbFxaIqnJbXl7eTZzVuXy6fp9dGoXzPi0JG4bGEd4kN4qUinVvPSKwAFdokP4xY09WfbU1fzpjn6EB/ry20++Je13C/jJO+tYnX1ErxKUUs1GrwgcFODrzW2D4rltUDzf7j3GzGVZfLgmj/dW53JJbBvGpyXynQFxhPjrP5NSyj56ReAmenZow7O39GHZz67h2Vt6A/DzDzeS9uz/+NkHG/h27zGHI1RKtVZ6qulmQvx9GJ+WxLjURNbmFDJzmdWWMHNZNgMSwxmflsSNfWMJ8PV2OlSlVCuhVwRuSkQYkBjBC3f0Y/lT1/CLG3ty9EQ5j727jrTfLeDpj79lZ36x02EqpVoBvSJoAcKCfPnBZcl8f2hHlu46zMxlWby5dA+vfr2bIZ0iGZ+eyHU92+Pno3ldKXXhbE0EIjIc+BvgDbxijHm+zvoewGvAQOBnxpgX7IynpRMRhnSOZEjnSPKLTvLuqhzeWpbN5LfWEBXix+iUBMamJpLQNsjpUJVSLYhtiUBEvIGpwLVALrBCROYaY76tsdlh4CHgO3bF0Vq1C/XngYwuTLqiM4u35zNjaTbTFu3kpUU7ubJbO8anJXFVj2i8vcTpUJVSbs7OK4JUYIcxZheAiMwCRgHVicAYcxA4KCIjbYyjVfPyEjK6R5PRPZq9hSeYtSKHWcuzue+NlXQIC2BMaiLfHZxATJsAp0NVSrkpOyuV44CaN+rNdS1TNukQHsiPr+3G109exbQJg+gcHcKf/28blz7/BZPeXMWX2/Op0ttlKqXqsPOKoL46iUYdhURkIjARICYmhszMzEYFVFxc3Oh9W5oA4Aed4cb2gWTmVvDltv18vmk/0UFCRoIPl8f5ImXHPaY8GsKT/j7OR8uittZeHnYmglwgocb7eGBvYz7IGDMdmA6QkpJiMjIyGhVQZmYmjd23JfsucLKiks837mfm0mze2XqYD3dUkhLjyy9HD6RH+zZOh+gWPPXvoz5aFrW19vKwMxGsALqKSDKQB4wBxtn4feoc/H28GdU/jlH949h2oIiZS7OYtTyL4X/9kqt6RDPpys4M7hiBiDYuK+VpbEsExpgKEZkMzMfqPvqqMWaTiExyrZ8mIu2BlUAboEpEHgF6GmN0PgUbdYsJ5TejejM4MJ9d3vG8/s0eRv9rCQMTw5l0ZWeuuSQGL+1tpJTHsHUcgTFmHjCvzrJpNV7vx6oyUg4I8RMeyujKfZd34t1VOUxfvIuJb66iS3QIE6/oxHf6x+kgNaU8gP4vVwT6eXPXkI5kPpbB38b0x8dL+Omc9Vzxh4W88uUuik9WOB2iUspGmghUNR9vL0b1j+Ozhy/n9XsG0zEqiGc+3cylzy3ghflbOVSst9dUqjXSuYbUGUROD1Jbk32EaYt2MjVzBy9/uYs7UuKZeHlnEiN1GgulWgtNBOqcBiRG8K87U9iZX8z0RbuYvcKa32hEn1gmXdmZ3nFhToeolLpImghUg3RuF8Lvb+/Lj6/rxqtf7Wbmsmw+Wb+Py7tGcf+VnRnSOVK7nirVQmkbgbogMW0CmDLiEr5+8ip+Orw7m/cVMe6VZYya+jXzNuyjUqewUKrF0USgGiUs0JcHMrrw1RPDePaW3hw9Uc4DM1dzzZ8X8fbybErLK50OUSnVQJoI1EUJ8PVmfFoSX/wkg6njBhLi78OU9zdw+R8W8lLmTo6VljsdolLqPLSNQDUJby9hZN9YRvRpzzc7C5i2aCe//3wL/1y4g3HpifxgaDLROhW2Um5JE4FqUiLC0C5RDO0Sxca8o0xbtJOXF+/ita/2cOvAOCZe0YlO7UKcDlMpVYMmAmWb3nFhvDhuIFkFx5m+eBfvrspl9socru/ZnkkZnemfEO50iEopNBGoZpAUGcyzt/ThkWu68fo3u3lzSRafb9rPkE6RTMrozBVdo7TrqVIO0sZi1Wzahfrz+PU9+GbK1fxsxCXsOlTM915dzvV/XcyMpVkc1zmNlHKEJgLV7EL8fbjvik4s/ukw/nB7X3y9vfj5hxtJ/90Cfj13EzsOFjsdolIeRauGlGP8fbwZnZLAHYPiWZ1dyBtL9jBzWRavf7OHy7pEceeQJK7uEY2Pt56vKGUnTQTKcSLCoKQIBiVF8PORPZm9IpuZy7L54Zur6BAWwPj0JMYMTiAyxN/pUJVqlfRUS7mVdqH+TL6qK1/+dBjTJgykY1Qwf5y/lSHPfcGjs9eyJvsIxug0Fko1Jb0iUG7Jx9uL4b1jGd47lu0HinhzaRbvrcrlgzV59IkL464hSdzUrwMBvt5Oh6pUi6dXBMrtdY0J5elRvVn2s2v47ahenCiv5PE560l/bgHPzdtMzuESp0NsMkWl5XrFo5qdXhGoFiPE34c7h3RkQnoSS3YV8OaSLF75ajfTv9zFVd2juXNIEld0bYeXV8sYk3D8ZAXrc4+yNqeQtTlHWJdzlP3HSgn09SaxbRCJkUEktg0iqfo5mLjwQL2PtGpymghUiyMiXNo5iks7R7Hv6AneWpbN28uzWfDaQTpGBjEhPYk7BiUQFuTrdKjVKqsM2w4UsTankHU5hazNKWTbgSJOzdqd2DaI1OS2dG8fyuHjZWQVlJBVcJwvt+dTWl5V/TleArFhgSRFWgkioW0QSW2DrWQRGUSbAPf5zarl0ESgWrTYsEB+cl13Jl/Vhc837ueNJVk88+lmXvjvVr7TP447hyTRq0Pz30Vt39ETrM0uZG1uIWuzC9mQd5SSMmtq7rBAX/olhHNdr/YMSAinX0I4bYP96v0cYwz5RSfJOlxCVkEJ2QXHyT5cQtbhEv676QAFx8tqbR8e5EtS2yASI4OtZ9eVRVJkEDGhAS3makk1L00EqlXw9/FmVP84RvWPY2PeUd5cksWHa/OYtSKHlKQI7hySxA29Y22pVik+WcGGGlU8a3MKOXDsJAC+3kLP2DbcMSie/onh9E+IoGNkUIOn1BARotsEEN0mgMEd256xvqi0nOzDJeS4EkXW4RKyC0pYl1N4xo2C/Hy8SIgIJCkyuE6VUxDxEUHa8O7BNBGoVqd3XBi/v70vT424hHdX5fDm0iwenrWW34ZsZlxqAuPSkmgf1rgpsSsqq9h+sNg66GdbVTzbD56u4kmKDCK9UyT9E8LpnxBOzw5t8Pex7wAbGuBLrw5h9V71lFdWsbfwhHUlcdh6ZBUcJ6ughKW7CqqvUABEoH2bAFdVUxCVx8o4Gp5HYlur+iky2M9j54MqKi2nqMxQXlmFbysd3KiJQLVaYUG+3Ht5J74/NJlF2/N5c0kW/1i4g6mZO7m+Vwx3pnckvVPbcx7gqqt4cgpZk1PIxhpVPOFBvvSLD2d47/bW2X58OBFnqeJxgq+3F0mRwSRFBp+xzhhDgastIvvwcbILTpB1+DjZBSVkbssnv6ic97evrd4+yM+7Oikktg0iISKwujG7JV9NGGPILz5J3pET7C0sJa+whLwjJ8grPEGu67mo1DUH1hefEejrTWiAj+vhS2iAD21czzWX1V1Xcxt3HCmviUC1el5ewrDu0QzrHk12QQkzlmUxe0UO8zbsp1tMCHemJ3HLwHhOVBi+2Xmo+mx/Xe7pKh4/by8u6dCG0SkJ1Wf7SRdQxeNuRISoEH+iQvwZlBRxxvr5/1tIcp8Ucg6fvprIcV1RfLX9ECfq3Io0po0/CRFBtZLFqUTRLsTfsbaJ8soq9h8trT6oWwd812vXo6yiqtY+oQE+xIUHEhceSGpyW+LCA8nevYuYhI7W1UFpBUWlFRxzvd7rShZFpRVnlEt9GppM2tSTVNqG+BHi3/SHbU0EyqMkRgbx1IhL+PG13Zi7bi9vLNnDLz7axLPzNnOyvArDMgA6RgYx5FQVT2IEl8SG2lrF4278fYRuMaF0iwk9Y50xhkPFZdXJoWayWLqrgA/W5lFzKMSptonEtqcTRUKN1xdzYDt+0joQ57oO8nk1nvcWnuDAsVKq6gzLaBfqT1x4ID07tOG6njF0cB304yKsR309rzJNDhkZXc8bT3lllSsplNdKFjWXnS2ZHHOtq9lLrK6JV3TiqRGXXHA5nY8mAuWRAnxPT3i3JqeQD9fkcSx/L9+5vD/93KyKx92ICO1C/WkXWv/VxMmKSvYWllYnh9waiWLlniMU1ZluPDLYr0ZyCDydLCKCCPLzrj6o59Y50OcVnqCwpPY9sX28hNjwAOLCA7m0cxRxEYHEhwdaB/uIQGLDAmytxvL19qJtsN9Ze4E1xLmSSZdoe+7uZ2siEJHhwN8Ab+AVY8zzddaLa/0IoAS42xiz2s6YlKpJRBiYGMHAxAgyMw+R0T3a6ZBaPH8fb5KjgkmOqr9t4uiJcnIOn6hODtmHS8g9UsL63EI+27CPirqn8DUE+3kTF2Ed2PsnhFtn8eGBxEcEEhceRLtQf7xbeBfZpkgmF8q2RCAi3sBU4FogF1ghInONMd/W2OwGoKvrkQa85HpWSrVCIkJ4kB/hQX70iT+zp1NFZRX7jpaSc8Sqciopq6yuuomPCCQs0LfFtsu4MzuvCFKBHcaYXQAiMgsYBdRMBKOAN4w1ucpSEQkXkVhjzD4b41JKuSkfb6/qaiI6Ox2N57AzEcQBOTXe53Lm2X5928QBtRKBiEwEJrreFovI1kbGFAUcauS+rZGWR21aHqdpWdTWGsoj6Wwr7EwE9V2/1a38a8g2GGOmA9MvOiCRlcaYlIv9nNZCy6M2LY/TtCxqa+3lYefIhlwgocb7eGBvI7ZRSillIzsTwQqgq4gki4gfMAaYW2ebucBdYkkHjmr7gFJKNS/bqoaMMRUiMhmYj9V99FVjzCYRmeRaPw2Yh9V1dAdW99F77IrH5aKrl1oZLY/atDxO07KorVWXh+jdkJRSyrO53+xHSimlmpUmAqWU8nAekwhEZLiIbBWRHSLypNPxOElEEkRkoYhsFpFNIvKw0zE5TUS8RWSNiHzidCxOcw3snCMiW1x/I0OcjskpIvKo6//IRhF5W0QadyMLN+cRiaDGdBc3AD2BsSLS09moHFUB/MQYcwmQDjzo4eUB8DCw2ekg3MTfgM+NMT2AfnhouYhIHPAQkGKM6Y3V6WWMs1HZwyMSATWmuzDGlAGnprvwSMaYfacm9zPGFGH9R49zNirniEg8MBJ4xelYnCYibYArgH8DGGPKjDGFjgblLB8gUER8gCBa6TgnT0kEZ5vKwuOJSEdgALgm4vdMfwV+Cpx9InjP0QnIB15zVZW9IiJnTiPqAYwxecALQDbWtDdHjTH/dTYqe3hKImjQVBaeRkRCgPeAR4wxx5yOxwkiciNw0BizyulY3IQPMBB4yRgzADgOeGSbmohEYNUcJAMdgGARmeBsVPbwlESgU1nUISK+WElgpjHmfafjcdBQ4GYR2YNVZXiViMxwNiRH5QK5xphTV4hzsBKDJ7oG2G2MyTfGlAPvA5c6HJMtPCURNGS6C4/huiHQv4HNxpg/Ox2Pk4wxU4wx8caYjlh/F18YY1rlWV9DGGP2Azki0t216GpqTx3vSbKBdBEJcv2fuZpW2nDuEbeqPNt0Fw6H5aShwJ3ABhFZ61r2lDFmnnMhKTfyI2Cm66RpF/ZP/eKWjDHLRGQOsBqrp90aWulUEzrFhFJKeThPqRpSSil1FpoIlFLKw2kiUEopD6eJQCmlPJwmAqWU8nCaCJSqQ0QqRWRtjUeTjawVkY4isrGpPk+ppuAR4wiUukAnjDH9nQ5CqeaiVwRKNZCI7BGR34vIcteji2t5kogsEJH1rudE1/IYEflARNa5HqemJ/AWkZdd89z/V0QCHftRSqGJQKn6BNapGvpujXXHjDGpwItYs5biev2GMaYvMBP4u2v534FFxph+WPP1nBrN3hWYaozpBRQCt9n6a5Q6Dx1ZrFQdIlJsjAmpZ/ke4CpjzC7XpH37jTGRInIIiDXGlLuW7zPGRIlIPhBvjDlZ4zM6Av9njOnqev8E4GuMeaYZfppS9dIrAqUujDnL67NtU5+TNV5Xom11ymGaCJS6MN+t8bzE9fobTt/CcDzwlev1AuB+qL4ncpvmClKpC6FnIkqdKbDGrKxg3b/3VBdSfxFZhnUSNda17CHgVRF5HOvuXqdm63wYmC4iP8A6878f605XSrkVbSNQqoFcbQQpxphDTseiVFPSqiGllPJwekWglFIeTq8IlFLKw2kiUEopD6eJQCmlPJwmAqWU8nCaCJRSysP9P/FjvJNT+YnxAAAAAElFTkSuQmCC\n", 53 | "text/plain": [ 54 | "
" 55 | ] 56 | }, 57 | "metadata": { 58 | "needs_background": "light" 59 | }, 60 | "output_type": "display_data" 61 | }, 62 | { 63 | "data": { 64 | "image/png": "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\n", 65 | "text/plain": [ 66 | "
" 67 | ] 68 | }, 69 | "metadata": { 70 | "needs_background": "light" 71 | }, 72 | "output_type": "display_data" 73 | } 74 | ], 75 | "source": [ 76 | "plot_loss_acc(which=\"lion\", version=6, plot=True) # default params" 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 32, 82 | "id": "4fdd704f-cd87-4042-bd75-5d3d4a014fb6", 83 | "metadata": {}, 84 | "outputs": [ 85 | { 86 | "data": { 87 | "image/png": "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\n", 88 | "text/plain": [ 89 | "
" 90 | ] 91 | }, 92 | "metadata": { 93 | "needs_background": "light" 94 | }, 95 | "output_type": "display_data" 96 | }, 97 | { 98 | "data": { 99 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEKCAYAAAAIO8L1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAApyklEQVR4nO3de3gc9X3v8fdXq/vN+CZhWwYbMGAbY4jlS0IuJgZC0ubQNCThkoSQBJ9caFJynpyQ0Oc0eXp62p70aQ80JI4hLnHq4LY0NKR1ISGwISEYbMDE92BswMJgSzK2JMuSJe33/DEj7Wo9kmXZoxWrz+t59tmZ32X2qx/m992Z2Zkxd0dERCRbQa4DEBGR0UkJQkREIilBiIhIJCUIERGJpAQhIiKRlCBERCRSbAnCzFaZ2QEz2zJAvZnZXWa2y8x+Z2Zvy6i72sx2hnW3xxWjiIgMLM49iPuAqwepfz8wK3wtB74HYGYJ4O6wfg5wvZnNiTFOERGJEFuCcPcngIODNLkGWO2B9cAZZjYFWATscvfd7n4MWBu2FRGREVSYw8+eBuzNWG8Iy6LKFw+0ETNbTrAHQllZ2YLp06cPK5hUKkVBgU7JgMYim8ajP41HWj6Mxe9///smd58cVZfLBGERZT5IeSR3XwmsBKivr/eNGzcOK5hkMsnSpUuH1TffaCz603j0p/FIG4mxcHfcocednpST6nuHVMrpCW+XNKmyZFjbN7NXBqrLZYJoADK/7tcB+4DiAcpFZBRxDycpDyatVCpY7nHHM5ZTvRNc6vjlVMY2elJBXeYE6JmTYWb7VFDeO2n2bq+7J/zMrLq++lRYl4KeVCpsQ1/f3s/uaxduqztrubeuqamDe3atD7afou/vTX9+EGvfWPRtJ/PvzIzx+PLUEG6XN7mqhA13XHHa/xvnMkE8BNxqZmsJDiEddvfXzawRmGVmM4HXgOuAG3IYp8hbWirltHf1cKSzm7bO7oz3/mXBclh2LF3W2tHNkWPp9l09KfyR/yQf7vOZKDASZsF7gVFgUJgooMCMRAFBXSJoU1BgFBZYWBe82rudkq5UWA9FBQV99QVm6e1k9BtKeUFGXGa9y1HlwTbKi+OZymNLEGZ2P7AUmGRmDcCfA0UA7r4CWAd8ANgFtAM3h3XdZnYr8AiQAFa5+9a44hTJlZ6U09WTCl9Od0+KrpTT1Z2iO5XiWLfTnQrqunpSHA0n+b5Ju7OHI8eyJ/jjJ/72rp4hTeZmUFFcSEVJgoqSQipLCqkoLqRufDmVYVlFSSH7GvZyzoyzsYwJLXO5wNKTV0HGxFfQb52+Sa7AgonYLD1JF4QTct9yVJ+C9EQdNYEXFljfhNpb1zsR99adquAQ0ztOeTujVWwJwt2vP0G9A18coG4dQQIRGTGplPNm+zH2t3Syv7WDxpZO9rd0sPXFTpItW/sm8+4e7z+Rh5N7d49zrCco6+p2ulIZ7cNJvjtMBl2p1Gn5Bl5SWBBM5OGrsiTBxMpizppYTmVxuixdn34PlhN9ZWVFiSFNmsnkfpYuveDUg5dRL5eHmERGhLvzZnsXB1o7gsm/pYMDLR0caA2W97d0cqClg8a2Trp6jp+1ixNQ+kYDRYkCihIFFCYsXDYKCwooKiygqMAoTBhVRYXpukQBxYkCCgt6l4P3/n2NooJ0+6Jw233tM7ZfWpyezCuLCykvSVCUeGv/gkZGNyUIectydw4f7Qom+EEm/8bWTo71pI7rP66siNrqEmqqSjnn3InUVpdSW1VCTXVpX/nkqhLWP/lr/WpHxiQlCBmVOrt7eLW5/fjJP1zufT/WffzEX11a2DfJL545gZrqUmqqSoIEEE78NdUllBYlcvCXibx1KEFIzh08coztr7ewbV8L215vYfvrLew60EZ31u/7qkoKqakOJvoFZ42ntrq037f93veyYk38IqeDEoSMmFTKeeVgO9v2BUlgW5gU3mjp6GtzZnUpc6ZWc8XsWmbVVnJmdWmYCEpi+ymfiETT/3ESi6PHeti5vzXcKzjMtn0t7HijlfZjPUDwE8XzJlfy9nMnMmdKNXOmVjN7SjUTKopzHLmI9FKCkFN2oLUj4/BQK9v2HWZP05G+K0CrSgqZPbWaj9ZP70sG59VU6hyAyCinBCFD1t2TYk/TkeDQUHh4aPvrrTS1dfa1mXZGGXOmVvOHF09lztRq5kyppm58GWanflGSiIwsJQiJ1NbZzY7X0yeNew8RdYa/GipKGOfXVnH5BZOZ3XuI6MxqxpUX5ThyETldlCAEgI6uHtbvbubR7fv5xe/a2f/wI311Z5QXMWdKNZ9YcnbfuYJzJ1dSXKiLtETymRLEGNbU1sljOw7wy+37+fWLTbQf66GsKMEFZxTw8cvODQ4RTa3mzOpSHSISGYOUIMYQd+f3+9t4dPt+frl9P8/vPYR78NPSD106jSvm1PL2cyaGVw7PynW4IpJjShB57lh3imf2HAySwo797D14FIB508bxp8vOZ9nsGuZOrdYegogcRwkiD7155BjJ3x/g0e0HeGJnI62d3ZQUFvDO8ybx+fecx7LZNdRWl+Y6TBEZ5ZQg8sRLjW38cvt+Ht12gI2vHCTlwSMI/+DiKSybXcs7z5ukW1CIyElRgniL6u5JsfGVN3l0235+ueMAe5qOADB7SjVfvPw8ls2u5eJp407LQ1FEZGxSgngLaeno4lc7G3l0+36SOxs5fLSL4kQBS86dyM2XzeC9F9ZQN74812GKSJ5QghjlXmk+wqPbg5+iPrPnIN0pZ0JFMVfMruWK2TW86/zJVJboP6OInH6xzixmdjVwJ8Gzpe9197/Oqh8PrALOBTqAT7v7lrDuZaAV6AG63b0+zlhHi56U8/yrb/YlhRcPtAEwq6aSz77rHK6cU8Ml08eT0KEjEYlZbAnCzBLA3cCVQAOwwcwecvdtGc2+AWxy9w+Z2YVh+2UZ9Ze7e1NcMY4mrR1d/J9123lk634OHjlGYYGxaOYErl90FlfMruWsiTp0JCIjK849iEXALnffDWBma4FrgMwEMQf4KwB332FmM8ys1t33xxjXqNPS0cUnf/AMW147zB9cPIUrZtfy7vMnM65M9zUSkdyJM0FMA/ZmrDcAi7PavAD8MfAbM1sEnA3UAfsBB35uZg58391Xxhhrzhxu7+KTq55m2+stfPfGt3HV3DNzHZKICBBvgog6SO5Z638N3Glmm4DNwPNAd1h3mbvvM7Ma4BdmtsPdnzjuQ8yWA8sBamtrSSaTwwq2ra1t2H2Hq+2Y8+2NHbzWmuLWS0sobtxBMrljRGOIjCsHYzGaaTz603ik5ftYxJkgGoDpGet1wL7MBu7eAtwMYMG9HvaEL9x9X/h+wMweJDhkdVyCCPcsVgLU19f70qVLhxVsMplkuH2H4+CRY3z83qd5vR3uuWkhl19YM2KffSIjPRajncajP41HWr6PRZz3a94AzDKzmWZWDFwHPJTZwMzOCOsAPgs84e4tZlZhZlVhmwrgKmBLjLGOqOa2Tm64Zz0vNbZxzyfrR1VyEBHpFdsehLt3m9mtwCMEP3Nd5e5bzexzYf0KYDaw2sx6CE5efybsXgs8GN5ArhD4sbs/HFesI6mxtZMb713Pqwfb+cFNC3nnrEm5DklEJFKs10G4+zpgXVbZiozlp4Dj7isd/vJpfpyx5cKB1g5uuOdpXnvzKKs+tZB3nKvkICKjly7BHSH7Wzq4/p71vHG4g3+8eSFLzpmY65BERAalBDECXj98lBvueZoDLR388NOLWDhjQq5DEhE5ISWImL126CjXr1zPwSPHWP2ZxSw4e3yuQxp9uo9BexMcaQxf4XKqG6ZcAtPeBqXjch2ljFbu4Kn0K9UTLofvqVTWek//9pF9esLt9gy63YlNm2B7W1CWCl+e+d6d7te33FueyujXHS6nMpZ7y1Mn3l5JNXz0h6d9aJUgYrT3YDvX37Oew0e7+NFnFnHpWWMkObhDx+Fwoj9w/MTfdiC9fKQROg6dYIMGky+AafVQtyB4r5kDCf3zzRs93XD0ILQ3B/822pvDLw3N6eX25vT60YPpCfK4y6tGzjw49d9XWgIKElBQGC4XZCwnMuoTWW0LMsriueuC/g+LyavNQXJo7ehizWcXc3HdGbkO6dR0d2ZM6r3vBwae+FNd0dspmwAVk4NX7VyorAnXJ6XLe1+pbtj3HDQ8C69thJ3rYNM/BdspKg/2LuoWQN3CIGmMmzZiwzFierrh0CvQ/BJ0d0BRGRSWQGFpxntp1noJ5PoRsseOZEz0zSee+I++OfC2SsZBxUQonwjj6mDqfCgbD4niYJK0RDhZFvRf75tACyLWE0OsLxigffD+7HPPsWDh4oyJujDs07s8wASf2XYUU4KIwSvNR7h+5Xrau3r48S1LuGjaKDw8kuqB9oPBZN7eFE7sTdDexKwXX4D992Z9yz8cvZ1ESXqSr5oCZ16cnuwra/pP/OUTIXGS33TOuyJ4QbBn8uaedMJo2ABPfx9++w9BfdUUmLYA6uqDhDH1UiipHP4YjRT3YJJsehGad0Hzi9C0K1g+uHvgZDuYEyWQ4xJNWf/2RRF9CssgUcSkxvWwcU84uR/s+3fT7xt+99HouAoKoXxS8G+hYiKcOS9jfRKUTwjWK8KysglQWBy9rVGgdVcrTLk412HERgkCYNOPqdn/IuxoDyaU4goorgxf4fIQD2fsaQqSQ2d3Dz/+7BLmTK2OOfhQqif4Fpb5jb73W1tEEqD9ING75kZNYSV0TQsm9TPnhRN81mRfGb4XV47ct1UzmHBO8Lr4I0FZdye8sRkaNoZJYyPs+I+wfUFwKCozaUy+IPgGlwtdR4MJvy8R7EovZx5mSxQHf+OkWXDB+4P3iecFY93dkfHqDLbZ3Zlez67v7oCujuPrjzQOUH80OL49iIsAtoYrxVXpb/eVZ0LN3HA9c9KfmH6Vjsv93o0MmRIEwH/cxpzuDtg+SJvC0uMTR1YyebOnmIc3HeRaL+XGd89hysE2aMtsm9G3qHzw3ctUKj3h953A7f2W1th/su8tH+hYbNmE9OQ++QKouCz8Rj8p+J+5b3kylI3nyV//5q1z+4DCkmDyr8t4XMiRZnjt2WAP47WNsO3f4bnwBF5xFUy9JJ0w6uqh6jTeIDGVgpaGcPIP9wZ6lw/vpd9/o6qpMOk8uOjDQQLoTQRnnJW7JAbQ05WVUPonoo2bd1L/nquDCb+wJHdxSuyUIAC+9DxP/+YxFl8yFzrbguOnx9rC15GwLLM8fO9ogZbX4dgRejpaqOhs4/O99xr81Yk+1MLkUpFOMkVlwTaPNAYn4Qb6Jlc2Pj2pT5oFZ78jPcH3fnvrPa5fNmHsncytmAjnXxW8IJi0D77Ufy/jt/8QnOMAGDe9/17GlPlQfILnbxw9lLUX8GJwnqD5pf6HV4org0n/rMUw8eMw8dzgv9mEc0fv4a9EUfAqqYqsbnu5C6qnjnBQkgtjbOYYQPVUjpbXBcesh2HnG63ceO96rMi4/9OXct44Oz6ZRCWeY0egszW93HUk+EZ51pL0BF8+sf9J3LE44Z+qgoJgUp40Cy65PijrOgqvv5CRNJ4N9jQgOIFYOzfcM1nIxKa98OQL/Q8NHWlMb98SMH5GkAjOWRq89+4RVNbqkIq8ZWmmOUXbX2/hxnufpihh/PiWJZw7OfxWWK6L4Ua1orIgEZ+1JF3WdqD/Xsbv/hU2rkr/lLFiMkycBedfHR4OCg8JjZ8xqk+kigyXEsQp2PLaYT7+g6cpK0pw/y1LmDGpItchyamorIELPxC8IDjx3/R7nl3/axZc+VEoOyOn4YmMNCWIYdrcECSHypJC7r9liZ4ZnY8KElAzm9bq/UoOMiaN7qs0RqkX9h7ixnvXU1lSyNrlSg4ikp+UIE7Sc6++ycfvfZpx5UX8839fwvQJSg4ikp90iOkkPPvKQW5atYGJlcXcf8sSpp5RluuQRERioz2IIXpmz0E++YNnmFxVwj8vf7uSg4jkPSWIIXjqpWZuWvUMZ44r5Z+XL+HMcaW5DklEJHZKECfw5K4mbr7vGerGl3H/8iXUVCs5iMjYEGuCMLOrzWynme0ys9sj6seb2YNm9jsze8bMLhpq35HwxO8b+fR9Gzh7QkWQHKqUHERk7IgtQZhZArgbeD8wB7jezOZkNfsGsMndLwY+Cdx5En1jldx5gM+u3sjMSUFymFSpm5KJyNgS5x7EImCXu+9292PAWuCarDZzgF8CuPsOYIaZ1Q6xb2we33GA5auf5bzJldx/yxImVOg2CiIy9sT5M9dpwN6M9QZgcVabF4A/Bn5jZouAs4G6IfYFwMyWA8sBamtrSSaTwwq2ra2NZDLJ8we6+c7znUyvKuALs7t5YcNvh7W9t7LesZCAxqM/jUdavo9FnAki6haW2Q8s+GvgTjPbBGwGnge6h9g3KHRfCawEqK+v9+E+xyCZTNIx6UK++4vnuKjuDFZ/ehHjyuJ5zutol0wm3zrPgxgBGo/+NB5p+T4WcSaIBmB6xnodsC+zgbu3ADcDmJkBe8JX+Yn6nm4b3ujm+z9/jnl14/jhpxdRXTo2k4OISK84z0FsAGaZ2UwzKwauAx7KbGBmZ4R1AJ8FngiTxgn7nk4/e2Ef33uhk0umB3sOSg4iIjHuQbh7t5ndCjwCJIBV7r7VzD4X1q8AZgOrzawH2AZ8ZrC+ccT55pFjfP0nm5l1RgE//PQiKkp09xEREYj5Xkzuvg5Yl1W2ImP5KWDWUPvGYXxFMf/02cXs3/m8koOISAZdSQ1cMv0MSgr1WEgRkUxKECIiEkkJQkREIilBiIhIJCUIERGJpAQhIiKRlCBERCSSEoSIiERSghARkUhKECIiEkkJQkREIilBiIhIJCUIERGJpAQhIiKRlCBERCSSEoSIiERSghARkUhKECIiEinWBGFmV5vZTjPbZWa3R9SPM7OfmdkLZrbVzG7OqHvZzDab2SYz2xhnnCIicrzYHsJsZgngbuBKoAHYYGYPufu2jGZfBLa5+wfNbDKw08zWuPuxsP5yd2+KK0YRERlYnHsQi4Bd7r47nPDXAtdktXGgyswMqAQOAt0xxiQiIkMU2x4EMA3Ym7HeACzOavMd4CFgH1AFfMzdU2GdAz83Mwe+7+4roz7EzJYDywFqa2tJJpPDCratrW3YffONxqI/jUd/Go+0fB+LOBOERZR51vr7gE3Ae4FzgV+Y2a/dvQW4zN33mVlNWL7D3Z84boNB4lgJUF9f70uXLh1WsMlkkuH2zTcai/40Hv1pPNLyfSziPMTUAEzPWK8j2FPIdDPwEw/sAvYAFwK4+77w/QDwIMEhKxERGSFxJogNwCwzm2lmxcB1BIeTMr0KLAMws1rgAmC3mVWYWVVYXgFcBWyJMVYREckS2yEmd+82s1uBR4AEsMrdt5rZ58L6FcBfAPeZ2WaCQ1Jfc/cmMzsHeDA4d00h8GN3fziuWEVE5HhxnoPA3dcB67LKVmQs7yPYO8jutxuYH2dsIiIyOF1JLSIikZQgREQkkhKEiIhEUoIQEZFIShAiIhJJCUJERCIpQYiISCQlCBERiaQEISIikZQgREQkkhKEiIhEUoIQEZFIShAiIhJJCUJERCINmCDM7P/2Prshq/w2M/ubeMMSEZFcG2wP4g8Jn/Wc5U7gD+IJR0RERovBEoS7eyqiMEXw9DcREcljgyWIdjOblV0Ylh2NLyQRERkNBksQ/wv4LzP7lJnNC183A/8Z1p2QmV1tZjvNbJeZ3R5RP87MfmZmL5jZ1nD7Q+orIiLxGvCZ1O7+X2b2R8BXgT8Ji7cAH3b3zSfasJklgLuBK4EGYIOZPeTu2zKafRHY5u4fNLPJwE4zWwP0DKGviIjEaMAEYWalwH53vymrvMbMSt294wTbXgTscvfdYb+1wDVA5iTvQJWZGVAJHAS6gcVD6CsiIjEaMEEAdwEPAz/JKr8SeCfw+RNsexqwN2O9gWDiz/Qd4CFgH1AFfMzdU2Y2lL4AmNlyYDlAbW0tyWTyBGFFa2trG3bffKOx6E/j0Z/GIy3fx2KwBPFOd1+eXejua8zsG0PYdtQvnTxr/X3AJuC9wLnAL8zs10Ps2xvPSsKf49bX1/vSpUuHENrxkskkw+2bbzQW/Wk8+tN4pOX7WAx2knqwn7IO5QrsBmB6xnodwZ5CppuBn3hgF7AHuHCIfUVEJEaDTfQHzGxRdmFY1jiEbW8AZpnZTDMrBq4jOJyU6VVgWbjdWuACYPcQ+4qISIwGO8T0VeBfzOw+4NmwrB74JMGEPSh37zazW4FHgASwyt239t6+w91XAH8B3Gdmmwn2WL7m7k0AUX2H8feJiMgwDfYz12fMbDHwBeBTBOcAtgI3ESSJp0+0cXdfB6zLKluRsbwPuGqofUVEZOQMtgeBu+8H/tzMLgWuJ0gO7wb+bQRiExGRHBrsOojzCQ4lXQ80A/8MmLtfPkKxiYhIDg22B7ED+DXwwfAXRpjZbSMSlYiI5Nxgv2L6MPAG8LiZ3WNmy9BdXEVExowBE4S7P+juHyO4LiEJ3AbUmtn3zCzyxLKIiOSPE17w5u5H3H2Nu/8hwQVrmwDdXVVEJM+d1DOp3f2gu3/f3d8bV0AiIjI6nFSCEBGRsUMJQkREIilBiIhIJCUIERGJpAQhIiKRlCBERCSSEoSIiERSghARkUhKECIiEkkJQkREIilBiIhIpFgThJldbWY7zWyXmR13gz8z+6qZbQpfW8ysx8wmhHUvm9nmsG5jnHGKiMjxBn3k6KkwswRwN3Al0ABsMLOH3H1bbxt3/zbw7bD9B4Hb3P1gxmYud/emuGIUEZGBxbkHsQjY5e673f0YsBa4ZpD21wP3xxiPiIicBHP3eDZsdi1wtbt/Nlz/BLDY3W+NaFtOsJdxXu8ehJntAd4EHPi+u68c4HOWA8sBamtrF6xdu3ZY8ba1tVFZWTmsvvlGY9GfxqM/jUdaPozF5Zdf/qy710fVxXaIiejHkw6UjT4IPJl1eOkyd99nZjXAL8xsh7s/cdwGg8SxEqC+vt6XLl06rGCTySTD7ZtvNBb9aTz603ik5ftYxHmIqQGYnrFeB+wboO11ZB1ecvd94fsB4EGCQ1YiIjJC4kwQG4BZZjbTzIoJksBD2Y3MbBzwHuCnGWUVZlbVuwxcBWyJMVYREckS2yEmd+82s1uBR4AEsMrdt5rZ58L6FWHTDwE/d/cjGd1rgQfNrDfGH7v7w3HFKiIix4vzHATuvg5Yl1W2Imv9PuC+rLLdwPw4YxMRkcHpSmoREYmkBCEiIpGUIEREJJIShIiIRFKCEBGRSEoQIiISSQlCREQiKUGIiEgkJQgREYmkBCEiIpGUIEREJJIShIiIRFKCEBGRSEoQIiISSQlCREQiKUGIiEgkJQgREYmkBCEiIpFiTRBmdrWZ7TSzXWZ2e0T9V81sU/jaYmY9ZjZhKH1FRCResSUIM0sAdwPvB+YA15vZnMw27v5td7/E3S8Bvg78yt0PDqWviIjEK849iEXALnff7e7HgLXANYO0vx64f5h9RUTkNCuMcdvTgL0Z6w3A4qiGZlYOXA3cOoy+y4HlALW1tSSTyWEF29bWNuy++UZj0Z/Goz+NR1q+j0WcCcIiynyAth8EnnT3gyfb191XAisB6uvrfenSpScZZiCZTDLcvvlGY9GfxqM/jUdavo9FnIeYGoDpGet1wL4B2l5H+vDSyfYVEZEYxJkgNgCzzGymmRUTJIGHshuZ2TjgPcBPT7aviIjEJ7ZDTO7ebWa3Ao8ACWCVu281s8+F9SvCph8Cfu7uR07UN65YRUTkeHGeg8Dd1wHrsspWZK3fB9w3lL4iIjJydCW1iIhEUoIQEZFIShAiIhJJCUJERCIpQYiISCQlCBERiaQEISIikZQgREQkkhKEiIhEivVK6tGgq6uLhoYGOjo6Bm03btw4tm/fPkJRjW6ZY1FaWkpdXR1FRUU5jkpERlreJ4iGhgaqqqqYMWMGZlF3EQ+0trZSVVU1gpGNXr1j4e40NzfT0NDAzJkzcx2WiIywvD/E1NHRwcSJEwdNDhLNzJg4ceIJ975EJD/lfYIAlBxOgcZOZOwaEwlCREROnhKEiIhEUoKI2aFDh/jud7970v0+8IEPcOjQodMfkIjIEOX9r5gyfetnW9m2ryWyrqenh0QicdLbnDO1mj//4NwB63sTxBe+8IWT+rx16/SsJBHJLe1BxOz222/npZde4pJLLmHhwoVcfvnl3HDDDcybNw+AP/qjP2LBggXMnTuXlStX9vWbMWMGTU1NvPzyy8yePZtbbrmFuXPnctVVV3H06NEBP++ee+5h4cKFzJ8/nw9/+MO0t7cDsH//fj70oQ8xf/585s+fz29/+1sAVq9ezcUXX8z8+fP5xCc+EeNIiMhbjrvH9gKuBnYCu4DbB2izFNgEbAV+lVH+MrA5rNs4lM9bsGCBZ9u2bdtxZVFaWlqG1O5k7dmzx+fOnevu7o8//riXl5f77t27++qbm5vd3b29vd3nzp3rTU1N7u5+9tlne2Njo+/Zs8cTiYQ///zz7u7+kY98xH/0ox8N+Hm9/d3d77jjDr/rrrvc3f2jH/2o//3f/727u3d3d/uhQ4d8y5Ytfv7553tjY2O/WLLHYqhjmK8ef/zxXIcwqmg80vJhLAabX2M7xGRmCeBu4EqgAdhgZg+5+7aMNmcA3wWudvdXzawmazOXu3tTXDHmwqJFi/pddHbXXXfx4IMPArB3715efPFFJk6c2K/PzJkzueSSSwBYsGABL7/88oDb37JlC3/2Z3/GoUOHaGtr433vex8Ajz32GKtXrwYgkUgwbtw4Vq9ezbXXXsukSZMAmDBhwun6M0UkD8R5DmIRsMvddwOY2VrgGmBbRpsbgJ+4+6sA7n4gxnhGhYqKir7lZDLJo48+ylNPPUV5eTlLly6NvCitpKSkbzmRSAx6iOlTn/oU//7v/878+fO57777SCaTA7Z1d13nICIDivMcxDRgb8Z6Q1iW6XxgvJklzexZM/tkRp0DPw/Ll8cYZ6yqqqpobW2NrDt8+DDjx4+nvLycHTt2sH79+lP+vNbWVqZMmUJXVxdr1qzpK1+2bBnf+973gOAEeUtLC8uWLeNf/uVfaG5uBuDgwYOn/Pkikj/i3IOI+mrqEZ+/AFgGlAFPmdl6d/89cJm77wsPO/3CzHa4+xPHfUiQPJYD1NbWHveNedy4cQNO0Jl6enqG1O5kFRcXs2jRIubMmUNpaSk1NTV9n3PZZZfxne98h4suuohZs2axcOFC2tvbaW1txd1pa2ujra2NVCrV16ezs5POzs4BY73jjjtYtGgR06dPZ86cObS1tdHa2spf/uVf8qUvfYl77rmHRCLB3/3d37F48WK+8pWv8K53vYtEIsHFF1/MihUrjhuLjo6OQfdE8l1bW9uY/vuzaTzS8n0sLDhHEcOGzd4OfNPd3xeufx3A3f8qo83tQKm7fzNc/wHwsLv/a9a2vgm0ufvfDvaZ9fX1vnHjxn5l27dvZ/bs2SeMVzfrS8sei6GOYb5KJpMsXbo012GMGhqPtHwYCzN71t3ro+riPMS0AZhlZjPNrBi4Dngoq81PgXeZWaGZlQOLge1mVmFmVWHwFcBVwJYYYxURkSyxHWJy924zuxV4BEgAq9x9q5l9Lqxf4e7bzexh4HdACrjX3beY2TnAg+EJ1ELgx+7+cFyxvhV98Ytf5Mknn+xX9uUvf5mbb745RxGJSL6J9Upqd18HrMsqW5G1/m3g21llu4H5ccb2Vnf33XfnOgQRyXO6klpERCIpQYiISCQlCBERiaQEISIikZQgRpnKyspchyAiAoyx50HwX7fDG5sjq8p6uiExjOE4cx68/69PMTARkdFHexAx+9rXvtbviXLf/OY3+da3vsWyZct429vexrx58/jpT386pG21tbUN2C/quQ4DPQNCRGRIBroP+FvxNRqfB/Hcc8/5u9/97r712bNn+yuvvOKHDx92d/fGxkY/99xzPZVKubt7RUXFgNvq6uqK7DfQcx2ingExFHoeRH/5cM//00njkZYPY0EungchgUsvvZQDBw6wb98+GhsbGT9+PFOmTOG2227jiSeeoKCggNdee439+/dz5plnDrotd+cb3/jGcf0ee+yxyOc6RD0DQkRkqJQgRsC1117LAw88wBtvvMF1113HmjVraGxs5Nlnn6WoqIgZM2ZEPgci20D9XM91EJEY6BzECLjuuutYu3YtDzzwANdeey2HDx+mpqaGoqIiHn/8cV555ZUhbWegfgM91yHqGRAiIkOlBDEC5s6dS2trK9OmTWPKlCnceOONbNy4kfr6etasWcOFF144pO0M1G/u3LnccccdvOc972H+/Pl85StfAeDOO+/k8ccfZ968eSxYsICtW7fG9jeKSP7RIaYRsnlz+ue1kyZN4qmnnops19bWNuA2But30003cdNNN/Urq62tHfIvpEREsmkPQkREImkPYhTavHlz37UMvUpKSnj66adzFJGIjEVjIkG81X7lM2/ePDZt2pTrMIBg7ERkbMr7Q0ylpaU0NzdrohsGd6e5uZnS0tJchyIiOZD3exB1dXU0NDTQ2Ng4aLuOjg5NhKHMsSgtLaWuri7HEYlILuR9gigqKmLmzJknbJdMJrn00ktHIKLRT2MhIhDzISYzu9rMdprZLjO7fYA2S81sk5ltNbNfnUxfERGJT2x7EGaWAO4GrgQagA1m9pC7b8tocwbwXeBqd3/VzGqG2ldEROIV5x7EImCXu+9292PAWuCarDY3AD9x91cB3P3ASfQVEZEYxXkOYhqwN2O9AVic1eZ8oMjMkkAVcKe7rx5iXwDMbDmwPFxtM7Odw4x3EtA0zL75RmPRn8ajP41HWj6MxdkDVcSZIKIuPMj+rWkhsABYBpQBT5nZ+iH2DQrdVwIrTyFOAMxso7vXn+p28oHGoj+NR38aj7R8H4s4E0QDMD1jvQ7YF9Gmyd2PAEfM7Alg/hD7iohIjOI8B7EBmGVmM82sGLgOeCirzU+Bd5lZoZmVExxG2j7EviIiEqPY9iDcvdvMbgUeARLAKnffamafC+tXuPt2M3sY+B2QAu519y0AUX3jijV0yoep8ojGoj+NR38aj7S8HgvTLShERCRK3t+LSUREhkcJQkREIo35BKFbeqSZ2XQze9zMtoe3PvlyrmPKNTNLmNnzZvYfuY4l18zsDDN7wMx2hP9G3p7rmHLJzG4L/z/ZYmb3m1ne3e1zTCeIjFt6vB+YA1xvZnNyG1VOdQP/w91nA0uAL47x8QD4MsEv6wTuBB529wsJfo4+ZsfFzKYBXwLq3f0igh/TXJfbqE6/MZ0g0C09+nH31939uXC5lWACmJbbqHLHzOqAPwDuzXUsuWZm1cC7gR8AuPsxdz+U06ByrxAoM7NCoJw8vFZrrCeIqFt6jNkJMZOZzQAuBcbyc07/H/A/CX6CPdadAzQC/xgecrvXzCpyHVSuuPtrwN8CrwKvA4fd/ee5jer0G+sJYsi39BhLzKwS+DfgT929Jdfx5IKZ/SFwwN2fzXUso0Qh8Dbge+5+KXAEGLPn7MxsPMHRhpnAVKDCzD6e26hOv7GeIHRLjyxmVkSQHNa4+09yHU8OXQb8NzN7meDQ43vN7J9yG1JONQAN7t67R/kAQcIYq64A9rh7o7t3AT8B3pHjmE67sZ4gdEuPDGZmBMeYt7v73+U6nlxy96+7e527zyD4d/GYu+fdN8Shcvc3gL1mdkFYtAwYy89neRVYYmbl4f83y8jDk/Z5/8jRwQx0O5Ach5VLlwGfADab2aaw7Bvuvi53Icko8ifAmvDL1G7g5hzHkzPu/rSZPQA8R/Drv+fJw9tu6FYbIiISaawfYhIRkQEoQYiISCQlCBERiaQEISIikZQgREQkkhKEyEkwsx4z25TxOm1XE5vZDDPbcrq2J3KqxvR1ECLDcNTdL8l1ECIjQXsQIqeBmb1sZn9jZs+Er/PC8rPN7Jdm9rvw/aywvNbMHjSzF8JX720aEmZ2T/icgZ+bWVnO/igZ85QgRE5OWdYhpo9l1LW4+yLgOwR3giVcXu3uFwNrgLvC8ruAX7n7fIJ7GvVewT8LuNvd5wKHgA/H+teIDEJXUoucBDNrc/fKiPKXgfe6++7whodvuPtEM2sCprh7V1j+urtPMrNGoM7dOzO2MQP4hbvPCte/BhS5+/8egT9N5DjagxA5fXyA5YHaROnMWO5B5wklh5QgRE6fj2W8PxUu/5b0oyhvBH4TLv8S+Dz0Pfe6eqSCFBkqfTsROTllGXe6heAZzb0/dS0xs6cJvnhdH5Z9CVhlZl8leCJb7x1QvwysNLPPEOwpfJ7gyWQio4bOQYicBuE5iHp3b8p1LCKniw4xiYhIJO1BiIhIJO1BiIhIJCUIERGJpAQhIiKRlCBERCSSEoSIiET6/+//fP7Qrh6XAAAAAElFTkSuQmCC\n", 100 | "text/plain": [ 101 | "
" 102 | ] 103 | }, 104 | "metadata": { 105 | "needs_background": "light" 106 | }, 107 | "output_type": "display_data" 108 | } 109 | ], 110 | "source": [ 111 | "plot_loss_acc(which=\"adam\", version=0, plot=True)" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": 35, 117 | "id": "374ed7fa-56a9-431e-8b74-bb008d5dcce2", 118 | "metadata": {}, 119 | "outputs": [ 120 | { 121 | "data": { 122 | "image/png": "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\n", 123 | "text/plain": [ 124 | "
" 125 | ] 126 | }, 127 | "metadata": { 128 | "needs_background": "light" 129 | }, 130 | "output_type": "display_data" 131 | }, 132 | { 133 | "data": { 134 | "image/png": "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iERSghARkUhKECIiEkkJQkREIilBiIhIpFgThJktNbOdZrbLzO6IWP41M9sYvraYWauZjelNWxERiVdsCcLMEsC9wEeBWcANZjYrvY67f8vd57v7fODPgWfc/Uhv2oqISLziPIJYBOxy993u3gSsBq7pof4NwI/72FZERPpZfozrngzsS5uvARZHVTSzEmApcGsf2i4HlgOUl5dTXV3dp2CTyWSf2+Ya9UVn6o/O1B8dcr0v4kwQFlHm3dS9GviNux853bbuvhJYCVBZWelVVVWnGWagurqavrbNNeqLztQfnak/OuR6X8Q5xFQDVKTNTwH2d1N3GR3DS6fbVkREYhBnglgPTDezaWZWSJAE1mRWMrORwIeBx063rYiIxCe2ISZ3bzGzW4EngARwv7tvNbNbwuUrwqqfBJ509xOnahtXrCIi0lWc5yBw97XA2oyyFRnzDwAP9KatiIgMHF1JLSIikZQgREQkkhKEiIhEUoIQEZFIShAiIhJJCUJERCIpQYiISCQlCBERiaQEISIikWK9knowaG5upqamhoaGhh7rjRw5ku3btw9QVINbel8UFxczZcoUCgoKshyViAy0nE8QNTU1lJWVMXXqVMyi7iIeqKuro6ysbAAjG7za+sLdOXz4MDU1NUybNi3bYYnIAMv5IaaGhgbGjh3bY3KQaGbG2LFjT3n0JSK5KecTBKDkcAbUdyJD15BIECIicvqUIEREJJISRMyOHj3Kd7/73dNu97GPfYyjR4/2f0AiIr2U879iSveXP9/Ktv3HI5e1traSSCROe52z3jeCv7h6drfL2xLEl770pdP6vLVr9awkEckuHUHE7I477uD1119n/vz5XHjhhVx++eXceOONzJkzB4BPfOITLFy4kNmzZ7Ny5cr2dlOnTuXQoUPs3buXmTNn8sUvfpHZs2dz1VVXcfLkyW4/77777uPCCy9k3rx5XHvttdTX1wNw4MABPvnJTzJv3jzmzZvHb3/7WwAefPBB5s6dy7x58/jMZz4TY0+IyHuOu8f2ApYCO4FdwB3d1KkCNgJbgWfSyvcCm8NlG3rzeQsXLvRM27Zt61IW5fjx472qd7r27Nnjs2fPdnf3devWeUlJie/evbt9+eHDh93dvb6+3mfPnu2HDh1yd/ezzjrLa2trfc+ePZ5IJPzll192d/c/+IM/8B/+8Ifdfl5be3f3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\n", 135 | "text/plain": [ 136 | "
" 137 | ] 138 | }, 139 | "metadata": { 140 | "needs_background": "light" 141 | }, 142 | "output_type": "display_data" 143 | } 144 | ], 145 | "source": [ 146 | "plot_loss_acc(which=\"adamW\", version=0, plot=True)" 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 36, 152 | "id": "78db3e0b-b8f7-4f07-a095-cde63b9f99e3", 153 | "metadata": {}, 154 | "outputs": [ 155 | { 156 | "data": { 157 | "image/png": "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\n", 158 | "text/plain": [ 159 | "
" 160 | ] 161 | }, 162 | "metadata": { 163 | "needs_background": "light" 164 | }, 165 | "output_type": "display_data" 166 | }, 167 | { 168 | "data": { 169 | "image/png": "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\n", 170 | "text/plain": [ 171 | "
" 172 | ] 173 | }, 174 | "metadata": { 175 | "needs_background": "light" 176 | }, 177 | "output_type": "display_data" 178 | } 179 | ], 180 | "source": [ 181 | "plot_loss_acc(which=\"sgd-cosine\", version=0, plot=True)" 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": null, 187 | "id": "62c7796b-6e56-414b-9f1d-9b00ee1369d5", 188 | "metadata": {}, 189 | "outputs": [], 190 | "source": [] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": null, 195 | "id": "861cdffa-434c-477c-a570-38c05605b76d", 196 | "metadata": {}, 197 | "outputs": [], 198 | "source": [] 199 | } 200 | ], 201 | "metadata": { 202 | "kernelspec": { 203 | "display_name": "Python 3 (ipykernel)", 204 | "language": "python", 205 | "name": "python3" 206 | }, 207 | "language_info": { 208 | "codemirror_mode": { 209 | "name": "ipython", 210 | "version": 3 211 | }, 212 | "file_extension": ".py", 213 | "mimetype": "text/x-python", 214 | "name": "python", 215 | "nbconvert_exporter": "python", 216 | "pygments_lexer": "ipython3", 217 | "version": "3.9.7" 218 | } 219 | }, 220 | "nbformat": 4, 221 | "nbformat_minor": 5 222 | } 223 | -------------------------------------------------------------------------------- /src/adam.py: -------------------------------------------------------------------------------- 1 | import os 2 | import os.path as op 3 | import time 4 | 5 | from datasets import load_dataset 6 | import lightning as L 7 | from lightning.pytorch.callbacks import ModelCheckpoint 8 | from lightning.pytorch.loggers import CSVLogger 9 | import torch 10 | from torch.utils.data import DataLoader 11 | import torchmetrics 12 | from transformers import AutoTokenizer 13 | from transformers import AutoModelForSequenceClassification 14 | 15 | from local_dataset_utilities import download_dataset, load_dataset_into_to_dataframe, partition_dataset 16 | from local_dataset_utilities import IMDBDataset 17 | 18 | 19 | def tokenize_text(batch): 20 | return tokenizer(batch["text"], truncation=True, padding=True) 21 | 22 | 23 | class LightningModel(L.LightningModule): 24 | def __init__(self, model, learning_rate=5e-5): 25 | super().__init__() 26 | 27 | self.learning_rate = learning_rate 28 | self.model = model 29 | self.train_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 30 | self.val_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 31 | self.test_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 32 | 33 | def forward(self, input_ids, attention_mask, labels): 34 | return self.model(input_ids, attention_mask=attention_mask, labels=labels) 35 | 36 | def training_step(self, batch, batch_idx): 37 | outputs = self( 38 | batch["input_ids"], 39 | attention_mask=batch["attention_mask"], 40 | labels=batch["label"], 41 | ) 42 | self.log("train_loss", outputs["loss"]) 43 | with torch.no_grad(): 44 | logits = outputs["logits"] 45 | predicted_labels = torch.argmax(logits, 1) 46 | self.train_acc(predicted_labels, batch["label"]) 47 | self.log("train_acc", self.train_acc, on_epoch=True, on_step=False) 48 | return outputs["loss"] # this is passed to the optimizer for training 49 | 50 | def validation_step(self, batch, batch_idx): 51 | outputs = self( 52 | batch["input_ids"], 53 | attention_mask=batch["attention_mask"], 54 | labels=batch["label"], 55 | ) 56 | self.log("val_loss", outputs["loss"], prog_bar=True) 57 | 58 | logits = outputs["logits"] 59 | predicted_labels = torch.argmax(logits, 1) 60 | self.val_acc(predicted_labels, batch["label"]) 61 | self.log("val_acc", self.val_acc, prog_bar=True) 62 | 63 | def test_step(self, batch, batch_idx): 64 | outputs = self( 65 | batch["input_ids"], 66 | attention_mask=batch["attention_mask"], 67 | labels=batch["label"], 68 | ) 69 | 70 | logits = outputs["logits"] 71 | predicted_labels = torch.argmax(logits, 1) 72 | self.test_acc(predicted_labels, batch["label"]) 73 | self.log("accuracy", self.test_acc, prog_bar=True) 74 | 75 | def configure_optimizers(self): 76 | optimizer = torch.optim.Adam( 77 | self.trainer.model.parameters(), lr=self.learning_rate 78 | ) 79 | return optimizer 80 | 81 | 82 | if __name__ == "__main__": 83 | 84 | ########################## 85 | ### 1 Loading the Dataset 86 | ########################## 87 | download_dataset() 88 | df = load_dataset_into_to_dataframe() 89 | if not (op.exists("train.csv") and op.exists("val.csv") and op.exists("test.csv")): 90 | partition_dataset(df) 91 | 92 | imdb_dataset = load_dataset( 93 | "csv", 94 | data_files={ 95 | "train": "train.csv", 96 | "validation": "val.csv", 97 | "test": "test.csv", 98 | }, 99 | ) 100 | 101 | ######################################### 102 | ### 2 Tokenization and Numericalization 103 | ######################################## 104 | 105 | tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased") 106 | print("Tokenizer input max length:", tokenizer.model_max_length) 107 | print("Tokenizer vocabulary size:", tokenizer.vocab_size) 108 | 109 | imdb_tokenized = imdb_dataset.map(tokenize_text, batched=True, batch_size=None) 110 | del imdb_dataset 111 | imdb_tokenized.set_format("torch", columns=["input_ids", "attention_mask", "label"]) 112 | os.environ["TOKENIZERS_PARALLELISM"] = "false" 113 | 114 | ######################################### 115 | ### 3 Set Up DataLoaders 116 | ######################################### 117 | 118 | train_dataset = IMDBDataset(imdb_tokenized, partition_key="train") 119 | val_dataset = IMDBDataset(imdb_tokenized, partition_key="validation") 120 | test_dataset = IMDBDataset(imdb_tokenized, partition_key="test") 121 | 122 | train_loader = DataLoader( 123 | dataset=train_dataset, 124 | batch_size=64, 125 | shuffle=True, 126 | num_workers=4 127 | ) 128 | 129 | val_loader = DataLoader( 130 | dataset=val_dataset, 131 | batch_size=64, 132 | num_workers=4 133 | ) 134 | 135 | test_loader = DataLoader( 136 | dataset=test_dataset, 137 | batch_size=64, 138 | num_workers=4 139 | ) 140 | 141 | ######################################### 142 | ### 4 Initializing the Model 143 | ######################################### 144 | 145 | model = AutoModelForSequenceClassification.from_pretrained( 146 | "distilbert-base-uncased", num_labels=2) 147 | 148 | ######################################### 149 | ### 5 Finetuning 150 | ######################################### 151 | 152 | lightning_model = LightningModel(model) 153 | 154 | callbacks = [ 155 | ModelCheckpoint( 156 | save_top_k=1, mode="max", monitor="val_acc" 157 | ) # save top 1 model 158 | ] 159 | logger = CSVLogger(save_dir="logs/", name="adam") 160 | 161 | trainer = L.Trainer( 162 | max_epochs=10, 163 | callbacks=callbacks, 164 | precision="16-mixed", 165 | accelerator="gpu", 166 | devices=4, 167 | strategy="deepspeed_stage_2", 168 | logger=logger, 169 | log_every_n_steps=10, 170 | deterministic=True 171 | ) 172 | 173 | start = time.time() 174 | 175 | trainer.fit( 176 | model=lightning_model, 177 | train_dataloaders=train_loader, 178 | val_dataloaders=val_loader 179 | ) 180 | 181 | end = time.time() 182 | elapsed = end-start 183 | print(f"Time elapsed {elapsed/60:.2f} min") 184 | 185 | test_acc = trainer.test(lightning_model, dataloaders=test_loader, ckpt_path="best") 186 | print(test_acc) -------------------------------------------------------------------------------- /src/adamW.py: -------------------------------------------------------------------------------- 1 | import os 2 | import os.path as op 3 | import time 4 | 5 | from datasets import load_dataset 6 | import lightning as L 7 | from lightning.pytorch.callbacks import ModelCheckpoint 8 | from lightning.pytorch.loggers import CSVLogger 9 | import torch 10 | from torch.utils.data import DataLoader 11 | import torchmetrics 12 | from transformers import AutoTokenizer 13 | from transformers import AutoModelForSequenceClassification 14 | 15 | from local_dataset_utilities import download_dataset, load_dataset_into_to_dataframe, partition_dataset 16 | from local_dataset_utilities import IMDBDataset 17 | 18 | 19 | def tokenize_text(batch): 20 | return tokenizer(batch["text"], truncation=True, padding=True) 21 | 22 | 23 | class LightningModel(L.LightningModule): 24 | def __init__(self, model, learning_rate=5e-5): 25 | super().__init__() 26 | 27 | self.learning_rate = learning_rate 28 | self.model = model 29 | self.train_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 30 | self.val_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 31 | self.test_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 32 | 33 | def forward(self, input_ids, attention_mask, labels): 34 | return self.model(input_ids, attention_mask=attention_mask, labels=labels) 35 | 36 | def training_step(self, batch, batch_idx): 37 | outputs = self( 38 | batch["input_ids"], 39 | attention_mask=batch["attention_mask"], 40 | labels=batch["label"], 41 | ) 42 | self.log("train_loss", outputs["loss"]) 43 | with torch.no_grad(): 44 | logits = outputs["logits"] 45 | predicted_labels = torch.argmax(logits, 1) 46 | self.train_acc(predicted_labels, batch["label"]) 47 | self.log("train_acc", self.train_acc, on_epoch=True, on_step=False) 48 | return outputs["loss"] # this is passed to the optimizer for training 49 | 50 | def validation_step(self, batch, batch_idx): 51 | outputs = self( 52 | batch["input_ids"], 53 | attention_mask=batch["attention_mask"], 54 | labels=batch["label"], 55 | ) 56 | self.log("val_loss", outputs["loss"], prog_bar=True) 57 | 58 | logits = outputs["logits"] 59 | predicted_labels = torch.argmax(logits, 1) 60 | self.val_acc(predicted_labels, batch["label"]) 61 | self.log("val_acc", self.val_acc, prog_bar=True) 62 | 63 | def test_step(self, batch, batch_idx): 64 | outputs = self( 65 | batch["input_ids"], 66 | attention_mask=batch["attention_mask"], 67 | labels=batch["label"], 68 | ) 69 | 70 | logits = outputs["logits"] 71 | predicted_labels = torch.argmax(logits, 1) 72 | self.test_acc(predicted_labels, batch["label"]) 73 | self.log("accuracy", self.test_acc, prog_bar=True) 74 | 75 | def configure_optimizers(self): 76 | optimizer = torch.optim.AdamW( 77 | self.trainer.model.parameters(), lr=self.learning_rate, 78 | weight_decay=0.1 79 | ) 80 | return optimizer 81 | 82 | 83 | if __name__ == "__main__": 84 | 85 | ########################## 86 | ### 1 Loading the Dataset 87 | ########################## 88 | download_dataset() 89 | df = load_dataset_into_to_dataframe() 90 | if not (op.exists("train.csv") and op.exists("val.csv") and op.exists("test.csv")): 91 | partition_dataset(df) 92 | 93 | imdb_dataset = load_dataset( 94 | "csv", 95 | data_files={ 96 | "train": "train.csv", 97 | "validation": "val.csv", 98 | "test": "test.csv", 99 | }, 100 | ) 101 | 102 | ######################################### 103 | ### 2 Tokenization and Numericalization 104 | ######################################## 105 | 106 | tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased") 107 | print("Tokenizer input max length:", tokenizer.model_max_length) 108 | print("Tokenizer vocabulary size:", tokenizer.vocab_size) 109 | 110 | imdb_tokenized = imdb_dataset.map(tokenize_text, batched=True, batch_size=None) 111 | del imdb_dataset 112 | imdb_tokenized.set_format("torch", columns=["input_ids", "attention_mask", "label"]) 113 | os.environ["TOKENIZERS_PARALLELISM"] = "false" 114 | 115 | ######################################### 116 | ### 3 Set Up DataLoaders 117 | ######################################### 118 | 119 | train_dataset = IMDBDataset(imdb_tokenized, partition_key="train") 120 | val_dataset = IMDBDataset(imdb_tokenized, partition_key="validation") 121 | test_dataset = IMDBDataset(imdb_tokenized, partition_key="test") 122 | 123 | train_loader = DataLoader( 124 | dataset=train_dataset, 125 | batch_size=64, 126 | shuffle=True, 127 | num_workers=4 128 | ) 129 | 130 | val_loader = DataLoader( 131 | dataset=val_dataset, 132 | batch_size=64, 133 | num_workers=4 134 | ) 135 | 136 | test_loader = DataLoader( 137 | dataset=test_dataset, 138 | batch_size=64, 139 | num_workers=4 140 | ) 141 | 142 | ######################################### 143 | ### 4 Initializing the Model 144 | ######################################### 145 | 146 | model = AutoModelForSequenceClassification.from_pretrained( 147 | "distilbert-base-uncased", num_labels=2) 148 | 149 | ######################################### 150 | ### 5 Finetuning 151 | ######################################### 152 | 153 | lightning_model = LightningModel(model) 154 | 155 | callbacks = [ 156 | ModelCheckpoint( 157 | save_top_k=1, mode="max", monitor="val_acc" 158 | ) # save top 1 model 159 | ] 160 | logger = CSVLogger(save_dir="logs/", name="adamW") 161 | 162 | trainer = L.Trainer( 163 | max_epochs=10, 164 | callbacks=callbacks, 165 | precision="16-mixed", 166 | accelerator="gpu", 167 | devices=4, 168 | strategy="deepspeed_stage_2", 169 | logger=logger, 170 | log_every_n_steps=10, 171 | deterministic=True 172 | ) 173 | 174 | start = time.time() 175 | 176 | trainer.fit( 177 | model=lightning_model, 178 | train_dataloaders=train_loader, 179 | val_dataloaders=val_loader 180 | ) 181 | 182 | end = time.time() 183 | elapsed = end-start 184 | print(f"Time elapsed {elapsed/60:.2f} min") 185 | 186 | test_acc = trainer.test(lightning_model, dataloaders=test_loader, ckpt_path="best") 187 | print(test_acc) -------------------------------------------------------------------------------- /src/lion.py: -------------------------------------------------------------------------------- 1 | import os 2 | import os.path as op 3 | import time 4 | 5 | from datasets import load_dataset 6 | import lightning as L 7 | from lightning.pytorch.callbacks import ModelCheckpoint 8 | from lightning.pytorch.loggers import CSVLogger 9 | import torch 10 | from torch.utils.data import DataLoader 11 | import torchmetrics 12 | from transformers import AutoTokenizer 13 | from transformers import AutoModelForSequenceClassification 14 | 15 | from lion_pytorch import Lion # pip install lion-pytorch 16 | 17 | from local_dataset_utilities import download_dataset, load_dataset_into_to_dataframe, partition_dataset 18 | from local_dataset_utilities import IMDBDataset 19 | 20 | 21 | def tokenize_text(batch): 22 | return tokenizer(batch["text"], truncation=True, padding=True) 23 | 24 | 25 | class LightningModel(L.LightningModule): 26 | def __init__(self, model, learning_rate): 27 | super().__init__() 28 | 29 | self.learning_rate = learning_rate 30 | self.model = model 31 | self.train_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 32 | self.val_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 33 | self.test_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 34 | 35 | def forward(self, input_ids, attention_mask, labels): 36 | return self.model(input_ids, attention_mask=attention_mask, labels=labels) 37 | 38 | def training_step(self, batch, batch_idx): 39 | outputs = self( 40 | batch["input_ids"], 41 | attention_mask=batch["attention_mask"], 42 | labels=batch["label"], 43 | ) 44 | self.log("train_loss", outputs["loss"]) 45 | with torch.no_grad(): 46 | logits = outputs["logits"] 47 | predicted_labels = torch.argmax(logits, 1) 48 | self.train_acc(predicted_labels, batch["label"]) 49 | self.log("train_acc", self.train_acc, on_epoch=True, on_step=False) 50 | return outputs["loss"] # this is passed to the optimizer for training 51 | 52 | def validation_step(self, batch, batch_idx): 53 | outputs = self( 54 | batch["input_ids"], 55 | attention_mask=batch["attention_mask"], 56 | labels=batch["label"], 57 | ) 58 | self.log("val_loss", outputs["loss"], prog_bar=True) 59 | 60 | logits = outputs["logits"] 61 | predicted_labels = torch.argmax(logits, 1) 62 | self.val_acc(predicted_labels, batch["label"]) 63 | self.log("val_acc", self.val_acc, prog_bar=True) 64 | 65 | def test_step(self, batch, batch_idx): 66 | outputs = self( 67 | batch["input_ids"], 68 | attention_mask=batch["attention_mask"], 69 | labels=batch["label"], 70 | ) 71 | 72 | logits = outputs["logits"] 73 | predicted_labels = torch.argmax(logits, 1) 74 | self.test_acc(predicted_labels, batch["label"]) 75 | self.log("accuracy", self.test_acc, prog_bar=True) 76 | 77 | def configure_optimizers(self): 78 | opt = Lion(model.parameters(), lr=self.learning_rate, weight_decay=1e-2) 79 | return opt 80 | 81 | 82 | if __name__ == "__main__": 83 | 84 | ########################## 85 | ### 1 Loading the Dataset 86 | ########################## 87 | download_dataset() 88 | df = load_dataset_into_to_dataframe() 89 | if not (op.exists("train.csv") and op.exists("val.csv") and op.exists("test.csv")): 90 | partition_dataset(df) 91 | 92 | imdb_dataset = load_dataset( 93 | "csv", 94 | data_files={ 95 | "train": "train.csv", 96 | "validation": "val.csv", 97 | "test": "test.csv", 98 | }, 99 | ) 100 | 101 | ######################################### 102 | ### 2 Tokenization and Numericalization 103 | ######################################## 104 | 105 | tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased") 106 | print("Tokenizer input max length:", tokenizer.model_max_length) 107 | print("Tokenizer vocabulary size:", tokenizer.vocab_size) 108 | 109 | imdb_tokenized = imdb_dataset.map(tokenize_text, batched=True, batch_size=None) 110 | del imdb_dataset 111 | imdb_tokenized.set_format("torch", columns=["input_ids", "attention_mask", "label"]) 112 | os.environ["TOKENIZERS_PARALLELISM"] = "false" 113 | 114 | ######################################### 115 | ### 3 Set Up DataLoaders 116 | ######################################### 117 | 118 | train_dataset = IMDBDataset(imdb_tokenized, partition_key="train") 119 | val_dataset = IMDBDataset(imdb_tokenized, partition_key="validation") 120 | test_dataset = IMDBDataset(imdb_tokenized, partition_key="test") 121 | 122 | train_loader = DataLoader( 123 | dataset=train_dataset, 124 | batch_size=64, 125 | shuffle=True, 126 | num_workers=4 127 | ) 128 | 129 | val_loader = DataLoader( 130 | dataset=val_dataset, 131 | batch_size=64, 132 | num_workers=4 133 | ) 134 | 135 | test_loader = DataLoader( 136 | dataset=test_dataset, 137 | batch_size=64, 138 | num_workers=4 139 | ) 140 | 141 | ######################################### 142 | ### 4 Initializing the Model 143 | ######################################### 144 | 145 | model = AutoModelForSequenceClassification.from_pretrained( 146 | "distilbert-base-uncased", num_labels=2) 147 | 148 | ######################################### 149 | ### 5 Finetuning 150 | ######################################### 151 | 152 | num_epochs = 10 153 | lightning_model = LightningModel(model, learning_rate=1e-5) 154 | 155 | callbacks = [ 156 | ModelCheckpoint( 157 | save_top_k=1, mode="max", monitor="val_acc" 158 | ) # save top 1 model 159 | ] 160 | logger = CSVLogger(save_dir="logs/", name="lion") 161 | 162 | trainer = L.Trainer( 163 | max_epochs=num_epochs, 164 | callbacks=callbacks, 165 | precision="16-mixed", 166 | accelerator="gpu", 167 | devices=4, 168 | strategy="deepspeed_stage_2", 169 | logger=logger, 170 | log_every_n_steps=10, 171 | deterministic=True 172 | ) 173 | 174 | start = time.time() 175 | 176 | trainer.fit( 177 | model=lightning_model, 178 | train_dataloaders=train_loader, 179 | val_dataloaders=val_loader 180 | ) 181 | 182 | end = time.time() 183 | elapsed = end-start 184 | print(f"Time elapsed {elapsed/60:.2f} min") 185 | 186 | test_acc = trainer.test(lightning_model, dataloaders=test_loader, ckpt_path="best") 187 | print(test_acc) -------------------------------------------------------------------------------- /src/sgd-cosine.py: -------------------------------------------------------------------------------- 1 | import os 2 | import os.path as op 3 | import time 4 | 5 | from datasets import load_dataset 6 | import lightning as L 7 | from lightning.pytorch.callbacks import ModelCheckpoint 8 | from lightning.pytorch.loggers import CSVLogger 9 | import torch 10 | from torch.utils.data import DataLoader 11 | import torchmetrics 12 | from transformers import AutoTokenizer 13 | from transformers import AutoModelForSequenceClassification 14 | 15 | from local_dataset_utilities import download_dataset, load_dataset_into_to_dataframe, partition_dataset 16 | from local_dataset_utilities import IMDBDataset 17 | 18 | 19 | def tokenize_text(batch): 20 | return tokenizer(batch["text"], truncation=True, padding=True) 21 | 22 | 23 | class LightningModel(L.LightningModule): 24 | def __init__(self, model, learning_rate, cosine_t_max): 25 | super().__init__() 26 | 27 | self.learning_rate = learning_rate 28 | self.cosine_t_max = cosine_t_max 29 | self.model = model 30 | self.train_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 31 | self.val_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 32 | self.test_acc = torchmetrics.Accuracy(task="multiclass", num_classes=2) 33 | 34 | def forward(self, input_ids, attention_mask, labels): 35 | return self.model(input_ids, attention_mask=attention_mask, labels=labels) 36 | 37 | def training_step(self, batch, batch_idx): 38 | outputs = self( 39 | batch["input_ids"], 40 | attention_mask=batch["attention_mask"], 41 | labels=batch["label"], 42 | ) 43 | self.log("train_loss", outputs["loss"]) 44 | with torch.no_grad(): 45 | logits = outputs["logits"] 46 | predicted_labels = torch.argmax(logits, 1) 47 | self.train_acc(predicted_labels, batch["label"]) 48 | self.log("train_acc", self.train_acc, on_epoch=True, on_step=False) 49 | return outputs["loss"] # this is passed to the optimizer for training 50 | 51 | def validation_step(self, batch, batch_idx): 52 | outputs = self( 53 | batch["input_ids"], 54 | attention_mask=batch["attention_mask"], 55 | labels=batch["label"], 56 | ) 57 | self.log("val_loss", outputs["loss"], prog_bar=True) 58 | 59 | logits = outputs["logits"] 60 | predicted_labels = torch.argmax(logits, 1) 61 | self.val_acc(predicted_labels, batch["label"]) 62 | self.log("val_acc", self.val_acc, prog_bar=True) 63 | 64 | def test_step(self, batch, batch_idx): 65 | outputs = self( 66 | batch["input_ids"], 67 | attention_mask=batch["attention_mask"], 68 | labels=batch["label"], 69 | ) 70 | 71 | logits = outputs["logits"] 72 | predicted_labels = torch.argmax(logits, 1) 73 | self.test_acc(predicted_labels, batch["label"]) 74 | self.log("accuracy", self.test_acc, prog_bar=True) 75 | 76 | def configure_optimizers(self): 77 | opt = torch.optim.SGD(self.parameters(), momentum=0.0, lr=self.learning_rate) 78 | sch = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=self.cosine_t_max) 79 | 80 | return { 81 | "optimizer": opt, 82 | "lr_scheduler": { 83 | "scheduler": sch, 84 | "monitor": "train_loss", 85 | "interval": "step", # step means "batch" here, default: epoch # New! 86 | "frequency": 1, # default 87 | }, 88 | } 89 | 90 | 91 | if __name__ == "__main__": 92 | 93 | ########################## 94 | ### 1 Loading the Dataset 95 | ########################## 96 | download_dataset() 97 | df = load_dataset_into_to_dataframe() 98 | if not (op.exists("train.csv") and op.exists("val.csv") and op.exists("test.csv")): 99 | partition_dataset(df) 100 | 101 | imdb_dataset = load_dataset( 102 | "csv", 103 | data_files={ 104 | "train": "train.csv", 105 | "validation": "val.csv", 106 | "test": "test.csv", 107 | }, 108 | ) 109 | 110 | ######################################### 111 | ### 2 Tokenization and Numericalization 112 | ######################################## 113 | 114 | tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased") 115 | print("Tokenizer input max length:", tokenizer.model_max_length) 116 | print("Tokenizer vocabulary size:", tokenizer.vocab_size) 117 | 118 | imdb_tokenized = imdb_dataset.map(tokenize_text, batched=True, batch_size=None) 119 | del imdb_dataset 120 | imdb_tokenized.set_format("torch", columns=["input_ids", "attention_mask", "label"]) 121 | os.environ["TOKENIZERS_PARALLELISM"] = "false" 122 | 123 | ######################################### 124 | ### 3 Set Up DataLoaders 125 | ######################################### 126 | 127 | train_dataset = IMDBDataset(imdb_tokenized, partition_key="train") 128 | val_dataset = IMDBDataset(imdb_tokenized, partition_key="validation") 129 | test_dataset = IMDBDataset(imdb_tokenized, partition_key="test") 130 | 131 | train_loader = DataLoader( 132 | dataset=train_dataset, 133 | batch_size=64, 134 | shuffle=True, 135 | num_workers=4 136 | ) 137 | 138 | val_loader = DataLoader( 139 | dataset=val_dataset, 140 | batch_size=64, 141 | num_workers=4 142 | ) 143 | 144 | test_loader = DataLoader( 145 | dataset=test_dataset, 146 | batch_size=64, 147 | num_workers=4 148 | ) 149 | 150 | ######################################### 151 | ### 4 Initializing the Model 152 | ######################################### 153 | 154 | model = AutoModelForSequenceClassification.from_pretrained( 155 | "distilbert-base-uncased", num_labels=2) 156 | 157 | ######################################### 158 | ### 5 Finetuning 159 | ######################################### 160 | 161 | num_epochs = 10 162 | num_steps = num_epochs * len(train_loader) 163 | 164 | lightning_model = LightningModel(model, learning_rate=0.05, cosine_t_max=num_steps) 165 | 166 | callbacks = [ 167 | ModelCheckpoint( 168 | save_top_k=1, mode="max", monitor="val_acc" 169 | ) # save top 1 model 170 | ] 171 | logger = CSVLogger(save_dir="logs/", name="sgd-cosine") 172 | 173 | trainer = L.Trainer( 174 | max_epochs=num_epochs, 175 | callbacks=callbacks, 176 | precision="16-mixed", 177 | accelerator="gpu", 178 | devices=4, 179 | strategy="deepspeed_stage_2", 180 | logger=logger, 181 | log_every_n_steps=10, 182 | deterministic=True 183 | ) 184 | 185 | start = time.time() 186 | 187 | trainer.fit( 188 | model=lightning_model, 189 | train_dataloaders=train_loader, 190 | val_dataloaders=val_loader 191 | ) 192 | 193 | end = time.time() 194 | elapsed = end-start 195 | print(f"Time elapsed {elapsed/60:.2f} min") 196 | 197 | test_acc = trainer.test(lightning_model, dataloaders=test_loader, ckpt_path="best") 198 | print(test_acc) --------------------------------------------------------------------------------