{ "info": { "author": "Giuseppe Cuccu", "author_email": "giuseppe.cuccu@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Build Tools" ], "description": "# tinynet\n\nA tiny neural network library\n\n## No training\n\nThis library provides no training algorithm. You can easily set up a neuroevolution framework by including any black-box search algorithm, from [RWG](https://www.bioinf.jku.at/publications/older/ch9.pdf) (see example below) to [CMA-ES](https://github.com/CMA-ES/pycma).\n\n## Installation\n\n`pip install tinynet`\n\n## Usage\n\n```python\nfrom tinynet import RNN1L\nimport numpy as np\nnet_struct = [3, 5, 2]\nnet = RNN(net_struct) # try also FFNN\nnet.set_weights(np.random.randn(net.nweights))\nout = net.activate(np.zeros(net.ninputs))\nassert len(out) == net.noutputs\nassert len(net.state) == net.ninputs + 1 + net.noutputs # input, bias, recursion\n```\n\n## Neuroevolution application on the OpenAI Gym\n\nCheck out [this GitHub gist](https://gist.github.com/giuse/3d16c947259173d571cf82e28a2f7a7e) to run the Bipedal Walker using pre-trained weights.\n\nThe example below tackles the CartPole from scratch using RWG.\n\n\n```python\nimport numpy as np\nimport tinynet\nimport gym # just `pip install gym`\n\n# Environment setup\nenv = gym.make(\"CartPole-v1\")\n# env = gym.wrappers.Monitor(env, 'video', force = True) # Uncomment to save video\n\n# Get input size and output size from the environment\nnactions = env.action_space.n\nninputs = env.reset().size\n# Hidden layers are arbitrarily added\n# hidden = [20, 10, 20]\nhidden = [] # ... but unnecessary with the CartPole\nnet_struct = [ninputs, *hidden, nactions]\n\n# Network setup is straightforward (defaults: `act_fn=np.tanh, init_weights=None`)\nnet = tinynet.FFNN(net_struct) # also try `RNN(net_struct)`\n\n# Get random seed for deterministic fitness (for simplicity)\nrseed = np.random.randint(1e10)\n\n# Fitness function: gameplay loop\ndef fitness(ind, render=False):\n env.seed(rseed) # makes fitness deterministic\n obs = env.reset()\n score = 0\n done = False\n while not done:\n if render: env.render()\n action = net.activate(obs).argmax()\n obs, rew, done, info = env.step(action)\n score += rew\n print(f\"Score: {score}\")\n return score\n\n# RWG does not distinguish between populations and generations\nmax_ninds = 1000\n# Neuroevolution loop\nfor nind in range(max_ninds):\n ind = np.random.randn(net.nweights)\n net.set_weights(ind)\n score = fitness(ind)\n if score == 500:\n print(f\"Game solved in {nind} trials\")\n break\n\n# Replay winning individual\nfitness(ind, render=True)\n\n# You may want to drop into a console here to examine the results\nimport IPython; IPython.embed()\n```", "description_content_type": "text/markdown", "docs_url": null, "download_url": "https://github.com/giuse/tinynet/archive/0.1.1.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/giuse/tinynet", "keywords": "neuralnetwork machinelearning", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "tinynet", "package_url": "https://pypi.org/project/tinynet/", "platform": "", "project_url": "https://pypi.org/project/tinynet/", "project_urls": { "Bug Reports": "https://github.com/giuse/tinynet/issues", "Download": "https://github.com/giuse/tinynet/archive/0.1.1.tar.gz", "Homepage": "https://github.com/giuse/tinynet", "Source": "https://github.com/giuse/tinynet/" }, "release_url": "https://pypi.org/project/tinynet/0.1.1/", "requires_dist": null, "requires_python": ">=3.6, <4", "summary": "A tiny neural network library", "version": "0.1.1" }, "last_serial": 5545351, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "e1c4c7b72633e205440132c98029086a", "sha256": "ac83263f5aa1e0e1621d991487045b1f2b1a091caa4eff8c9a530dfae27c71b0" }, "downloads": -1, "filename": "tinynet-0.0.0.tar.gz", "has_sig": false, "md5_digest": "e1c4c7b72633e205440132c98029086a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1627, "upload_time": "2019-07-02T12:04:03", "url": "https://files.pythonhosted.org/packages/63/c7/1f2d9b26d24b845aca499d3bea2567cf9ee5e72b47545e137b73d7a6839d/tinynet-0.0.0.tar.gz" } ], "0.0.1": [ { "comment_text": "", "digests": { "md5": "3fa0de982a9718cfacd73b854cdf7326", "sha256": "38873e4d637687718b00b57f748d067822893eb0466422f2ac6980ff5284b731" }, "downloads": -1, "filename": "tinynet-0.0.1.tar.gz", "has_sig": false, "md5_digest": "3fa0de982a9718cfacd73b854cdf7326", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1709, "upload_time": "2019-07-02T12:31:46", "url": "https://files.pythonhosted.org/packages/08/27/8b056ab9ca7ab27f5be252d4998b26b765c03ac3cac3b067a155be9003bf/tinynet-0.0.1.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "a6090cba663ed92a967d9466375f54d1", "sha256": "1c99d027ba54e38ce06e6b14e000d9b8c78059a03d3556bb18a29c7535654069" }, "downloads": -1, "filename": "tinynet-0.0.5.tar.gz", "has_sig": false, "md5_digest": "a6090cba663ed92a967d9466375f54d1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6, <4", "size": 4328, "upload_time": "2019-07-04T10:55:06", "url": "https://files.pythonhosted.org/packages/6d/d0/85a1f1c3b384a48691a8a41f545e220d4e9c8d7b9dce699c47f0bfbbaf6d/tinynet-0.0.5.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "8ee48d4ca1565913597d571c3fcfbac6", "sha256": "5d3e8552e5915cb01f2ccfa537e06f53a7b6c0076217e79fca5a3bbbaf3112ab" }, "downloads": -1, "filename": "tinynet-0.1.0.tar.gz", "has_sig": false, "md5_digest": "8ee48d4ca1565913597d571c3fcfbac6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6, <4", "size": 4699, "upload_time": "2019-07-16T21:09:44", "url": "https://files.pythonhosted.org/packages/9b/42/b3f1d6ec6e2e6f1b29acf9267a1252a882cae844f47efb800968d94e51f2/tinynet-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "505db116bb1efc71ba67b5c931d2df4b", "sha256": "67dc9789bb11c48731dfbb8894e265c18058a1a614dd45abc1f2ce27a307c1d4" }, "downloads": -1, "filename": "tinynet-0.1.1.tar.gz", "has_sig": false, "md5_digest": "505db116bb1efc71ba67b5c931d2df4b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6, <4", "size": 5045, "upload_time": "2019-07-17T11:23:40", "url": "https://files.pythonhosted.org/packages/33/0b/b0b2c015b5411161a6d76ab76d046eed9cd4c01c5c7340cda60f770e28b8/tinynet-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "505db116bb1efc71ba67b5c931d2df4b", "sha256": "67dc9789bb11c48731dfbb8894e265c18058a1a614dd45abc1f2ce27a307c1d4" }, "downloads": -1, "filename": "tinynet-0.1.1.tar.gz", "has_sig": false, "md5_digest": "505db116bb1efc71ba67b5c931d2df4b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6, <4", "size": 5045, "upload_time": "2019-07-17T11:23:40", "url": "https://files.pythonhosted.org/packages/33/0b/b0b2c015b5411161a6d76ab76d046eed9cd4c01c5c7340cda60f770e28b8/tinynet-0.1.1.tar.gz" } ] }