{ "info": { "author": "", "author_email": "", "bugtrack_url": null, "classifiers": [], "description": "= torchtest\n\nA Tiny Test Suite for pytorch based Machine Learning models, inspired by https://github.com/Thenerdstation/mltest/blob/master/mltest/mltest.py[mltest]. \nChase Roberts lists out 4 basic tests in his https://medium.com/@keeper6928/mltest-automatically-test-neural-network-models-in-one-function-call-eb6f1fa5019d[medium post] about mltest. \ntorchtest is mostly a pytorch port of mltest(which was written for tensorflow).\n\n== Installation\n\n[source, bash]\n----\npip install --upgrade torchtest\n----\n\n== Tests\n\n\n[source, python]\n----\n# imports for examples\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.autograd import Variable\n----\n\n\n=== Variables Change\n\n[source, python]\n----\nfrom torchtest import assert_vars_change\n\ninputs = Variable(torch.randn(20, 20))\ntargets = Variable(torch.randint(0, 2, (20,))).long()\nbatch = [inputs, targets]\nmodel = nn.Linear(20, 2)\n\n# what are the variables?\nprint('Our list of parameters', [ np[0] for np in model.named_parameters() ])\n\n# do they change after a training step?\n# let's run a train step and see\nassert_vars_change(\n model=model, \n loss_fn=F.cross_entropy, \n optim=torch.optim.Adam(model.parameters()),\n batch=batch)\n----\n\n[source, python]\n----\n\"\"\" FAILURE \"\"\"\n# let's try to break this, so the test fails\nparams_to_train = [ np[1] for np in model.named_parameters() if np[0] is not 'bias' ]\n# run test now\nassert_vars_change(\n model=model, \n loss_fn=F.cross_entropy, \n optim=torch.optim.Adam(params_to_train),\n batch=batch)\n\n# YES! bias did not change\n----\n\n\n=== Variables Don't Change\n\n[source, python]\n----\nfrom torchtest import assert_vars_same\n\n# What if bias is not supposed to change, by design?\n# test to see if bias remains the same after training\nassert_vars_same(\n model=model, \n loss_fn=F.cross_entropy, \n optim=torch.optim.Adam(params_to_train),\n batch=batch,\n params=[('bias', model.bias)] \n )\n# it does? good. let's move on\n----\n\n=== Output Range\n\n[source, python]\n----\nfrom torchtest import test_suite\n\n# NOTE : bias is fixed (not trainable)\noptim = torch.optim.Adam(params_to_train)\nloss_fn=F.cross_entropy\n\ntest_suite(model, loss_fn, optim, batch, \n output_range=(-2, 2),\n test_output_range=True\n )\n\n# seems to work\n----\n\n[source, python]\n----\n\"\"\" FAILURE \"\"\"\n# let's tweak the model to fail the test\nmodel.bias = nn.Parameter(2 + torch.randn(2, ))\n\ntest_suite(\n model,\n loss_fn, optim, batch, \n output_range=(-1, 1),\n test_output_range=True\n )\n\n# as expected, it fails; yay!\n----\n\n=== NaN Tensors\n\n[source, python]\n----\n\"\"\" FAILURE \"\"\"\nmodel.bias = nn.Parameter(float('NaN') * torch.randn(2, ))\n\ntest_suite(\n model,\n loss_fn, optim, batch, \n test_nan_vals=True\n )\n----\n\n=== Inf Tensors\n\n[source, python]\n----\n\"\"\" FAILURE \"\"\"\nmodel.bias = nn.Parameter(float('Inf') * torch.randn(2, ))\n\ntest_suite(\n model,\n loss_fn, optim, batch, \n test_inf_vals=True\n )\n----\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "GNU Affero General Public License v3 or later (AGPLv3+)", "maintainer": "", "maintainer_email": "", "name": "torchtest", "package_url": "https://pypi.org/project/torchtest/", "platform": "", "project_url": "https://pypi.org/project/torchtest/", "project_urls": null, "release_url": "https://pypi.org/project/torchtest/0.5/", "requires_dist": [ "torch" ], "requires_python": "", "summary": "", "version": "0.5" }, "last_serial": 5211662, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "b82ebbe4659a15616d2243f3b5e949be", "sha256": "3dd57dbbe717bd7f4cc9c5f54e3d38e43d33db542651b6a9a6c24069f8be0d31" }, "downloads": -1, "filename": "torchtest-0.1.tar.gz", "has_sig": false, "md5_digest": "b82ebbe4659a15616d2243f3b5e949be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2888, "upload_time": "2018-11-11T17:41:52", "url": "https://files.pythonhosted.org/packages/88/21/775d7dee9d5d3c8800c8c75dd4322d9d588169179ad07937c0059e6564da/torchtest-0.1.tar.gz" } ], "0.2.1dev": [ { "comment_text": "", "digests": { "md5": "a9eaaba6fd2989a17036f79aa4b2bc39", "sha256": "8a804f8c96fb95e0591cb47a8f9edcca471006d5d2465330da887a551ee62d47" }, "downloads": -1, "filename": "torchtest-0.2.1dev.tar.gz", "has_sig": false, "md5_digest": "a9eaaba6fd2989a17036f79aa4b2bc39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3164, "upload_time": "2018-11-11T18:03:02", "url": "https://files.pythonhosted.org/packages/82/3c/7d62a85255dd61080d5fc947a99203eaf95bc4f5e68c028abc407123cf14/torchtest-0.2.1dev.tar.gz" } ], "0.2.2dev": [ { "comment_text": "", "digests": { "md5": "45eda3c91d2bb23512fb0dd1a8e6f738", "sha256": "e7e4bbf453a1fdcf9ea39ad557b4b027822ea6b49ec0a53c0decbfeedac91fba" }, "downloads": -1, "filename": "torchtest-0.2.2dev.tar.gz", "has_sig": false, "md5_digest": "45eda3c91d2bb23512fb0dd1a8e6f738", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3172, "upload_time": "2018-11-11T18:09:33", "url": "https://files.pythonhosted.org/packages/1a/51/f0052fb0aaee151f88c89d8ec4966aec9447948f2fa09452bb628ffa831e/torchtest-0.2.2dev.tar.gz" } ], "0.2dev": [ { "comment_text": "", "digests": { "md5": "648648bdb394c540fb2a1c85dab651d7", "sha256": "bda024cc864a67888b4e2007781cd698d4ef09c0d9356c047a7e430e9f13637e" }, "downloads": -1, "filename": "torchtest-0.2dev.tar.gz", "has_sig": false, "md5_digest": "648648bdb394c540fb2a1c85dab651d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3146, "upload_time": "2018-11-11T17:51:59", "url": "https://files.pythonhosted.org/packages/14/c0/4ffff96b9681021cc255ba0f27ba6e202626d8b39866ffd085b02fa36197/torchtest-0.2dev.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "b5937be30a1fc2fe5894f30060d29b06", "sha256": "8a7e62036c56c1eadc0ec7b5b827664006e4b33473b977a276e9910d2ca4d608" }, "downloads": -1, "filename": "torchtest-0.3.tar.gz", "has_sig": false, "md5_digest": "b5937be30a1fc2fe5894f30060d29b06", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3507, "upload_time": "2018-11-11T19:16:54", "url": "https://files.pythonhosted.org/packages/0f/9b/2252af5e2778bef3be0015f97aaa8fb19c29067a44ba37f50a1e8d81d6f5/torchtest-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "2495be4f218ef296661598367ac0ac85", "sha256": "65092a42b0854740c39e9b3cd556cb2ca0f10c66c8b7421d714fe1c48a77971f" }, "downloads": -1, "filename": "torchtest-0.3.1.tar.gz", "has_sig": false, "md5_digest": "2495be4f218ef296661598367ac0ac85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3595, "upload_time": "2018-11-11T19:31:55", "url": "https://files.pythonhosted.org/packages/64/ba/44ad49382ac613a6d0cb3779e590a9bc8c3a716d2de8b9aecb1088578f55/torchtest-0.3.1.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "7401b5eebd0a4b30823e9d6b6b269c38", "sha256": "c1b1fd673a8c3376ab7e5585f213e7b707038eeb623596f3eacdfcfc0a3ef6de" }, "downloads": -1, "filename": "torchtest-0.4.tar.gz", "has_sig": false, "md5_digest": "7401b5eebd0a4b30823e9d6b6b269c38", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4630, "upload_time": "2018-11-11T20:48:00", "url": "https://files.pythonhosted.org/packages/dd/92/165fe4a3aa8516fa67983b2c953928e99d68009538af9f52fbc46fc2af41/torchtest-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "168e3e63a8c73de9c8b28f246487e5ef", "sha256": "9b70896df8f3e79b0cf77a80e7ebf28eae4e330e04477031f6b0e463cba14b9a" }, "downloads": -1, "filename": "torchtest-0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "168e3e63a8c73de9c8b28f246487e5ef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6813, "upload_time": "2019-05-01T06:54:16", "url": "https://files.pythonhosted.org/packages/42/b1/eb572ef3dce32bfcc3bf60be6360cef0d01a58bde0c76f2e205234d1ff08/torchtest-0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3b0fdb4c080d0748e17c9bfcb3cbfc4", "sha256": "e6cffe5a9c8a6d6dbc927413ec9f9f0ed00f9123b8eb1b08e0a84a4b2f6e0772" }, "downloads": -1, "filename": "torchtest-0.5.tar.gz", "has_sig": false, "md5_digest": "a3b0fdb4c080d0748e17c9bfcb3cbfc4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4672, "upload_time": "2019-05-01T06:54:18", "url": "https://files.pythonhosted.org/packages/de/03/c38ae616c3bd12ac99958df9e1fba9ba36c52c04bb87143d02f97c87cf6e/torchtest-0.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "168e3e63a8c73de9c8b28f246487e5ef", "sha256": "9b70896df8f3e79b0cf77a80e7ebf28eae4e330e04477031f6b0e463cba14b9a" }, "downloads": -1, "filename": "torchtest-0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "168e3e63a8c73de9c8b28f246487e5ef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6813, "upload_time": "2019-05-01T06:54:16", "url": "https://files.pythonhosted.org/packages/42/b1/eb572ef3dce32bfcc3bf60be6360cef0d01a58bde0c76f2e205234d1ff08/torchtest-0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3b0fdb4c080d0748e17c9bfcb3cbfc4", "sha256": "e6cffe5a9c8a6d6dbc927413ec9f9f0ed00f9123b8eb1b08e0a84a4b2f6e0772" }, "downloads": -1, "filename": "torchtest-0.5.tar.gz", "has_sig": false, "md5_digest": "a3b0fdb4c080d0748e17c9bfcb3cbfc4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4672, "upload_time": "2019-05-01T06:54:18", "url": "https://files.pythonhosted.org/packages/de/03/c38ae616c3bd12ac99958df9e1fba9ba36c52c04bb87143d02f97c87cf6e/torchtest-0.5.tar.gz" } ] }