{ "info": { "author": "Rapha\u00ebl Meudec", "author_email": "raphaelm@sicara.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# tf-explain\n\n[![Pypi Version](https://img.shields.io/pypi/v/tf-explain.svg)](https://pypi.org/project/tf-explain/)\n[![Build Status](https://api.travis-ci.org/sicara/tf-explain.svg?branch=master)](https://travis-ci.org/sicara/tf-explain)\n[![Documentation Status](https://readthedocs.org/projects/tf-explain/badge/?version=latest)](https://tf-explain.readthedocs.io/en/latest/?badge=latest)\n![Python Versions](https://img.shields.io/badge/python-3.6%20|%203.7-%23EBBD68.svg)\n![Tensorflow Versions](https://img.shields.io/badge/tensorflow-2.0.0-blue.svg)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black)\n\n__tf-explain__ implements interpretability methods as Tensorflow 2.0 callbacks to __ease neural network's understanding__. \nSee [Introducing tf-explain, Interpretability for Tensorflow 2.0](https://blog.sicara.com/tf-explain-interpretability-tensorflow-2-9438b5846e35)\n\n__Documentation__: https://tf-explain.readthedocs.io\n\n## Installation\n\n__tf-explain__ is available on PyPi as an alpha release. To install it:\n\n```bash\nvirtualenv venv -p python3.6\npip install tf-explain\n```\n\ntf-explain is compatible with Tensorflow 2. It is not declared as a dependency\nto let you choose between CPU and GPU versions. Additionally to the previous install, run:\n\n```bash\n# For CPU version\npip install tensorflow==2.0.0\n# For GPU version\npip install tensorflow-gpu==2.0.0\n```\n\n## Available Methods\n\n1. [Activations Visualization](#activations-visualization)\n2. [Vanilla Gradients](#vanilla-gradients)\n3. [Occlusion Sensitivity](#occlusion-sensitivity)\n4. [Grad CAM (Class Activation Maps)](#grad-cam)\n5. [SmoothGrad](#smoothgrad)\n6. [Integrated Gradients](#integrated-gradients)\n\n### Activations Visualization\n\n> Visualize how a given input comes out of a specific activation layer\n\n```python\nfrom tf_explain.callbacks.activations_visualization import ActivationsVisualizationCallback\n\nmodel = [...]\n\ncallbacks = [\n ActivationsVisualizationCallback(\n validation_data=(x_val, y_val),\n layers_name=[\"activation_1\"],\n output_dir=output_dir,\n ),\n]\n\nmodel.fit(x_train, y_train, batch_size=2, epochs=2, callbacks=callbacks)\n```\n\n

\n \n

\n\n\n### Vanilla Gradients\n\n> Visualize gradients importance on input image\n\n```python\nfrom tf_explain.callbacks.gradients import VanillaGradientsCallback\n\nmodel = [...]\n\ncallbacks = [\n VanillaGradientsCallback(\n validation_data=(x_val, y_val),\n class_index=0,\n output_dir=output_dir,\n ),\n]\n\nmodel.fit(x_train, y_train, batch_size=2, epochs=2, callbacks=callbacks)\n```\n\n

\n \n

\n\n\n### Occlusion Sensitivity\n\n> Visualize how parts of the image affects neural network's confidence by occluding parts iteratively\n\n```python\nfrom tf_explain.callbacks.occlusion_sensitivity import OcclusionSensitivityCallback\n\nmodel = [...]\n\ncallbacks = [\n OcclusionSensitivityCallback(\n validation_data=(x_val, y_val),\n class_index=0,\n patch_size=4,\n output_dir=output_dir,\n ),\n]\n\nmodel.fit(x_train, y_train, batch_size=2, epochs=2, callbacks=callbacks)\n```\n\n
\n \n

Occlusion Sensitivity for Tabby class (stripes differentiate tabby cat from other ImageNet cat classes)

\n
\n\n### Grad CAM\n\n> Visualize how parts of the image affects neural network's output by looking into the activation maps\n\nFrom [Grad-CAM: Visual Explanations from Deep Networks\nvia Gradient-based Localization](https://arxiv.org/abs/1610.02391)\n\n```python\nfrom tf_explain.callbacks.grad_cam import GradCAMCallback\n\nmodel = [...]\n\ncallbacks = [\n GradCAMCallback(\n validation_data=(x_val, y_val),\n layer_name=\"activation_1\",\n class_index=0,\n output_dir=output_dir,\n )\n]\n\nmodel.fit(x_train, y_train, batch_size=2, epochs=2, callbacks=callbacks)\n```\n\n\n

\n \n

\n\n### SmoothGrad\n\n> Visualize stabilized gradients on the inputs towards the decision\n\nFrom [SmoothGrad: removing noise by adding noise](https://arxiv.org/abs/1706.03825)\n\n```python\nfrom tf_explain.callbacks.smoothgrad import SmoothGradCallback\n\nmodel = [...]\n\ncallbacks = [\n SmoothGradCallback(\n validation_data=(x_val, y_val),\n class_index=0,\n num_samples=20,\n noise=1.,\n output_dir=output_dir,\n )\n]\n\nmodel.fit(x_train, y_train, batch_size=2, epochs=2, callbacks=callbacks)\n```\n\n

\n \n

\n\n### Integrated Gradients\n\n> Visualize an average of the gradients along the construction of the input towards the decision\n\nFrom [Axiomatic Attribution for Deep Networks](https://arxiv.org/pdf/1703.01365.pdf)\n\n```python\nfrom tf_explain.callbacks.integrated_gradients import IntegratedGradientsCallback\n\nmodel = [...]\n\ncallbacks = [\n IntegratedGradientsCallback(\n validation_data=(x_val, y_val),\n class_index=0,\n n_steps=20,\n output_dir=output_dir,\n )\n]\n\nmodel.fit(x_train, y_train, batch_size=2, epochs=2, callbacks=callbacks)\n```\n\n

\n \n

\n\n\n## Visualizing the results\n\nWhen you use the callbacks, the output files are created in the `logs` directory.\n\nYou can see them in Tensorboard with the following command: `tensorboard --logdir logs`\n\n\n## Roadmap\n\n- [ ] Subclassing API Support\n- [ ] Additional Methods\n - [ ] [GradCAM++](https://arxiv.org/abs/1710.11063)\n - [x] [Integrated Gradients](https://arxiv.org/abs/1703.01365)\n - [ ] [Guided SmoothGrad](https://arxiv.org/abs/1706.03825)\n - [ ] [LRP](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0130140)\n- [ ] Auto-generated API Documentation & Documentation Testing\n\n## Contributing\n\nTo contribute to the project, please read the [dedicated section](./CONTRIBUTING.md).\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/sicara/tf-explain", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "tf-explain", "package_url": "https://pypi.org/project/tf-explain/", "platform": "", "project_url": "https://pypi.org/project/tf-explain/", "project_urls": { "Homepage": "https://github.com/sicara/tf-explain" }, "release_url": "https://pypi.org/project/tf-explain/0.1.0/", "requires_dist": [ "opencv-python (>=4.1.0.25)", "sphinx (>=2.1.2) ; extra == 'docs'", "sphinx-rtd-theme (>=0.4.3) ; extra == 'docs'", "bumpversion (>=0.5.3) ; extra == 'publish'", "twine (>=1.13.0) ; extra == 'publish'", "black (>=19.3b0) ; extra == 'tests'", "pylint (>=2.3.1) ; extra == 'tests'", "pytest (>=5.0.1) ; extra == 'tests'", "pytest-timeout (>=1.3.3) ; extra == 'tests'", "pytest-mock (>=1.10.4) ; extra == 'tests'", "pytest-cov (>=2.7.1) ; extra == 'tests'", "tox (>=3.13.2) ; extra == 'tests'" ], "requires_python": ">=3.6", "summary": "Interpretability Callbacks for Tensorflow 2.0", "version": "0.1.0" }, "last_serial": 5918894, "releases": { "0.0.1a0": [ { "comment_text": "", "digests": { "md5": "7161612ce1595138fbf92aafd3869dd8", "sha256": "e8d86ee2f70d09aa8660d079c715ab7fd3d1808e6fb66f2b81443db719285607" }, "downloads": -1, "filename": "tf_explain-0.0.1a0-py3-none-any.whl", "has_sig": false, "md5_digest": "7161612ce1595138fbf92aafd3869dd8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19568, "upload_time": "2019-07-26T12:30:11", "url": "https://files.pythonhosted.org/packages/26/8f/3005fc0a7dc1ffbe29ef794e09cf86e60158142c955f9ee9cdc4193a6aeb/tf_explain-0.0.1a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "66acba3cbf9f6095fac1294df5ae371d", "sha256": "15a46bfa5ac15fc7670238bd8d5aeadbe99822215610fd87a0b99e8022262307" }, "downloads": -1, "filename": "tf-explain-0.0.1a0.tar.gz", "has_sig": false, "md5_digest": "66acba3cbf9f6095fac1294df5ae371d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10276, "upload_time": "2019-07-26T12:30:12", "url": "https://files.pythonhosted.org/packages/0a/6f/7753104e8db45355ae91fa1dd764e6c479590c8c989101d652e6a71e0f93/tf-explain-0.0.1a0.tar.gz" } ], "0.0.2a0": [ { "comment_text": "", "digests": { "md5": "731568d430d3a4856b85f3f02035bafb", "sha256": "8dcefe762ab9ed70e6999953bdc3a6181540de549cec871b45231849d7319f36" }, "downloads": -1, "filename": "tf_explain-0.0.2a0-py3-none-any.whl", "has_sig": false, "md5_digest": "731568d430d3a4856b85f3f02035bafb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28202, "upload_time": "2019-07-31T09:54:00", "url": "https://files.pythonhosted.org/packages/af/54/cb2869ba0da4cf282af546441bab3e1d7a611bfc8811acd2345b41295038/tf_explain-0.0.2a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "88d5a531e221239dc1371de16147a667", "sha256": "582a5b00fe00bae653c33be363b909c9d6a49ac79d4fb4476718823d8c684e37" }, "downloads": -1, "filename": "tf-explain-0.0.2a0.tar.gz", "has_sig": false, "md5_digest": "88d5a531e221239dc1371de16147a667", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14444, "upload_time": "2019-07-31T09:54:02", "url": "https://files.pythonhosted.org/packages/a3/3f/22186426aa9c8c6d0580211550a1014c4727e33d7d3a067e2323ecea0cbf/tf-explain-0.0.2a0.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "f74a51ed4ebe38b11d8bb2180360ae97", "sha256": "df0ae3fa8bc98a615a703b091bc88ac00b934055bfdc4b7d489383e9f9af2ac7" }, "downloads": -1, "filename": "tf_explain-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f74a51ed4ebe38b11d8bb2180360ae97", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 38302, "upload_time": "2019-10-02T16:37:04", "url": "https://files.pythonhosted.org/packages/1e/1e/556ec1e91b100de61941a7c91589ce29be1afdc53d52658d2045ba84a7ab/tf_explain-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "13103be47f0b69651584092ee78bae56", "sha256": "3efb5542d6d2be91edbafab946027ee77bdf5aca0b42e004c6975095055de988" }, "downloads": -1, "filename": "tf-explain-0.1.0.tar.gz", "has_sig": false, "md5_digest": "13103be47f0b69651584092ee78bae56", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18379, "upload_time": "2019-10-02T16:37:07", "url": "https://files.pythonhosted.org/packages/f2/5b/4af109d75830a56ba091cd6245039ed986d835b0568e8e15a523cb687ea1/tf-explain-0.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f74a51ed4ebe38b11d8bb2180360ae97", "sha256": "df0ae3fa8bc98a615a703b091bc88ac00b934055bfdc4b7d489383e9f9af2ac7" }, "downloads": -1, "filename": "tf_explain-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f74a51ed4ebe38b11d8bb2180360ae97", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 38302, "upload_time": "2019-10-02T16:37:04", "url": "https://files.pythonhosted.org/packages/1e/1e/556ec1e91b100de61941a7c91589ce29be1afdc53d52658d2045ba84a7ab/tf_explain-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "13103be47f0b69651584092ee78bae56", "sha256": "3efb5542d6d2be91edbafab946027ee77bdf5aca0b42e004c6975095055de988" }, "downloads": -1, "filename": "tf-explain-0.1.0.tar.gz", "has_sig": false, "md5_digest": "13103be47f0b69651584092ee78bae56", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18379, "upload_time": "2019-10-02T16:37:07", "url": "https://files.pythonhosted.org/packages/f2/5b/4af109d75830a56ba091cd6245039ed986d835b0568e8e15a523cb687ea1/tf-explain-0.1.0.tar.gz" } ] }