{ "info": { "author": "CyberZHG", "author_email": "CyberZHG@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6" ], "description": "# Keras Octave Conv\n\n[![Travis](https://travis-ci.org/CyberZHG/keras-octave-conv.svg)](https://travis-ci.org/CyberZHG/keras-octave-conv)\n[![Coverage](https://coveralls.io/repos/github/CyberZHG/keras-octave-conv/badge.svg?branch=master)](https://coveralls.io/github/CyberZHG/keras-octave-conv)\n![](https://img.shields.io/badge/license-MIT-blue.svg)\n[![996.ICU](https://img.shields.io/badge/license-Anti%20996-blue.svg)](https://996.icu) \n\nUnofficial implementation of [Drop an Octave: Reducing Spatial Redundancy in\nConvolutional Neural Networks with Octave Convolution](https://arxiv.org/pdf/1904.05049.pdf).\n\n## Install\n\n```bash\npip install keras-octave-conv\n```\n\n## Usage\n\nThe `OctaveConv2D` layer could be used just like the `Conv2D` layer, except the `padding` argument is forced to be `'same'`.\n\n### First Octave\n\nUse a single input for the first octave layer:\n\n```python\nfrom keras.layers import Input\nfrom keras_octave_conv import OctaveConv2D\n\ninputs = Input(shape=(32, 32, 3))\nhigh, low = OctaveConv2D(filters=16, kernel_size=3, octave=2, ratio_out=0.125)(inputs)\n```\n\nThe two outputs represent the results in higher and lower spatial resolutions.\n\nSpecial arguments:\n* `octave`: default is `2`. The division of the spatial dimensions.\n* `ratio_out`: default is `0.5`. The ratio of filters for lower spatial resolution.\n\n### Intermediate Octave\n\nThe intermediate octave layers takes two inputs and produce two outputs:\n\n ```python\nfrom keras.layers import Input, MaxPool2D\nfrom keras_octave_conv import OctaveConv2D\n\ninputs = Input(shape=(32, 32, 3))\nhigh, low = OctaveConv2D(filters=16, kernel_size=3)(inputs)\n\nhigh, low = MaxPool2D()(high), MaxPool2D()(low)\nhigh, low = OctaveConv2D(filters=8, kernel_size=3)([high, low])\n```\n\nNote that the same `octave` value should be used throughout the whole model.\n\n### Last Octave\n\nSet `ratio_out` to `0.0` to get a single output for further processing:\n\n```python\nfrom keras.layers import Input, MaxPool2D, Flatten, Dense\nfrom keras.models import Model\nfrom keras_octave_conv import OctaveConv2D\n\ninputs = Input(shape=(32, 32, 3))\nhigh, low = OctaveConv2D(filters=16, kernel_size=3)(inputs)\n\nhigh, low = MaxPool2D()(high), MaxPool2D()(low)\nhigh, low = OctaveConv2D(filters=8, kernel_size=3)([high, low])\n\nhigh, low = MaxPool2D()(high), MaxPool2D()(low)\nconv = OctaveConv2D(filters=4, kernel_size=3, ratio_out=0.0)([high, low])\n\nflatten = Flatten()(conv)\noutputs = Dense(units=10, activation='softmax')(flatten)\n\nmodel = Model(inputs=inputs, outputs=outputs)\nmodel.summary()\n```\n\n### Utility\n\n`octave_dual` helps to create dual layers for processing the outputs of octave convolutions:\n\n```python\nfrom keras.layers import Input, MaxPool2D, Flatten, Dense\nfrom keras.models import Model\nfrom keras_octave_conv import OctaveConv2D, octave_dual\n\ninputs = Input(shape=(32, 32, 3))\nconv = OctaveConv2D(filters=16, kernel_size=3)(inputs)\n\npool = octave_dual(conv, MaxPool2D())\nconv = OctaveConv2D(filters=8, kernel_size=3)(pool)\n\npool = octave_dual(conv, MaxPool2D())\nconv = OctaveConv2D(filters=4, kernel_size=3, ratio_out=0.0)(pool)\n\nflatten = Flatten()(conv)\noutputs = Dense(units=10, activation='softmax')(flatten)\n\nmodel = Model(inputs=inputs, outputs=outputs)\nmodel.summary()\n```\n\n`octave_conv_2d` creates the octave structure with built-in Keras layers:\n\n```python\nfrom keras.layers import Input, MaxPool2D, Flatten, Dense\nfrom keras.models import Model\nfrom keras.utils import plot_model\nfrom keras_octave_conv import octave_conv_2d, octave_dual\n\ninputs = Input(shape=(32, 32, 3), name='Input')\nconv = octave_conv_2d(inputs, filters=16, kernel_size=3, name='Octave-First')\n\npool = octave_dual(conv, MaxPool2D(name='Pool-1'))\nconv = octave_conv_2d(pool, filters=8, kernel_size=3, name='Octave-Mid')\n\npool = octave_dual(conv, MaxPool2D(name='Pool-2'))\nconv = octave_conv_2d(pool, filters=4, kernel_size=3, ratio_out=0.0, name='Octave-Last')\n\nflatten = Flatten(name='Flatten')(conv)\noutputs = Dense(units=10, activation='softmax', name='Output')(flatten)\n\nmodel = Model(inputs=inputs, outputs=outputs)\nmodel.summary()\nplot_model(model, to_file='octave_model.png')\n```\n\n![](./octave_model.png)", "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/CyberZHG/keras-octave-conv", "keywords": "", "license": "MIT AND \"Anti 996\"", "maintainer": "", "maintainer_email": "", "name": "keras-octave-conv", "package_url": "https://pypi.org/project/keras-octave-conv/", "platform": "", "project_url": "https://pypi.org/project/keras-octave-conv/", "project_urls": { "Homepage": "https://github.com/CyberZHG/keras-octave-conv" }, "release_url": "https://pypi.org/project/keras-octave-conv/0.8.0/", "requires_dist": null, "requires_python": "", "summary": "Octave convolution", "version": "0.8.0" }, "last_serial": 5163373, "releases": { "0.4.0": [ { "comment_text": "", "digests": { "md5": "8b9684d9dc9ed7972d61474873d053da", "sha256": "00545a804773d08ea1f6bac1f60e33fefbcc04fd3b0201af9f57f66b3e0bc4bf" }, "downloads": -1, "filename": "keras-octave-conv-0.4.0.tar.gz", "has_sig": false, "md5_digest": "8b9684d9dc9ed7972d61474873d053da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5591, "upload_time": "2019-04-18T11:09:20", "url": "https://files.pythonhosted.org/packages/a3/a6/da1297c8b1c6ac8e585a676a1b5bed75eee68a4ae85a12c5748908b68eb0/keras-octave-conv-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "39496f8f34de2a2a46035103faaec8dc", "sha256": "bffbcc59cbe9350f4b60f0be5d10326fe27e839a1827ee2daee0e5e5e296d2a9" }, "downloads": -1, "filename": "keras-octave-conv-0.5.0.tar.gz", "has_sig": false, "md5_digest": "39496f8f34de2a2a46035103faaec8dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6581, "upload_time": "2019-04-18T12:29:20", "url": "https://files.pythonhosted.org/packages/e1/6e/01fcb949899fb3fd48ee213747960f97e6eebcde173e0965791a0929a02f/keras-octave-conv-0.5.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "4e908589cab7cd5296487874cb4a097c", "sha256": "7897999c2bccc7144931d925d4f77e212945375c37ff8d0b5d65a2d235920de5" }, "downloads": -1, "filename": "keras-octave-conv-0.7.0.tar.gz", "has_sig": false, "md5_digest": "4e908589cab7cd5296487874cb4a097c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8573, "upload_time": "2019-04-19T03:47:31", "url": "https://files.pythonhosted.org/packages/67/b3/3c4e05eec0ca32c45fa38457b2b6f9a4beabdc7c477609d190c7dfc09ca5/keras-octave-conv-0.7.0.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "b29f448b0601ad1e11afe0fb01aaa90a", "sha256": "156237470f4df372f90216cd704326be87bdd09b5d5d5630ad81527c71a76011" }, "downloads": -1, "filename": "keras-octave-conv-0.8.0.tar.gz", "has_sig": false, "md5_digest": "b29f448b0601ad1e11afe0fb01aaa90a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 109670, "upload_time": "2019-04-19T05:13:09", "url": "https://files.pythonhosted.org/packages/bd/73/58b69e0303e5f3b07bc6932afbf170f91e1198e6822c7738e54376d4d8dc/keras-octave-conv-0.8.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b29f448b0601ad1e11afe0fb01aaa90a", "sha256": "156237470f4df372f90216cd704326be87bdd09b5d5d5630ad81527c71a76011" }, "downloads": -1, "filename": "keras-octave-conv-0.8.0.tar.gz", "has_sig": false, "md5_digest": "b29f448b0601ad1e11afe0fb01aaa90a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 109670, "upload_time": "2019-04-19T05:13:09", "url": "https://files.pythonhosted.org/packages/bd/73/58b69e0303e5f3b07bc6932afbf170f91e1198e6822c7738e54376d4d8dc/keras-octave-conv-0.8.0.tar.gz" } ] }