From a20960aa4ab6a090608e8cf41d50bdb25485e13e Mon Sep 17 00:00:00 2001 From: mhjensen Date: Thu, 3 Oct 2019 13:33:48 +0200 Subject: [PATCH] updated can notes --- doc/pub/NeuralNet/html/._NeuralNet-bs000.html | 108 +- doc/pub/NeuralNet/html/._NeuralNet-bs001.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs002.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs003.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs004.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs005.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs006.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs007.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs008.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs009.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs010.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs011.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs012.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs013.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs014.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs015.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs016.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs017.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs018.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs019.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs020.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs021.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs022.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs023.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs024.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs025.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs026.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs027.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs028.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs029.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs030.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs031.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs032.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs033.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs034.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs035.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs036.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs037.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs038.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs039.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs040.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs041.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs042.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs043.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs044.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs045.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs046.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs047.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs048.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs049.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs050.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs051.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs052.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs053.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs054.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs055.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs056.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs057.html | 106 +- doc/pub/NeuralNet/html/._NeuralNet-bs058.html | 107 +- doc/pub/NeuralNet/html/._NeuralNet-bs059.html | 108 +- doc/pub/NeuralNet/html/._NeuralNet-bs060.html | 109 +- doc/pub/NeuralNet/html/._NeuralNet-bs061.html | 110 +- doc/pub/NeuralNet/html/._NeuralNet-bs062.html | 111 +- doc/pub/NeuralNet/html/._NeuralNet-bs063.html | 112 +- doc/pub/NeuralNet/html/._NeuralNet-bs064.html | 113 +- doc/pub/NeuralNet/html/._NeuralNet-bs065.html | 114 +- doc/pub/NeuralNet/html/._NeuralNet-bs066.html | 117 +- doc/pub/NeuralNet/html/NeuralNet-bs.html | 108 +- doc/pub/NeuralNet/html/NeuralNet-reveal.html | 1365 +---- .../NeuralNet/html/NeuralNet-solarized.html | 1377 +---- doc/pub/NeuralNet/html/NeuralNet.html | 1377 +---- doc/pub/NeuralNet/ipynb/NeuralNet.ipynb | 1514 +----- .../ipynb/ipynb-NeuralNet-src.tar.gz | Bin 88051 -> 211 bytes doc/pub/NeuralNet/pdf/NeuralNet-minted.pdf | Bin 539835 -> 371994 bytes doc/src/CNN/_minted-cnn/default.pygstyle | 0 doc/src/CNN/clean.sh | 3 + doc/src/CNN/cnn-bs.html | 219 + doc/src/CNN/cnn-minted.pdf | Bin 0 -> 336428 bytes doc/src/CNN/cnn-plain-minted.tex | 781 +++ doc/src/CNN/cnn-reveal.html | 984 ++++ doc/src/CNN/cnn-solarized.html | 794 +++ doc/src/CNN/cnn.do.txt | 600 +++ doc/src/CNN/cnn.html | 799 +++ doc/src/CNN/cnn.ipynb | 729 +++ doc/src/CNN/cnn.p.tex | 811 +++ doc/src/CNN/cnn.tex | 781 +++ doc/src/CNN/figslides/cnn.jpeg | Bin 0 -> 24437 bytes doc/src/CNN/figslides/nn.jpeg | Bin 0 -> 68873 bytes doc/src/CNN/ipynb-cnn-src.tar.gz | Bin 0 -> 88050 bytes doc/src/CNN/make.sh | 95 + doc/src/CNN/reveal.js/.gitignore | 8 + doc/src/CNN/reveal.js/.travis.yml | 5 + doc/src/CNN/reveal.js/CONTRIBUTING.md | 23 + doc/src/CNN/reveal.js/Gruntfile.js | 140 + doc/src/CNN/reveal.js/LICENSE | 19 + doc/src/CNN/reveal.js/README.md | 1052 ++++ doc/src/CNN/reveal.js/bower.json | 27 + .../CNN/reveal.js/css/images/cbc_footer.png | Bin 0 -> 10008 bytes .../CNN/reveal.js/css/images/cbc_symbol.png | Bin 0 -> 2946 bytes .../reveal.js/css/images/simula_footer.png | Bin 0 -> 2513 bytes .../CNN/reveal.js/css/images/simula_logo.png | Bin 0 -> 2138 bytes .../reveal.js/css/images/simula_symbol.png | Bin 0 -> 2138 bytes .../CNN/reveal.js/css/images/uio_footer.png | Bin 0 -> 18189 bytes .../CNN/reveal.js/css/images/uio_symbol.png | Bin 0 -> 11352 bytes doc/src/CNN/reveal.js/css/print/paper.css | 202 + doc/src/CNN/reveal.js/css/print/pdf.css | 157 + doc/src/CNN/reveal.js/css/reveal.css | 1886 +++++++ doc/src/CNN/reveal.js/css/reveal.scss | 1319 +++++ doc/src/CNN/reveal.js/css/theme/README.md | 23 + doc/src/CNN/reveal.js/css/theme/beige.css | 154 + .../CNN/reveal.js/css/theme/beigesmall.css | 155 + doc/src/CNN/reveal.js/css/theme/black.css | 273 + doc/src/CNN/reveal.js/css/theme/blood.css | 180 + doc/src/CNN/reveal.js/css/theme/cbc.css | 144 + doc/src/CNN/reveal.js/css/theme/darkgray.css | 153 + doc/src/CNN/reveal.js/css/theme/default.css | 153 + doc/src/CNN/reveal.js/css/theme/league.css | 279 + doc/src/CNN/reveal.js/css/theme/moon.css | 153 + doc/src/CNN/reveal.js/css/theme/night.css | 141 + doc/src/CNN/reveal.js/css/theme/serif.css | 143 + doc/src/CNN/reveal.js/css/theme/simple.css | 144 + doc/src/CNN/reveal.js/css/theme/simula.css | 144 + doc/src/CNN/reveal.js/css/theme/sky.css | 150 + doc/src/CNN/reveal.js/css/theme/solarized.css | 153 + .../CNN/reveal.js/css/theme/source/beige.scss | 50 + .../css/theme/source/beigesmall.scss | 51 + .../CNN/reveal.js/css/theme/source/black.scss | 49 + .../CNN/reveal.js/css/theme/source/blood.scss | 91 + .../CNN/reveal.js/css/theme/source/cbc.scss | 39 + .../reveal.js/css/theme/source/darkgray.scss | 42 + .../reveal.js/css/theme/source/default.scss | 42 + .../reveal.js/css/theme/source/league.scss | 34 + .../CNN/reveal.js/css/theme/source/moon.scss | 68 + .../CNN/reveal.js/css/theme/source/night.scss | 35 + .../CNN/reveal.js/css/theme/source/serif.scss | 35 + .../reveal.js/css/theme/source/simple.scss | 38 + .../reveal.js/css/theme/source/simula.scss | 39 + .../CNN/reveal.js/css/theme/source/sky.scss | 46 + .../reveal.js/css/theme/source/solarized.scss | 74 + .../CNN/reveal.js/css/theme/source/white.scss | 49 + doc/src/CNN/reveal.js/css/theme/white.css | 273 + doc/src/CNN/reveal.js/index.html | 411 ++ doc/src/CNN/reveal.js/js/reveal.js | 4508 +++++++++++++++++ doc/src/CNN/reveal.js/lib/css/zenburn.css | 117 + .../reveal.js/lib/font/league-gothic/LICENSE | 2 + .../lib/font/league-gothic/league-gothic.css | 10 + .../lib/font/league-gothic/league-gothic.eot | Bin 0 -> 25696 bytes .../lib/font/league-gothic/league-gothic.ttf | Bin 0 -> 64256 bytes .../lib/font/league-gothic/league-gothic.woff | Bin 0 -> 30764 bytes .../lib/font/source-sans-pro/LICENSE | 45 + .../source-sans-pro-italic.eot | Bin 0 -> 75720 bytes .../source-sans-pro-italic.ttf | Bin 0 -> 238084 bytes .../source-sans-pro-italic.woff | Bin 0 -> 98556 bytes .../source-sans-pro-regular.eot | Bin 0 -> 88070 bytes .../source-sans-pro-regular.ttf | Bin 0 -> 288008 bytes .../source-sans-pro-regular.woff | Bin 0 -> 114324 bytes .../source-sans-pro-semibold.eot | Bin 0 -> 89897 bytes .../source-sans-pro-semibold.ttf | Bin 0 -> 284640 bytes .../source-sans-pro-semibold.woff | Bin 0 -> 115648 bytes .../source-sans-pro-semibolditalic.eot | Bin 0 -> 75706 bytes .../source-sans-pro-semibolditalic.ttf | Bin 0 -> 240944 bytes .../source-sans-pro-semibolditalic.woff | Bin 0 -> 98816 bytes .../font/source-sans-pro/source-sans-pro.css | 39 + doc/src/CNN/reveal.js/lib/js/classList.js | 2 + doc/src/CNN/reveal.js/lib/js/head.min.js | 8 + doc/src/CNN/reveal.js/lib/js/html5shiv.js | 7 + doc/src/CNN/reveal.js/package.json | 45 + .../reveal.js/plugin/highlight/highlight.js | 30 + doc/src/CNN/reveal.js/plugin/leap/leap.js | 159 + .../reveal.js/plugin/markdown/example.html | 129 + .../CNN/reveal.js/plugin/markdown/example.md | 31 + .../CNN/reveal.js/plugin/markdown/markdown.js | 393 ++ .../CNN/reveal.js/plugin/markdown/marked.js | 6 + doc/src/CNN/reveal.js/plugin/math/math.js | 64 + .../CNN/reveal.js/plugin/multiplex/client.js | 13 + .../CNN/reveal.js/plugin/multiplex/index.js | 56 + .../CNN/reveal.js/plugin/multiplex/master.js | 51 + .../reveal.js/plugin/notes-server/client.js | 60 + .../reveal.js/plugin/notes-server/index.js | 66 + .../reveal.js/plugin/notes-server/notes.html | 396 ++ doc/src/CNN/reveal.js/plugin/notes/notes.html | 406 ++ doc/src/CNN/reveal.js/plugin/notes/notes.js | 122 + .../reveal.js/plugin/print-pdf/print-pdf.js | 48 + .../CNN/reveal.js/plugin/remotes/remotes.js | 39 + doc/src/CNN/reveal.js/plugin/search/search.js | 196 + doc/src/CNN/reveal.js/plugin/zoom-js/zoom.js | 278 + .../reveal.js/test/examples/assets/image1.png | Bin 0 -> 21991 bytes .../reveal.js/test/examples/assets/image2.png | Bin 0 -> 10237 bytes .../reveal.js/test/examples/barebones.html | 41 + .../test/examples/embedded-media.html | 49 + doc/src/CNN/reveal.js/test/examples/math.html | 185 + .../test/examples/slide-backgrounds.html | 144 + .../test/examples/slide-transitions.html | 101 + doc/src/CNN/reveal.js/test/qunit-1.12.0.css | 244 + doc/src/CNN/reveal.js/test/qunit-1.12.0.js | 2212 ++++++++ .../test-markdown-element-attributes.html | 134 + .../test/test-markdown-element-attributes.js | 46 + .../test/test-markdown-slide-attributes.html | 128 + .../test/test-markdown-slide-attributes.js | 47 + doc/src/CNN/reveal.js/test/test-markdown.html | 52 + doc/src/CNN/reveal.js/test/test-markdown.js | 15 + doc/src/CNN/reveal.js/test/test-pdf.html | 83 + doc/src/CNN/reveal.js/test/test-pdf.js | 15 + doc/src/CNN/reveal.js/test/test.html | 85 + doc/src/CNN/reveal.js/test/test.js | 589 +++ doc/src/NeuralNet/NeuralNet.do.txt | 1187 +---- doc/web/course.dlog | 4 + doc/web/course.do.txt | 3 +- doc/web/course.do.txt~ | 4 +- doc/web/course.html | 126 +- doc/web/tmp_mako__course.do.txt | 14 + doc/web/tmp_preprocess__course.do.txt | 3 +- 212 files changed, 27388 insertions(+), 13783 deletions(-) create mode 100644 doc/src/CNN/_minted-cnn/default.pygstyle create mode 100755 doc/src/CNN/clean.sh create mode 100644 doc/src/CNN/cnn-bs.html create mode 100644 doc/src/CNN/cnn-minted.pdf create mode 100644 doc/src/CNN/cnn-plain-minted.tex create mode 100644 doc/src/CNN/cnn-reveal.html create mode 100644 doc/src/CNN/cnn-solarized.html create mode 100644 doc/src/CNN/cnn.do.txt create mode 100644 doc/src/CNN/cnn.html create mode 100644 doc/src/CNN/cnn.ipynb create mode 100644 doc/src/CNN/cnn.p.tex create mode 100644 doc/src/CNN/cnn.tex create mode 100644 doc/src/CNN/figslides/cnn.jpeg create mode 100644 doc/src/CNN/figslides/nn.jpeg create mode 100644 doc/src/CNN/ipynb-cnn-src.tar.gz create mode 100755 doc/src/CNN/make.sh create mode 100644 doc/src/CNN/reveal.js/.gitignore create mode 100644 doc/src/CNN/reveal.js/.travis.yml create mode 100644 doc/src/CNN/reveal.js/CONTRIBUTING.md create mode 100644 doc/src/CNN/reveal.js/Gruntfile.js create mode 100644 doc/src/CNN/reveal.js/LICENSE create mode 100644 doc/src/CNN/reveal.js/README.md create mode 100644 doc/src/CNN/reveal.js/bower.json create mode 100644 doc/src/CNN/reveal.js/css/images/cbc_footer.png create mode 100644 doc/src/CNN/reveal.js/css/images/cbc_symbol.png create mode 100644 doc/src/CNN/reveal.js/css/images/simula_footer.png create mode 100644 doc/src/CNN/reveal.js/css/images/simula_logo.png create mode 100644 doc/src/CNN/reveal.js/css/images/simula_symbol.png create mode 100644 doc/src/CNN/reveal.js/css/images/uio_footer.png create mode 100644 doc/src/CNN/reveal.js/css/images/uio_symbol.png create mode 100644 doc/src/CNN/reveal.js/css/print/paper.css create mode 100644 doc/src/CNN/reveal.js/css/print/pdf.css create mode 100644 doc/src/CNN/reveal.js/css/reveal.css create mode 100644 doc/src/CNN/reveal.js/css/reveal.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/README.md create mode 100644 doc/src/CNN/reveal.js/css/theme/beige.css create mode 100644 doc/src/CNN/reveal.js/css/theme/beigesmall.css create mode 100644 doc/src/CNN/reveal.js/css/theme/black.css create mode 100644 doc/src/CNN/reveal.js/css/theme/blood.css create mode 100644 doc/src/CNN/reveal.js/css/theme/cbc.css create mode 100644 doc/src/CNN/reveal.js/css/theme/darkgray.css create mode 100644 doc/src/CNN/reveal.js/css/theme/default.css create mode 100644 doc/src/CNN/reveal.js/css/theme/league.css create mode 100644 doc/src/CNN/reveal.js/css/theme/moon.css create mode 100644 doc/src/CNN/reveal.js/css/theme/night.css create mode 100644 doc/src/CNN/reveal.js/css/theme/serif.css create mode 100644 doc/src/CNN/reveal.js/css/theme/simple.css create mode 100644 doc/src/CNN/reveal.js/css/theme/simula.css create mode 100644 doc/src/CNN/reveal.js/css/theme/sky.css create mode 100644 doc/src/CNN/reveal.js/css/theme/solarized.css create mode 100644 doc/src/CNN/reveal.js/css/theme/source/beige.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/beigesmall.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/black.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/blood.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/cbc.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/darkgray.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/default.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/league.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/moon.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/night.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/serif.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/simple.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/simula.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/sky.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/solarized.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/source/white.scss create mode 100644 doc/src/CNN/reveal.js/css/theme/white.css create mode 100644 doc/src/CNN/reveal.js/index.html create mode 100644 doc/src/CNN/reveal.js/js/reveal.js create mode 100644 doc/src/CNN/reveal.js/lib/css/zenburn.css create mode 100644 doc/src/CNN/reveal.js/lib/font/league-gothic/LICENSE create mode 100644 doc/src/CNN/reveal.js/lib/font/league-gothic/league-gothic.css create mode 100644 doc/src/CNN/reveal.js/lib/font/league-gothic/league-gothic.eot create mode 100644 doc/src/CNN/reveal.js/lib/font/league-gothic/league-gothic.ttf create mode 100644 doc/src/CNN/reveal.js/lib/font/league-gothic/league-gothic.woff create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/LICENSE create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.eot create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.ttf create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.woff create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.eot create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.ttf create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.woff create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.eot create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.ttf create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.woff create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff create mode 100644 doc/src/CNN/reveal.js/lib/font/source-sans-pro/source-sans-pro.css create mode 100644 doc/src/CNN/reveal.js/lib/js/classList.js create mode 100644 doc/src/CNN/reveal.js/lib/js/head.min.js create mode 100644 doc/src/CNN/reveal.js/lib/js/html5shiv.js create mode 100644 doc/src/CNN/reveal.js/package.json create mode 100644 doc/src/CNN/reveal.js/plugin/highlight/highlight.js create mode 100644 doc/src/CNN/reveal.js/plugin/leap/leap.js create mode 100644 doc/src/CNN/reveal.js/plugin/markdown/example.html create mode 100644 doc/src/CNN/reveal.js/plugin/markdown/example.md create mode 100644 doc/src/CNN/reveal.js/plugin/markdown/markdown.js create mode 100644 doc/src/CNN/reveal.js/plugin/markdown/marked.js create mode 100644 doc/src/CNN/reveal.js/plugin/math/math.js create mode 100644 doc/src/CNN/reveal.js/plugin/multiplex/client.js create mode 100644 doc/src/CNN/reveal.js/plugin/multiplex/index.js create mode 100644 doc/src/CNN/reveal.js/plugin/multiplex/master.js create mode 100644 doc/src/CNN/reveal.js/plugin/notes-server/client.js create mode 100644 doc/src/CNN/reveal.js/plugin/notes-server/index.js create mode 100644 doc/src/CNN/reveal.js/plugin/notes-server/notes.html create mode 100644 doc/src/CNN/reveal.js/plugin/notes/notes.html create mode 100644 doc/src/CNN/reveal.js/plugin/notes/notes.js create mode 100644 doc/src/CNN/reveal.js/plugin/print-pdf/print-pdf.js create mode 100644 doc/src/CNN/reveal.js/plugin/remotes/remotes.js create mode 100644 doc/src/CNN/reveal.js/plugin/search/search.js create mode 100644 doc/src/CNN/reveal.js/plugin/zoom-js/zoom.js create mode 100644 doc/src/CNN/reveal.js/test/examples/assets/image1.png create mode 100644 doc/src/CNN/reveal.js/test/examples/assets/image2.png create mode 100644 doc/src/CNN/reveal.js/test/examples/barebones.html create mode 100644 doc/src/CNN/reveal.js/test/examples/embedded-media.html create mode 100644 doc/src/CNN/reveal.js/test/examples/math.html create mode 100644 doc/src/CNN/reveal.js/test/examples/slide-backgrounds.html create mode 100644 doc/src/CNN/reveal.js/test/examples/slide-transitions.html create mode 100644 doc/src/CNN/reveal.js/test/qunit-1.12.0.css create mode 100644 doc/src/CNN/reveal.js/test/qunit-1.12.0.js create mode 100644 doc/src/CNN/reveal.js/test/test-markdown-element-attributes.html create mode 100644 doc/src/CNN/reveal.js/test/test-markdown-element-attributes.js create mode 100644 doc/src/CNN/reveal.js/test/test-markdown-slide-attributes.html create mode 100644 doc/src/CNN/reveal.js/test/test-markdown-slide-attributes.js create mode 100644 doc/src/CNN/reveal.js/test/test-markdown.html create mode 100644 doc/src/CNN/reveal.js/test/test-markdown.js create mode 100644 doc/src/CNN/reveal.js/test/test-pdf.html create mode 100644 doc/src/CNN/reveal.js/test/test-pdf.js create mode 100644 doc/src/CNN/reveal.js/test/test.html create mode 100644 doc/src/CNN/reveal.js/test/test.js diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs000.html b/doc/pub/NeuralNet/html/._NeuralNet-bs000.html index 9ed465153..2e947261f 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs000.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs000.html @@ -7,9 +7,9 @@ Automatically generated HTML file from DocOnce source - + -Data Analysis and Machine Learning: Neural networks, from the simple perceptron to deep learning and convolutional networks +Data Analysis and Machine Learning: Neural networks, from the simple perceptron to deep learning @@ -141,65 +141,7 @@ Automatically generated HTML file from DocOnce source ('Limitations of supervised learning with deep networks', 2, None, - '___sec65'), - ('Convolutional Neural Networks (recognizing images)', - 2, - None, - '___sec66'), - ('Regular NNs don’t scale well to full images', - 2, - None, - '___sec67'), - ('3D volumes of neurons', 2, None, '___sec68'), - ('Layers used to build CNNs', 2, None, '___sec69'), - ('Transforming images', 2, None, '___sec70'), - ('CNNs in brief', 2, None, '___sec71'), - ('CNNs in more detail, building convolutional neural networks in ' - 'Tensorflow and Keras', - 2, - None, - '___sec72'), - ('Setting it up', 2, None, '___sec73'), - ('The MNIST dataset again', 2, None, '___sec74'), - ('Strong correlations', 2, None, '___sec75'), - ('Layers of a CNN', 2, None, '___sec76'), - ('Systematic reduction', 2, None, '___sec77'), - ('Prerequisites: Collect and pre-process data', - 2, - None, - '___sec78'), - ('Importing Keras and Tensorflow', 2, None, '___sec79'), - ('Using TensorFlow backend', 2, None, '___sec80'), - ('Train the model', 2, None, '___sec81'), - ('Visualizing the results', 2, None, '___sec82'), - ('Running with Keras', 2, None, '___sec83'), - ('Final part', 2, None, '___sec84'), - ('Final visualization', 2, None, '___sec85'), - ('Fun links', 2, None, '___sec86'), - ('Applications: solving ordinary differential equations with ' - 'Neural Networks', - 2, - None, - '___sec87'), - ('Trial solution', 2, None, '___sec88'), - ('More details', 2, None, '___sec89'), - ('Reformulating the problem', 2, None, '___sec90'), - ('Estimating errors', 2, None, '___sec91'), - ('Creating a simple Deep Neural Net', 2, None, '___sec92'), - ('Setting up the code, feed forward part', 2, None, '___sec93'), - ('Backpropagation', 2, None, '___sec94'), - ('Gradient Descent', 2, None, '___sec95'), - ('More on GD and cost function', 2, None, '___sec96'), - ('An implementation of a Deep Neural Network', - 2, - None, - '___sec97'), - ('The final parts of the code', 2, None, '___sec98'), - ('And adding Back propagation', 2, None, '___sec99'), - ('Solving the ODE', 2, None, '___sec100'), - ('Using neural network', 2, None, '___sec101'), - ('Using a deep neural network', 2, None, '___sec102'), - ('Wrapping it up', 2, None, '___sec103')]} + '___sec65')]} end of tocinfo --> @@ -229,7 +171,7 @@ MathJax.Hub.Config({ - Data Analysis and Machine Learning: Neural networks, from the simple perceptron to deep learning and convolutional networks + Data Analysis and Machine Learning: Neural networks, from the simple perceptron to deep learning + +
+ +

 

 

 

+ + + + + + +
+

Convolutional Neural Networks

+ +

+ + +

+Morten Hjorth-Jensen [1, 2] +
+ +

+ + +

[1] Department of Physics, University of Oslo
+
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University
+
+

+

Oct 3, 2019

+
+

+ + +

Read »

+ + +
+ +

+ +

+ + +
+ + + + + + + +
+ © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
+ + + + + + diff --git a/doc/src/CNN/cnn-minted.pdf b/doc/src/CNN/cnn-minted.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f2e9ec1f896a3e1a38cb25baf778bbfcb4ccfe73 GIT binary patch literal 336428 zcmd422UJv1vnG1T86@W*S&*EOAX!AB5+t<>NRo`ih9>7AqM#@_OK8cGGmRigq6Ep3 zp<7Z59j5*7y!rn-_uW}DcfB?1ZF;kI_c^C}*EzL!ef3qffQh!Qn3T92xxnPi-~zcK zk0g)RGdFS-6>^COPM*&GEA&ShA(pn+J|J-!uxgwni5+#9HWk z)<}*BC{%5Qh0Hclh)o+))O@e~kzVLt^}KE-))0#BQcu&HobR=js5!kPq7yX&>Q(#-PqTZX;CM-=I7vNc!dcm;-yk|^@R+G=**t$jy_L}7Tq?D z(Y+^{S;{0XN_GGWw>;lu5-%9>k4a|D4G26#UlK>sXjQ~#6aHzU%D?gJ`eurcPuJ#7 z;hwnkJA<2cdAD<43FfbE8Ly`U=Iwov_dzrct4%8bg&cJiWpcUpmLz<5@OHFkU5dh| z_JAfRY_isMd%w_AStYI+{b&Whh~S`ds1{CBU5M$k;ccp3TxukofBa&kiTZSB^M-y&y>A({ZhNc0H_P8g*-@_0=}t zM8-r&nlj=eDf-oq>dTicp8eeXQb3$X(*?opy1lVl9-Xo^x5xO^y<$nr0z-YwUw%j{ zd;&bzxV;-*?G3!D(~EOa;r)*06(L~N6qfdX8OE8YcXu|FgGKp!^bl_l>C)sQRk2h~ zy!LR$MK{f-&%9%`^ZZ_vc#qJHX3z#YYELp{a7ws+6fU`+BBJ5Zc<_9a`<_RJ7RQUK zw?b4!QoQ`uieQ^3rS2p-DIby;yDF_L#JBm_K<6GWm*BF$xB5e(gZNH_Xd-$&Du`(g z#Z&9{S{NUn40QPK1jgO4z27AxMF{I@Er4(*Bu4URwVcb6A9<<|Rp8N|Nj~beoA+XE zD4O`h&RTlHOBcf9pzS%u7T`!WMlg2LMjS;+o;QKt{p_bP)wkgR#~V>E^gph~`w$@I z(;Gc9n(f+OXi`Ld;F$i(5cBM*7Rf>w&MUTsr{Ivl5&l6 znyd1Jr0fiiE9tP-4T%PuRj6m z^rnB6X+FUE{)O0(9uHt&7J+jmf-WB$s=~ zLmubvqwxF6>`cuN3vMjj?KKv>6aGcX4;%$VdFU3S8O3j!Hg<8LlO|$&7POnWizLnn zpLs5%@u_@0AF>MR+EeMrJ6F2g{a1a@1@8wk$;mm2?OCC^P2ri3*@&-RD?au1uUf=L zpRT%cDty(#6Dyt=kNp^#*cRhr>yWn;L+jsu@-TsVmT8Ymb=WS zzwZ{Po}}kd_}$QrUzf6z%2>Q~V6>)_mw}nza+BV`zyA)*VKVioy=Y?{&>0eoe!tB$jQ+1I3hUe5SUA`LP3R+*>TNbr;qJ-Q z)Ny0JDa!uGxB@uh1%`u@YN=omjoo`^=GcsMQ)X(eY`9h_26CA-owr$UeZYg5rd;y8 zU_ujWuIAj$G|Q>Ye=TbD`+b<1lL=mhnEh5^;Sy-E#~Or`;jNS28@GpP;bZJpGCBvBtim9DDdCl($3h_l4+`HmliE0-nK?NT%X)1;4 zl2RDuVmQ?WXCD`e+f?0Aq?1jU^ct_A;j?|jd1^mTdkyJPlvS~B*1WvskzioN*PdLcIqb=P~ z>8{1htB{`yX65_Tby-%h0XEo^Tz70^of{$@|*bd+gwQef*^(zbCtgk&Q94 z7ReNzNhONfJ9lkIrb#1F-&8eKztaPnQs0Lj7Ic52rZG1D5G5|)GV$%P`77^ydF6_g z82Ny%?cidW8#4tmC^pT>SC6g!SZnGgbqwz;on@!~xa;@i=>3ot`=!gMl((&0LrJVV ztNeq{U6s#v%N9u8R6BmXYnbOy==`P9^(qEzwck&HpnomG^W+QJ4%yVeRK9;&p0}hm zgSajQ^4?&%NMJo4e+iG|$4;MoE;6}d5y6-j&phm<+TTH0cKEx#uz~Iw}aY8uO4`MP9@(3B6qNt6j);>Jiha#o4o%#O>k1}nv*B2L=k5nFq?`W*ojzmL7>ThQw>C!a_9Q}}kq(cp$6iGY= z@}$r&ziyn~cyefSc<8t|eYT&}1!Yz?fYs5oAacWlSDGvrtj=fFZYI&P-s+8Li0qwE zo)et8=O_5q%gY``v!1o(PwwRD_}`%=ZuA$HN-OCs7pSbDg6Y5Bp5y<_v+`QprRevv%qmzdaSiQ#%8v4A zI(du^FT@_9$3CQMlIT2gl%_bQd7{NO$V>H|KQZP()U^mw6}7-M;n2AxTB?bd_RQbW zLCP4yu7ZxgC1mnHx*k7tEE1twDqwM=Lh{$=+*!F?9 zyo{1;V`*7A2EQ+T+{$2*zUTkoB3!pqnVS2X%MzX60TW9r=|tFkcwnLq{+BwYR}pK; z6B_SU*FVZomx!~LBi>mt{~;cI2VLAb&{i2K2#yX643zbv+=(ToZ}vn^mMhIzXx1Vb zmPJ!~6>~6F4l^1C6uKAMBG%AFdSdFW!X7#z!Irlkp892#OAgWPHqRfOM|<$nq1eh1 zD^J|53p+GYx3&cIsw`8DfE&M~QUY?M?vn?+bk1>j%Pp*OcPSE9cA89v`? z`O4zox6L$t_D%9ei7I+y#PReKZ%G8#C~XUTRC=3B8Q&EunDj73(EH%b#nqKl9zXuR zL2&8x*C58p7dKoA+6W9n`?EeocTHUjoXMyA(^bj}b$6MXQ2U4B{h%9oreV}9&uF;p znXobbhA3LY0^0j?P>1fKCt~5WBQUT2Lyt{Q_a_Bz^yx z8jE~EM2tz|!6R?!k2O`dOIpf#>%tTR88gu|-gcc0#2K^Q7UAn$DR34>wd6gWB z9Q7Deq+dEY3ld*e#w5M>49iq*u~a;W!zf<1fSHkVPkh9xxp}ycTa2a1kQKgT#!`x6 zE=S7`4>j9LWkr{@eZ6#yrS|flN#s4D=#EDtKYCRl= z7xkVH*)j%&Oq#1SPyg^gT0I^nuP25TLiKxc6(x6p$akSH2kOX7WTFW%chN}X18$GH z+BK4!w^?({_8n{pXmhC7jwJKSEbSt9ymOc+Dh#!Mapf!eUPo<}#+NFUsir+g$HKM; zg_aSMzaw>(h2}o*znk*n6uo@ld(Gq4{j4Lx(u3(#$vg8G*WE6US=KC>&g>t|TQ&HG zRb!Lp^flx8ZD!74(>>O=4O-va{ND8Lo~<=QmJeRfhg~_6wVNLV2KUQ`$S?Hqv||@! zL279_CQ_sP%vuP!wUo!T<6mBdMBg~Fa%-wA!V}#vuv3bCj3i4cci#4DKRur_chq^q z2&N-!A{| zxj8xblS@2&`ONSM}WJAkcfU@Xf{Nk) zxM6z$T2j0i0%ig{UI3pKkAM~rI{IH49~c~h4SyZ^K0Px#H^1;>aeZTR zYx~#E?%qD)_vzXB#U=93)nC2v0D^y03-|xuH2a_QqQ&WjPe@2WNb*-NJp91FiqjGj z-IOAx(=a7@>O;>f9ZAZdnNe8ROU5T-24{TcJ4MdKFS{;)_^aAKH2dFEEb70c+5b@N zpL#6uj~+6N0jsJQ=i{Nohk$ZehOFeeNZ!U8eT53xZ0LHae)<=?%*Oyr;P zT+M`X)#(JQqxjkKQCPqhvf8iruj30a7I;rGSG;hZBszf-sQS5b@M=(Qrhdr0zIH46 zcg`94Mvcx?w&?S-U!Oz^ijqVLO#ah5*-FE?uV5kbI5{-&CS^^#18v^h(SOljZr7}L zq?%!R`B&~sGT+AkrHZcTeDz=2|3AK0U$MYC&kPpWx!S~F*v^b8Cj`dhU2oTZzc=Fh z&DZ#wdtNi!Bi@o9rOG44^}3}Drnb&^O?4Q6|6BbLGZsK>;!MYO>CdBcA}oLkT87Na zW6Vug$PR0MxG=6} zyAxH_8vnBTo|*t=K3pkfCCKI?cp7!**~kNrjhbgt;-Q`?Un$bde!_CL^90{;evnUP z9etEuDGbflOTYpisrc%RZux{Ae9*h8+37lSd~t^F4*A=BjqM}OIebiZu|P|6=K5F& z6~QJ+q>2GN@bSA1g}EAgn_G9Bo|BfOU;(DFuA2LbZPEc>R>+eJ&vh6Lbmq>m0PUVd zTV7_EN9A72J^rZUar3NOkFWq;+iTKG#(=hO_({SARI7woV0h3AbASbQ1v|w%rhCvq+nWvUb=_EyKK7|=0mpNC-;VZ$ukbe<7dc+O5OasSY*D4Lt1coB|;j~ zO4Z)7ep}3sJ~2b-MpwO?{5qucCs*p{XR8sh#a~bwQ-8HjMID)I`A4Sk)y=bT%h;w_ zwzf)Fe?yJ%i7+N*%whgJ>ciMKA@eo!wvHuGWjY>*PWOr0yjQ9 zS{t2qf(9Kw6odvvWIC0UZHh{=toP{;1=C9BcY|JnrI7CHSRfjMH>JY9?#?*fD8{>N zv!toS|I*nHW%TXw`}PL=mH_H!;Pw&9b-nMS}fe0YaPvSuh`SIEMaPGJo|I}fo z4HWc!aNw$p(dwPk@#Q1#K47C$K1mdIC+aiGbmOi~8y;v@PHh{b z=YqKtMBSks-Y2aY5hgf|-&j3d-!xuOzBt`b=q2euaQ96KEvjh2uYOy;uin7iNp@Cx zA-o^#)Fbwb=T3M6@*%>Y9}BQ{kd-1^`V}B<-%mD|37+Uvq<1nTkuB~A@gZ0V>CYI{c$d`p>=FIF?kuBs(@6J1o5Wo{ysAwr#DSsF8- zsIO@w^SV<&;9HAYGtSBURGAL^pBAbt+!&Q&fd!7cF;VW{4|-r&fH8zCi+$}+EY7}s z=5Wgw_ zf5ZqPesxMVOsXh(wU)NO`)o2GEcE1d2es9!;!3``rX%0cem17!YPW|qwYlX>`hk9T z{L_SI+Uu@_1-ru05#j9iU|&R6_q8$d*JS5$m25K?_2*VrHqU%ksrM%SlrUdnmOW9( z=>3o85C?X>0A*Qp@w}r4m;fCifFN!m8CYFZ+gDHEzTpXEQ4z1l(_F}l9{Yrx_2KU_}MUfEz2SDQXI_b~cQlN9i+eQr?2Aq|qAKkhp zN2#I#x)hlq4%Jp?Jufh^3)?nl7Q1o{2OB z%zd+BJ|KRB1#w{)vYK1X@+3IsR&UR34GZ#3sw-BI3TA1wfrGmd+IyWGrW8K9IR-SB zujd*G{@#u|0=$G3w{CyX%nN#wI!olG+gLHOJ5nlV`uM|)WlH#0ZVrCrCEUhfUXJKD zSkLjO%-v#Jp5=tM$JY`WcuNoFfjqLG02#C18q|NO68F*Won-~m0Hd=cacPW+aUZSv z_uJ2o0~UzuG^$n@LQ{nZ7j^J`Cl@Y?_^)=A-^N^S_Yd)VBkoi98JiGq=8OU2sZj?}4{^b)a&_#os`j_d+jhpJJw8zg@U;&Xk zViZHnS7|j~9>OttH+hcCXf(szo1tRxd{l}&=!6?hIA3XLF1R>@keb;vDl)N{#Cf)b z(%tkg-6KN7Uau7>P|N4fT>$Pa7EYG)XgSNb;GI|4-dMYJL7_ z`_(nH&4zJ0&#A0&k}~5`WLAs3Ps!JFE#T?-km|v%>&B)kUEm+c`|XkFw3^*8%eDMJ zEHzkQ1%i8wrSrpT9B@mRYm-aX=mvEj68QT9W-GtAl?C!e)I_8XrfbRn+}~ z_yW&gUGCH8qMd?!;x9bQ>syW6z%i^i$`njdPr4^&M5@)WZpei^joXeMZ4EkxlTFysV?ogVq427Lr$XLs`9`Z%Lw zSX@|ffuKP)3uiINNUa?DMokr&+kr!hL~I?ijqMbwY%XrbazQ+PHixfyhvk0zbj{Ocw3;*hI_P#p%#m=K(Q#05bAwN8>UhH1hA zKV=vF|IH^rWv_KUo9YA!9g$r>`hgOjyA5VsS7n26fgjDna{}Z1*X%OAhhO`46s~MR${Wj_o-puPD{Eomu?q=s+36cqZ z<@AAE+U@k4S$!6ry_|Z-1gA#_FzaoVTUdbb5>XD*Uq>(>No+2yJouXU3@#B@ey#Sw zd0g`jbd~1`XS5Rc0jMTSbZvEEdd)ea`unOL^5MEUX}k7(+l#=4&7Y6^TTwPSyN^N} zV0q6@j`dE|!f>v`%PS(}aFnrSz+L$L2N#8`Y>TS=>N;V9)zVOjSg-%tpDct1Yb~|b^{*k$cX>ysHUnNJe`r+-k?=p38IPm-lCdnM$$@z1z z!HuHZS>KvZg@Og=nxN5L66rfpr#c;3HWps`Hv?B1&-#?pO+p^}Tk1aWV+E}y9?4pM z#c-jE!g(;`UGnwFuxowSxeNWEpB5Pi3L{(BmMzG{Gk~`4*t^8hQ-@nF%#I^jM6{Sh z7pS^5%r|2xTeNXFVgJ^}B3+hcU%04bVea2KyDX$JMweaUG98C6XR7Mc`@k3nl+G>= zQ+fvfo1rl7*vp^`yEu^)A#Po_>aOo^vD?Ti$PnyWs16!mFBH(|6m|LIOso(gk(Qnf zpI^_atAPoTeRBKK)I>6`w5T^b^BvOHgxo=}I1j3+Ho%=?q6Pc=y)#9wq6Ia$FA=do zXnc~2-})-yQt%a~5sOd zVA$>c0M$NPYc3XadKZ^Vw)%@%F)tO%N~z^b>y=T1*7n!QO~xovwhK-^?dcBn=gm2G zv9%vux&tWgSqQ_X9^u{P!e4~qTq+NwU@u3a-%jbuAZX*)3HJlZiP;<9agiLajeFz? zh9_tqglJlRT5@AlDQba(KH~i|lI!a3`3Leii!lOlGka3IsWIIBXiS>jFpZt&cJ}wS!0Vd$rgu zf2c@2-RN`;XGKcOxUZ)w>wFks`^3>X8a?2I1roMy+;QZf6jDpa!LkT@Zn#96UV>~^ zmg3xOfq{~~4@W#OTx%3;(ob@YgB!2=+A@FHfIxFF_Ub}*)d@ND+Y<+*&~-S<1{vnl zJa34=(E8Nb))P}5Y_Mvqb~D{kK=4M6a^&jDbQrY zFQ`V$yQ_kvoOU#@hUoTU(>5+o8f7T%m(?)XX5oP$jOZB+_p-PTH zd#jM?#}AYvI&Uq#Cqx#*9-D)+k~Xlsy)~ukSff-72+0<^IpgRz7@Qv^0AEcQOl?V0 z8Kb*;K9s-Fse~#TSC8_!42({x>-Qy7yqUiE@)R-%!COG7&hN~YepbjMm=_?cdOXmv zFz(B=A#wciwVvnW5b30I1j8dxW7>)lxjDOS%29_>1@58fd>T}?E+1H7;|aH_&+e7_ zdaQqf1;l8+KwXf5xB!fKgR1BAbtn>ILsfT%vylnm@L2Q2MVM;j%05w$M86mJDrTbX z;;q-lo$~o`&Xow+m2kYynv9u4OPD!K@od{KwRjK21{Q>K52cET);u(*pMAX{7aC?U z6*Xd#{`R%wR;^UzYt^c61E{co{Qxth5hm$R3x)v;40=T?Wv;`LNs{~(|A4525~4=B zSJECt{$YXD)j%jQbBii$IlK8c{Bev_{NnCfZ6Ui{Rla#95D~JK+JWA*ErWGVnKvF8 zO<2_@{q8%aIMCPKJr*mW)7_krCVe(OIpEBzOtV8OXsQW70?uVNqC$cJofb5 zNt#;}SmB>m)YjP7Un7T~Fon-yxS}5_3q{E;og}F7@W-}%cW}VpY|SR&D;FV!`8*DQ zG*EXUsQ1P6HcnEGQJUr*gOg`4NvnY{MFJHLCv#)&p!u@>z&t{9o(iq%&X4L2rQ-g` zZR-KTY&wT+6Ou8$d^2O;dq58Gr+iaAx=RqO1z&D!8K`l%56{Z*V#twJAUWbWM!Rq*TiD$@CRjUyaI zTPsAp*C!24Ybci5*zQ_LX{uPf(^u@~=*iic7_2%W^F6jrIw0#M(-OF1e1`K$F z)$!LgTm3@aAMA@a)1w0|a@vEcdKCDy5Nz9}O|}%FQ!`Z(ca6IV&wKw=Szd%7Wy(?b zNc{q&bZ?e(Lvq;m_mr@*ZH%kqdGE8kB(Dnf+|EL-?)%e~6pCSihr_wLzqZm9kY0$_ z^MmugE;(bBa4e84HvYA7DFyoO?sl z`A5xvo+qT~8Y9F*!?n3waPp>YkOnWyky;xa>dp-xL`#vil7^il$9uO9HB?#%eZDyC zs3?xVBw}^1-7%!L6x;|?)sbc`{t_#YIA@is#aB4;StW|b#~8|U{9k1f{$8i@-0K{Q zL6l9GVF7C_aKh#hT)rrl&V~M@rc!>0OY(f$dE6M`#w9o-V5gut-JGqU@Y+#mL`kH8 ziLVQPi-~bMd?3GG5=p;)oz5CGhGWasq=E_!=h~~6Y5A5;?qEh~cRzJ_iuOxl_6xYA z)@%4MxIm3u$ICtV8VgXMc)ru2pLpdc%nFeYuP8eGOi^W<37y|H4|tgRcH+a(+)EL~ zGaSCLfaU$A&wL;(YBWg8&6Wr`bzVmcunB+j7nHf}0=64+LTC0}{J1EkI7oa) z9~rn#lNv%U9rR(ntH~?CQ7c`3#Fb9T!OO()cgPlzv`?HIeY$krlx9`2oWQB-c+v#? zqSbxFgW$p3ZP2&+8L^`FNG#CFk-%xZrQ>3m7v}k^B?cFhKCQYuB?VYUU;!u0y5}bwHB1=LOogUtLejQZ|2KwVzqR6|!mQWrO%trgqkryIJDA`za9b&^BrL z_ZT+=W&uRq$R6!n_R|hoWhUfiy_+>;H+Hz=mVwz**Rs;vaE3`FbOc%U$mdZ{FRy`+ zS!PZIb+m9jG`z2~y$?eKKZ)}Arc50Fw78JPt8S_K#U{Fl*ajik;zF>aaV>$&hY5W{ zW+D_U=ZeBX55D_&c$^K%!?Fk|aS?>e_(+JIK`E?0yxFp|7g~HyG9&w51hO(1 zBF6wk0JwC0Ke`x@h!j>YV6d6M71P{Vh{^75tn;FQFrxG3TrIOhUG|m=38P57*;_~Qj+;7 z-GEpUpP$H61Tlzg!8M;kjdM|lIq}>DoKVnkH?eH-$#LfPI`!lLR}a(K1O(B(ah~2g zLHza8gQ$~7U(}ta{Sl+K<9Y-Hxy4cUj$me@8AvL4)ODY=1$2{}S*ZhYnP6JpnPX&F z{X&|@zMq8^Mu4YBPUdbQ=+{k!;a&hMz&pD#9SL94{Ip%ph|4omd#*lA-9x_bQqUuGbj@C(o5{ezELi9r;C2J(0${6{Kp zAXP5a``=Toeh*g|_O5WK_kfVXpuUq7Un+X*E_EtYAVDy59`2_)6p!gVW1qdfsQ$Qx z_q+QO`BgBdqmI*)k^Y;J!@OPQNa(dH_zrUQMICawuUYxqaJxeX&)`dzv&XNhB9A`e z3I>;OWQe*4igz%a3*~^!SQ9lfz7ou>k&IP+BiKhWlXt#3L13yL_^?ayUFVs)ZWRop zh?!d@hd76+1$Ve^T(cV>aU1kpt+*Un`jgK$Z_7;kd6=%mf)lX-rOZZ{?}`W5=2{PI zhG0w_e!X=4?2!exK9`B&IdLb!y5*rMJbImK+49ObmUpJ<-T3+^cOx$$D)jd1Z@$o? z%E~n2s_={Gpaiidm4<;p2o6216}7$nj3Ca3z}wddABueoF=!q$wkP*Zy?GcP$MJ%L z@syNWtr5NxFFQf%q8y%B{8*>l)#64?XH5x3Op+W6x%#-FtEv4U8*Nby=Q!J2PQ40q zL(BV(^Ri31YF9+94Xr7Iw~Z8?_%bYZYg50aGb3%ASE*1T;mpV>zL^fr8Zzd4tsSgd z9o)-Ohk>+FQgJ*fo-F&vw>yk+g+~)FpJdw$Ar1WG_iCi=H}Bmxy1#=An;n}X`HRT+A3rPp)RdbG*oHbs-H8g}pe@9~1>+8cTyr`60A?x@G_R@U z5lA&mDRBe`vh%n_ECVm2i8118e$3SOKX!^0?oVdRdWP)8f-OssOB#)H{&#kpIOX>O zbyW1C_eoWvly7)ztW9lrk-2oqOmiE}`?uR!e{Gdq8Q>t;mzlgybKik7f|U_Mhf7fV zpwab4no8vT02y~RhTHd2gT-#EMbJEWd*-wr*1cXnfF{_0#TCw>)B}VfyBSx}O6`@t)V;YNl)rcN+3&2P0A14Y z7(V1*k8D}1N>!$e0o`z^+OfVDg5NLX83O--1)f+=&2kQQSbFPIB1$HQao00Qe^%8X zsVJb7AVz7xR|mw@kGeSKJmi7^qOJ)+dzCZl_+MIwJ#4$~{T%;hSJ(z2p!%xDZ)|fSm78!jKDkl2i#N#k=6GFEYPM+s=GF~rZ{_W~2idZC zXKxu#w@;3m*7W^H9~La`V|eDpyYBhhgvvjTzOWDy#R6bvwV?`5ip}_;Z@D%m(d(eN z5_QDRGw_P0_SthnS{TVM<4Y!tX=Ta=-=62nZ zYiYr|vDRYO&*#R~Q9&}3b1nkF^T{w@xj33 zp)_V`22N5X7&~h|diazhJ;TNPk$0Evom7ng0b>>L>Ix@wA9uuJj6Dx7OMwIBhTjjm zl)m)$Q{0%ldWPd`bxGLcLedz{zK(LaZ{)Q?u64k=>J(rFe|V7PgN)}0`6?1!ksnO^ zAB<|R#wc9Z# z`QPEDa%~fTTV^AWm+y=hN6N=S8V%53x2l6&R0rN>wSR0X*Qm+0qiq=^&< z%WSwm8-@hChLPfLjDW%Q11kx~%CxV7pjt)kY-SeE$r_K---dI9&p~LhfWzY>Fypo6 z!fH@?&+Z15=!ShZ`?9pI5u+D#7C$9q+K8I4LoN&kpT|WFQC(8Iu2o2(K{n^aYEq(- z>0>6{guH;^{1AB@hUnq@-hsIqT6)-!^ZoZv(e}rau-o(n{u#zZkBterwLtR7c?{VO zJb7TT*sV<bH zp<>sPy-D#ss6@Hd)0B{gI)J7UIuVCX?tpmln=XXUs592wHu-$5H0Mc%Ly5G~k!e^! zLM_hTMvqrmz|nQ36@%PIdsM`myLQ8a(><7 zXu@;n<*(PRThY^A;Ul3jLPEPB!k_~!Wb!&v4ob66>n2Z!Xp@OcZ7;6ewsQ0i-U{Gt zv18H^>5=~2OXx@o!nxr!@mBcGfDCSM__chsWel<&zcKztkDqsoNHyG^M99@XzE72J z_mk)-h6)unr6#5$mY8HnGbkUCyh44sog>I0WgFS5aX}bJkaSKC{N;WAD;@E^d#?L> z=!4M*v^y5)aBcdP@6xP>tB;8Cu|c=s?DNR9=G)SVAfmx_YqP}Sw`~Fpq=#0QXcJwV zSTH*b;=brYm!Sy!f7)Kfp0^~u*jzS3Zi}BPem!rC@R{7=ilFH@m`oc+UR73pRXfDZ zuvoGPS8fMoN7pwJAtVm-5x#?&-}w5OFG(Zl3@tcZkz@5yyD=@?Vso`O7(SwutOu0YDQ zWcv9_(2)egnd4WHl8+Zd8muJS97m$|LQvL6zqYFW{0Qf+JY()R{xRPZ!qn~PIQ7u# zP2Gz4r|_xvC|?s)KJq9`%+;AV--ENWns&)%NHRk+l2)&PAQHsq0s>U@O7`czu5%|^ z&%Ihtf6IAtrR@+s<7A2B*46JH)1YLtqZc+Yv|gM&>PL&u)PK`O|4C{KsX6xBWWN1< zdwcSVE9uWFh7B^9#{vXRtkWd;FJvZ4$WEM9bkn>MzVcGHUWH#C#ll-aPdRc9b5wf| zsLS2?b&S2O@S`zTHAV!BF4Z6!ot*^43XKlyMSZnVwc_Qu`{}+OE8yhL=P03$NGgP^d)QGezsQ8El$f?sVU!;$HMqH z^gKba58_k_3KvIq%@%xL6O^EIIrZgD;Szefyi<7mLxt%66>e9@sCcR$e1M3&tf`il z|GZ=~@XDqyN^v7q^OGHmatt5!NsaRL#yKJn2 z=?|_#MCQdH(hjb9wwE*4_EO@;@q(-voqE$x&vE?vC?Gz=@QWARCspmw&voOs2XjwuBBCOhZQif(7 zv}u-`{!`7Bn@4>mMdX@(EHpM~dT2KD(*Mq8eAMd0(>~*LNFyv>Y;e5uTFfmlpg$fn zG)EV#r>gDpT57XpU(}#ywPn6PH56n_9n`jJg#>Lp(`?S&q>yoGPe;qDi=+q3Tdp<@ zflZMLYw4->T-n-)?l}JwI@jY8k)M5R_YyI}B`iTp=n|gm85p~@gr!f13fCfsT<3sg z0K%BCQkJeFXgf7pw33yOwwExlQWVF-C2*64^Fn%+kDnuqqr{uI6CiltzN`E=DF3NM zqkz!+r(j4G;W-P-^(Mxerb2~ibBt!gD@JyL9_fiuHPD@TMz7(+dNf%@v+l%G`EZyg z`g>;*OTxUhr}s?BUZ)W*4O&}F|L`Mm?TA&$WSFfydeV z7aPmiUz(0TGgp_~yiRGTI753~eCFbtc|O&}gv1q&z?47bmL2L&{?HEIez%qZ z3yZjLE6WGMdB8TAN9v4VSApi7qc1^T{jkvpn&b9O60Y?L6-j78qaBSA{8uhx+}o!f zWebCsVl})t-lwPnA8JC9>JF)w=tF}vk{`tPZyLC0{DxLPf7$wQ-!5?#3lLC}ys#7m z^C4Q+YC-)u-$3*#ceo7|EbmA-7;F3bdMk2E?e$rHmo*_tK#E>8!s9wCAdW$=MWOgX zk))4r%gspfcxl`MXpk%qt}L7SWdmvX>y$^?Q%81vSwf<1Pg1+sk~NC7klFL30bH#C?WnZ=Q%9qqG>2C-reA;` z1e7pE;PNB|!tL1@=Al9X$9xM)hFwC0vLa-agN6)7^a*%4);?0#3=z1Z7?30$@Sg_h zH{7$G2f~$Sq%YgXhHMK}&2Il@=AfV1{M?5Nn*|UAI_M8(h7_=$RI@6gHTL(yr#BwI z!BI&+gx)ha3Lnx3?Hen}9phph9G7m>3!y4UIAxVP{SrV$4{)%<-I?~y-$aKB;BXzh#zyAdq7`e2D8 z&TE}r^#*8k@r>6-rulpmv;3lXwENglp-&Ha0lsF`XzOR6SHSHNng=BXt)+EIMn=PD z5==q;T5!R5pK4^XW&MqbR2n$Mq*f<%7SKQZX zloYcq>(Y-d68FDd^O>lnzz#sgvN6PjH%L`(xaT^E3L)5)8CJEnAu;*fU_8XAk$X20 zGHcq(WkzK#;@$BRjxeMxiD_oaCgGW2CvnHp1ujI43Jwz8@IW8}`}aPq>kS-O$Sk`5 z7 zBsM@qKrA3NDkx2Q3lIoZdKXYYKP)QfBf$qB2(`ZX#xl8gayHUrPWU{gv7hMu5r25%V|XAyR{X{ z%SLSEu@SIcrP;Z}hQP^G7Zxz8MMKC|!~%D?bq25tcgrIL@mpo~K^Jk-N_nTJ9i@IM z<917-EiwpE@DTi_sUndP*B42{ezDaHQn#r|@nP>z}x;{9Lkqz<7`80*43K z-~7mDs@wWHHPr<_PSJ5eJ}0y;an3k#R&G?tiExWU=7i-CYc*lJrlT}LqD%&!$}?p; zTJ>?lYbI@hyPGZT`Pw?u>dhq)Hju;U|3e*^INuxQE4RAAC&XdP52?5`Hf#FzRZKax z^yOa=%nh|L`HwfT_FCJ@Hu&VYZBhTdFUzM%Zqt*8L$n}ZbKX`C7#tnVP$RRD!vj=r z!pm8i*vC)cTl%s`Ct);N6?yc3`AcdUZcWn0Pf-8?#`^C=>r=Zl4IV`is` zs6?Mf;SU8Jv*-LhL6P=N!--M*0m7#G%`tyL2IvqO=gPciqr+S!w%%eT7ec|U2vkgq zbRlA<%RfD&(oDN#O(2fV+1p8Ous=>tw*(sQ!Oqmdy<6M~j++++o@-x387vZVF6YpU z%#ZTu>av!7`hCpd%z%xn+j%?JYiUN6+BG(kMw)QD^S>=Te%c-{mRNx5A} zuF|glb=^v5%4Doc?A(m?^!;yL3LXyD4qSb z3`Ghj7(tYcvrAk~{C+daS?>Vz=k7u7FGcH!lP9#>GwVw*J&V1p*NTzoz8HNqeFRcMJGUAIjYn?%>|Di)s-q zMk@Sj!wC|ln;jwS-qEp7=hdjoX>M~jg37c4I7d{U1-<`Vbsk}3NKA;eGwK(RQ}Ttx!m+EE`e5d zYTJh(_oy(?37aco599RW^G*aiK3F$Va5MjBZZ8Msc7F~wWFtYNyS|MLDr$yQB_cmL z>G4&@mfmZV0AhngUmvc3L?ZvJ)oUHbx7isObqegG<;gH4T6hXP?EUd;Pdu4X!zYI$ z2LY4SJg+%rs|*d`cCpQH&NUKSz1KnH4Q^4w6HxVHGYbuNyhdMyi@FLQ`LVMe^fCE>PpqyiU%`7ORH> z61~36HA4d&VZS3@48l%5T_o8PizD=0&rsk~uk+!JcI8zVJk@X%kSEa@nR;VvxT6$Y$qDGuK4L-Nre8vN!ukC#?fMBQ$evNpklBDtuI^{dyGL?#aD5+vF5aa zj-?gNB;~L$zSkQYtg z-7NUM=KJmR*g3{`#<9q*&^?eb8}= z`ndwT=`>y0zHby5;Zho5s?!`5S!0hZm%2XFh^AEfIS3uTQj^>j0!gjF=z|8(Fv6LX zb-*5$N=?S={~j~Y;lCFCb3js(K}Wjbw2_3Nhmo*U5p9B6pedZ}UVyOat)Lx&gWKU%4&Qkv>xO1X3|%(KTXTlCWFF=IP3dd43%EEDUlBC9qnPiy6VW zMsNN}kmc%ouA!rwR?;QT*H7D%85t%y90gc{4~x#IZr>aZGACB=J5-(=t5(<0ct6#qDDhzTi_q4~b9Rspp;jW?j&hEy zglh|ivt0+IGn1bd4*suin%`o~@&pWvW|{?oE1mHyrE^rj|X z=4T9C-C2Ek{;4;G5Bk@2&VJG4&;>9Q+|L%xg)e~0g+()&bZIOlSHz7bAGAP$bJnqD%HLW0WRanc2p1;P=~y$;nr{$dyaRbdkkf+9h6CZAfVzlDUYyhEIkI|Ch6)$S+1pw$?bRaUYIdFCB~_k z<0v;z?l>^}W8e|jWGFV}`<%Z;cTH!}?7B^%T0Mc9Ww*|5<*0`je$s6wOVV_tP=^4t zbW`aO9=4^3HF~q#`k}X&`t@_zSFef-EYbBS?4rR0=0$B(vSl7@X?%v|AVI$QqZ>Eosd+ zm5YGkU~ho)0Ul4v)Q#V7whFlUE6r4!$hHq}uFv*PxI1u}S)8p~2pONmVzX7Y1eHQ6 zjG?8;S5LZ{%5awiu?;L4b?*WPcxQcuJH%SuK1f=Yao;KdoeE}j+#QL}Jyo+4Ln1gT zr`AO-vcbT`P9{gDI+kg=Vkz%eCjAqzd+_SM?qQP!<5n_!@y#yfd0u?oAv1C{l)iJz&~RJdK1C89S;tXAq3|?}gZ; zBY#+|;e8do?5p4V^1X&cbab}acTep{XnT6HrM1-ao-5$EQ@E6Fa<(KtMNbo?<(S@v z*HY{}mi|#y4!`}p$U^eH^!MR#5vY+%=dr=DnSmx8(~~6n+O?Qjeo{8x#*6}+hSrA-uKb>fNzf!p9xuU%*~pE z3L%w#Lb=I~!dzXX7no_NgM@3Q*+O&wLU-S;FaW5VqxlKFY1ldTaoy3^&&O+K9#3<( zNCj)@9f{VFxq47-=6R(=!$xmQF>ijB9$A%mEz=mr=-dr)V*< zU*7j`8<@1_XV%}rL#I{Tm@fGAzglrzS#wq~s2#1@aAFZeY`xyffBHOBqO&(fu8cA7 zbTHHx0176FFf2|Ud7ltHwQv6e9IdHJ2Wp#7fr2Q=wvScT08$YNw3z3e!*hhDq^k<) zWbG}68WO3iGpvkg`5midP$*NsR(U_5tPNQ+5a)&*l}R25J8QP(OQoMwl5l`VJ_vp2 zIf0d@5%Sn`@v_G!kVE)U%wk#?YbetX)ha=9MFr&vHTRlxmgTR{E$+C(SM}BCCI*d$ z-=R9Rl_Edc@scVYvh>LfYckh^0BJ`(Z??1RkHk`Z^;|YRexUPG^x)l|*(cZK<%*d) zb4O(bB2m6Y8DQ#7w@wOqO=aI$g zuhd)EXda(gtjNhHJzm?c zNBIMn37(lmHa4O6)4=4k^x>asdkU@?G}l(mMF}K7YZ`fT`zi7PAzHoo&4Gq%x=%9H zr>=ip9HV@!dVAarc7OB+1QIlqD|C^Xhh|+xOUYND%imN_Iww85?I%JX%-->>lJTWC zW9C8Tktwz)CzlE4f=X;--AWxCJ$TL-yH5`8)Lq_G3>TJ1FUc_8kOkOWN9B(9d`en|~bt24DU?&;7GPd9yvna$;6d`7vP` zV=F(vTEZ`Ux5I=nlxfpx8Q_PJB1F@6=T{p&C}tMx)v@}lQiS>|J3Y|)Pv0Nvr}o%q zB8TAm#y3PzgxE#9NT~c8*uCKUFHC$x&vKe)L_?iRq|}_}Xe8uzlGf=K3;fRJ4sT4Y zHxU&kI}%O_e2wfsV1hoaOn`02j)Qe58qmIsEP*YE6-p1r)<2jKCV1M@6U-ZAA5dUYq!2}-N zB42`m&X{d%M(T5CVeAI{L>`ce>hy!QT*jcLZ7b4VCyFyDM-V zX7Nd$w7-G$!~^UfKxcKmq!EE1gTX^;9+cIH$k02|4HbB|mZSM|B)7=AcZRh=O|Ee* z?1y5zWDftozz5Qcl(JSfz=R2>*Hk3N-hb*HYr~Mw^cQqz(%CITd8MQab#8@hs9VI& zwCk*a&j9|Boz^WjUc8qlBDGVdQwqjwF6t+?$>TneTQxkzU^rLRxr4cVi>Mncd*I4t z*@YXnxkc@*xAXAfdr2QZSe(KadV1IQrJtDONaYR%eque>nv+G!WkOy~FsQb^+w4;N zTI5#3P@hqg`iJf_f;nati{M0oot}6{BL<3qv9}DUjrh3C1Tz3WWQGJ(4TmB$Zmw$y zVprNLSg_RaZx+?-Xweq_wkcVLwQauaI%Y}7)E~2Z9THK)em`1EEoa5FO zto&AtcZSs0zQHZb+w zUIggs)Xp|=MGNG`3f%+Zwc_t|)lB^+ki)LTANftx_bq0N7Je>JF^a*Yx9w%K{niUC zPL>Jo;|>tgcZk1}yCN3FWu67$bo5z1U%$I;Ykc13&ka5-Yib|faUqQ2P>GOytUrAA z81PnKP>}qdlDPfN>-hl%@b=DOhq*d()Eaq|m!v(Bij&=1AP(XFU^#9ss!CJL3aW!Y zy*d+z3)FM?14w49fu4txHmVK7JsG@+qR^PjC71s>fuy?IoReQIe1rG62ldw#-)Nlu zp>S$uH``a^Ya-ILZmJJXcmfvE|3v$K4xwVe;L1VXF{%FfSvr4NPx0y?StMMC1E6A! z*Dup8wz60^HV}3q_NQefvbucgcoq$6(GKA(jy4RJFb%KIU-g_=M!zEmz`B{efbS?= zlgzcrCz#%?dVw?#CG8wGR?e7FbN3D4xVA{70^f|ay})aMz&FL`aEqKeC3zunr8DEZ z9aVy3n*2^hh{Ee^K7JI&#q0P!%W=z!Lh@D`_A~-=<$*tkVA#ghM<1pA4`!C!J$nnh zw5qz`1T?G`f5J<-2(#~U-b2o{vO87(1;xGn3n~@-2Q|$__yS8~E+}|?bQo_%N8<|Q z;daI(#L2rwho#%nWwRST29wGcXo8eL0<1^-&d-B}H+fwjl=lu*?ghlhAAVhrh-~$E zfrd7FE9VpTkA%P!+hXe7g?~uV0i)yOwq2z_I&BX@K!w&L8xR+I)r;Qa1EP?!>}?-k zIq6pjn29yIL0zSmk1V;erQ8REnTHqNKzPvVNb@n5DlavpK$V?ZeN%Nyf_G zf4|=xicc2)I~*(<+099ytlFJ=(!K1e^65zRsO5*@S<(;0a6n=_%6^9t7_Vr#__S7m zZ2tm_{UN~@nkRKwZaT70>Kn=J9CfS+7tpA7RG{!}(b6hD~ujN;N}o zy|unl5?`F+-ZL1E1U#U&Z07pIYBDWGg!ErHQ-_+gzwsN%6A!3)=7za-G|1 zhQuSgexZBGefgA!Nzfdv~+4B zWCvcyeH4B207=&{*7m~6O#0$0qDZ1vTl6bih(e3*InOmAS<&NCt&M##>_~U4Y#fA{ zBC%+}U{XJI{kN=76{Xte=Cb4@+#}ap$-8tg>z-9q_{5G)^?%KVqT8!q^xiH8y6-cW zT5>x{4;*tOj80pesea$7L!f>#Qt@=LgdKlq)M6%8-GM+3;NTBvX##t7!6(9$a_maa z!N6JAC8ZS|KEw-dv&J+|89bQ8y>;Qrks%7>XGvgq9eqt-FD20pP~K9@~R zaWv6fA4}BAY+T6%16Ab|Im|v59{S_aFO5I;@_#|6pYiT0?c0SYu~->({!*Nt?eaav zO8@1qu+jH`1gY+Wok$U0qN+`qJrA#kidp8FbEpLyR+xIE5jCMj!u>fzF>VWPO?XqV zemCPjT0>WopDms8&IGaG(BHV#_%z7cZZJ?x8@V3Dk3|+6$aWOtHIr_GZ6ffHVowo0d|uB&5~ht#Z&bI`}ri_btkLmgw;IMOtQ-@dD+1dU2%f?myr9`$>y}pXT9c{0G%Rb5^_st-`p%WMK4DQT?Pn!su z84=l@-rVhqmzJbm60m=P7^-{>ewjRyS5-(8rWg{cdaBsEs>m>_>Z$$r2rdltp30$> zA-^Cs9h7*FbTT9rs59nd(QvV;_C2ddmja{S`8e*EfKF-yXQTK~-*_iRpf5I%zn&=E z%i$(kiVaUt_#y?YYncY@$7Gul{ONIigYSOZ{!wS9h~G;IfEXHE>z*jmMlrlwSFn(+ zR(0O7gDn0tMb#f?Aqx(N7d(nDoQq_1dS*w@!EdHpY071wp_p8*A@|?RqF#$c(LOJK zZXnL*>*{}CZ2u7%C8DTuJO$uA;|}Af3e;h|a?AJ@PlvVC$!*$1jtH5VE#Y0AFZ2qr z_wyZpqllV3>-DvP&UDbZ7`=8?iG*8kI(pl-q==Xgy?pPX2C zsF~h@$+?5|$QTk(6@kNB6?nj0=`FN{+q$e^kJA_g7R}Qwrji!!pcUOEU=*L z;p}}_6u%`$)2r4~e?ieEm5RZ}ySL=~m(Ddx+>QTIyl%cg1_l$lPDo8g7hn!#LZCZb zq>CQ@s*lRw;!#}ulgUHlVXW8Tf5;?m+K2i!l1MQH$Ob^e*d!9~t7B56cl%y4p^vcek-*|0u3Tt#tBf#Zz@#~ zU4ivp5W9Wop;`8jpWMX}gD{4GqJ87vcKkN&hpLR-Ef&NgI4dG$s*A<}oU!2nU-qcrsskViF+Mj`Re=Q)p0&wm5;Q$m`_FbcD-DI1kS`BL~PM877Irkffj& ziid7I=oYd*k?tlr4ePA&l(2gD+F2%pOi?`ge|GoEM$=Vjg|k>R*t|%DX@uCy9Y8lO9>(}c5XQ?bi(;x z_k{oOF+-Hic{(5%LH##6b03Ao#SgX`K~C;aoJMIE$wiPz6YEPgqm(Nw%q_PonQt?5 z--X#ly4;T}KFe-Vb#}6c;y(sp@Ia$=n}CYev~U94FXr#97dkQ51fPY<8A_zzztY~( zd)w`^XT*x(A?ej5%5K8@zENY{_n&g0mSoZXXH4QkLUe<~reH0> zyVPO|ta!}?EkHKLT6y*){noh3s+L9DXA&naXKQ^fa$BgLoUv~Z*C`40jzqd zxeP>LlOm}QCg3-$}XM!-z&7qyY zoU-2M*VRR^rWi;?+H)kT-ZJ@6;5L{IuFgoef0gf_XA`r zWpvhDJgJMneL-I9YRgSvX0mx#M-ZfXw5I>NPkL#sug7=)beq`}J(&5_C-gVDI3L}Z zrTNXHMA9%pCF;5*es!tr;-L@J)kVN19YDO?AO|0Z&dqf;WONlpnj8TXT%Ad% zB!&5(Uwl}ndil}3IN42)SyD~W{8YBw(6h@DiowF{J-ftrc9L77d+MuC^kqs>u)MtlZ%13q`X52J-=7uHQc&gg} z>AmIYVCcS_I~Bkc#~!<0EER`VBv9_ni@oQ z?5zDco>)VoD1D`z+qVO;5~1DJ-Ihcza`cG?f(8FAYhzemTItFS#6jSdaK+RKC~miH zGUW3NifK(m-ELHA=<)%Z^18B_XexF54P(hOKY9-~zdt#pc-LvV$FW9}^Bdg@%#{+; zP9f?@YiQVgT)Xox63*4;0oiWRw?nfoqO6N}yUQ5hsO;8l z3n}&*QmN_f?GVL)3zfO;07)7d)}n`^CRefK(jy|6^saAtvtCfiOA3bVv=$tjR@paA zMn=_?JL~JW0P9Sn#+%|Q%G<)ifj7Bh7jxfO^O94aIcw^DGGCA4b=151;%VQ>IaUQ4 zy(#BUudn^7I^T2#i4Clui!X%z471iJPA#Tq5Vl8=FozeKM))l=WURqyi9MFcMTL?j z(SgNs4@Q2mm7ViXH*y(*#4Qji*!nmnXFKBtX;LEFh=7&FZ@M4mx<_0kG>#h(MGr++ zY+qcBYe>#jbOydJvbI91_c-n|yhk7=Kl-(bCyVQPu2|Y|NdIPZOsWG;?LnTHvuMk&oTk{`C zL(VojZANo*)Azpd6$q7=v*IR5P;A^esqet&x&T?9KSyMn>Vyal18NQRie~}5jiqEd zWOqxl^ofvf`-R>3Byiq_U@!E-n5Hx?(CG10VT`Z{hQTRSj`j1q4y)oFo*$4?gS zCA!4=E*eW+Mknd`?NoXWfAWXIn29*SsHq8?3vt+zXU#YIFm0^p%k~hS7De{jJS*l; zs%BdY(ar_E_gz|}4p#j`wI$<%!~sjr)~2HsVpr4d~o2?^X>U@TC5@ z;-D_;CCAXL)!^6OHj@`;5Y~++W-}X^Z-F2k2%Dpb)?_3D{xU{T)wBJThhp5JhHk!T z4w97|fLp+vGxN@k61h6rVulZ3eA!6YIuU&Q?E)4rp(d5H@x?B*v8uvL7QB|jH~wOL zKOQ=B|7+s51?JAzyu)_kz*V}HKV(j#AbwA}uLs5t%`I$$5#kYENA5N!-(a`NI~!eR z_lGq)7ubQXF!8L_x(P{HM0k8_kxJc*A0JvR(iv)${Is--;I1NS;L}40sa*;i=G5PB zMAJg&)Y6yl+lo8Qp6mLR#h^of=UOTkv{)^u&aG z>DBVxB=+0giiku~(PV|Uw9foWR~zd`A7zt@U8B-1SYTqYp)MVtW%ieK*B~~s$%Z9? zRw|Ok{TXwmo3s6+@r2zo_XMB%?_kRnwc!BSL|nq`+UT9w^Lm0;FS1?*k}ZWJJe2nN z?zwrTI-&M72gg&g^wMgj)n`n{D?iIV)6dc<$zjGOy|j%FF?py3w4mP?zM3W$Q`3SJ zoM6C(Hsg)&=vDHNIy|ywNN2cP$0)h->+ef$1qVnURvp>C9rESe@D{d` zTn37CEsPg>X>M7{K=w8?@I&)okU!pbk!9d&c<$Rb@`>-<;MG%`3wSn_Uf%^?sN8xq zzA82|Pt=xGWJV`Al%5BR%-fRCGY)2c(tmAa{8o7Ry&)TcG;XD3UsN@uLl8cFh@Fqb z@l9Wv;57JE>=j0X%8GX+SI@F@K(;?km5pi#UVHKBt?BIn=X#(2@2#!hZy;Q|>QOlx zvF)}s0LC!w$5jM$W=h87?J8A>beTl*O$WSA1!>jOSwF(VfA8TUqb!FQ;-L}V+0px1 z#Zh6K6^#s9>8+J9Ab^bGU&PCX(Ol0UttaXALWC1qc`^BP-{KX#kDWz7dM&`zXpxYGs7BN0YaMPi7K-?i$!Su+Mg2WpRD;{S&9Mm!}b>C*1Rei z?vLgp#=I=5y)Rvqr9iA5^g+1aASs6n(B_BeWR2GOWnY_RX71SF4AU2eImv zJGea-6dS^|10173xkjvQ-K$nk^NfPTltc3!(Z1I;rp_Z&MYy5d~H>gQOMLPO+Z&oHFAm16c8msJ9rR#2;LbRCPEiZPw{3P1 zWxG7@TuO1~!7oo6Q7G+bBqNQcleX0MRWhNF9D5>#RGZuuSD3q$Ma@;Le)+!QL&fg= z(jCE^#u5L;Ze0hV$@~e@abrH9RGW;`nyU87yghaQf|4qVsowAv%dh0*5#iC*$Hv+~_(m?d!N}YN}Z!RXkTSd@%7tW7*8J1uoW!Lza|5y$Ppbbhp zH1Ov%iP0S}&H7-bcLoDHW ziT7MvR>%`c9oT?-n#KlUtVN8@2MwTjui2ixMRp{ux~?_xWxm|n;LCHU*^cpdskSS( z|J77mvw9pj++?M#ruvBM^0Vpvj$s4H@<)r#=@cm zmLpv49Pq-Bj;6EV^qH=91Ie2MN%9hjhb^539v&W!Bd86Twr2XRUkkq?%aGRyK)NCQ zz?q)qLMOZH@10sL9=*3o@eDN*Cn%2UuKQJN1(5m(mMW1(gw~vj#lQ!Ix?`=ZG)d|* zD0#bVvWE;N*$~`_5(SvmR-(apoo&YBhF7d^s0jDu&F-mjf8IAWi7eBx27>z4V--3u z&zGk=b5lYr9!+W)Y4By+rpDK3@*&Deq2vS<-U!z!hWqv5!r+|auHWHR*j&fT^e2cp z68`PZ{IxV-GYg13Rzzg*8y@!oQos{vmd65l8*_XyW&#VnGp?yp9MliYq{#=uGQW1( zMJ~LPPOsNIdnj;!F5ltqTs85J+uV~7fGvXYdbNcIF=SacO8IK$X%}O3rd2%U1~2y! z4#mAhib1OslX0X{IZ|ut8PP9ZQ;YN}pww1XKBV7UD_e-WPp$XV8k{%i$DwjlRS%4@ zZ*k*;VW7Y~<_^J*^!cXq(#03Nn#m0|AX`cYgBu42IKR!#H5`*3Gev_EKc2u7HE*9x z$Hfl6l@xq#{2MEy`;1$6PW&YB`~${F$^&ZFi^J5J)7E?U<>j>PlDk_GObwe0+zqQBbl0S=dWOd2zkiH_Q43j)a~2~ z3h&|v7Q9Fp5R|c{BYdyZTBSS4)@6O&&qO4g?uKAgtU$yA?#ItSa-b4G@m}m*q&3#> zmaYT-1TwMVFR0R)@{g1FHxXDapc@FCK=d#Dkt_^POe9aRwSAHL7+C z_*DO27gex49Cudw0LAwnW2A;O!sQL<`}xHIih{AEO6$J{;g42Ue*9XOj$gLl+QL8F z)t5R0s7HE|!Jr*$1{k^g=l+)k#_vawPYHd|ZMMVKi`Il}Q>ZA}#$7by!B72+EQ5oT zi=MlQJN~S&8~BwNl)bdYqSii;0H!RFf?t+MH6{uXuN$w8Dl71ci5|x-*6~WFg>|E~ zh>}}c6>|uE-2T{_2tx>^0^V~i!k~ZAOKx8?VftSV)c2Vy?K>PnKcr3+d~-?);Pw^H&?Y8T-mE`7dRl`c3@{bwPs06YPys!-A% z7X22SrpG_PToZgN=jI`phxTh;uy*1v=qr-9c%E{TNGBvwmlWO(E(JmobISPqldYwR zQ|9}Rg8e(!96=?$rgrF`+JPNkTXUiOPL%mCPnE&6I#A{UkHUEJfMU;unqyT znU5VgJ0EXhW|1g>h_lvjxE$mjA(I61YIr62-EDy{@9wIQfayoG$rrM|SyK-RPj(*`` z=~7tOpX~f1BZF=ZT~?+J>xbi{p_);otlvv~;AzqbUg>S@t9g+ap1+`b*>O_&&mwLG zc=!qWE^*Bu9myw<;L1Eg-<#Ko(a69OWP0Y4hHIkzswtLUbd|HAHwLak9kCavNlIYO z)p~1DKnth>_Xxf>AxWFhKl)>Kx8<`VgF=3SjxyG{9U{lD(;S+F-#x;MFM&BXslhMV$`UEt|qF6xsINTTCW`C|ZO zKq5@<{F3|yVvQsx zbL8Su_!J)>X!b6cv9T(XVg_uh*vS@!8wQ^cCR(0&o%#>u4mc~VN;-($i;t07kK8K# z2jklUY|LGXe_w@6?~vYBvpL(HJaODL`|@N@#_Od+Fl3AW>B_`5|IU-jw&w{>|70TMZ4RMVWAmZJ^Sqveua zf+UbPe^E?USYJyoohW^(^9*hw(pK*sRg-eb4mcPSIZJeLVa@?z2Na_UW6W*e5%1f?{RYwR3sSH38(RvuqV=46 zHC}IJuAp84jne|*E5%o+K51vvtF@lj4{|L&cMf=?r!S<^2J0()k7>YQb5@de_6Zh# zel}OE3lJc$OA>l|x*%z;Hn#F~+da}8DD+%N>53)g)3W7k@hY%DHs|@zDdzP>s0j^=au_5#Qol-*%3R_FS;7Yc2Z(|OcPwBP_C5i1#jlyHZn1{6EE zvov({TV#mX0=I%`Oeu?=l=7MQKix0;Z^tvhe?9bnF`jAAI(XrP$e>AhEn`UKY~k>) zDp$P4(-C5yTH2Cp*GO;>bn-AF$es4nyqfkMRx8=nmN=>{OA+JkM@r*&B=n|TMZZ6i z6Uycg+;9miH(jkwTM~%R=Jl!8b$8Nqy7uT!N6MY&X)pf)UDX8^)%3C+*F+YWI(SJA-_hDN#^Q!bHn*PYj=}EGXv}z^X+^+8bhdd6T0VMDE>ed#fDGhrdRri#!07p5*2#ZXvmDFZ}0FL>k{Z|dFxUm!Sr`ml*0 zqpiJCoDAOMl4-v&K5sf<0%XA+5soa?1$T$#TQIEdbLj6!ncJFbC-;$ZM4b+YMPVqj zAX#?0f(e@2dRB3tA~i0qoyISGJO4EQQ(Mker$1nf?rp+OJo0%FMTy`FSkX1@kVDEJ z%X(hLV4U0NGrU3DVmbb&lTO0V5t#i?SLCyiCjC;&QIEWwN|NK%#$&KGuI&MKv zlOyM?<(L))vvN~f1MnjqT3~!)uxVE!tH0-Tp1Re1H@sFK0Sbo0Ip-X=`GrJcdb{^IF0m$9DhU!!yIw+N7(4Hb<#(i`@ zCPhD`>RhISV;Otq9@1!gxP^p{8sc)yS=Ut6iD$;${YLYu9k6+NIoh=V!;dBAYs!lA z^RwCxb}n!9>^^jgJ2L1iihx9l(0tTSmC&mW9QHJEqEF-}hfH*`TfPxdIokj0J<7_E ze06$~x9VB>kr(ZIn2fEnZGuQ$8#|&pZSOY0IkR`%p-G(8WZgaPeU=ZFnLhXwMwL&^ z5p-zai?;(9aR&qQ6+r73a0Yh})gm7ez54sd64pT2T@ANBF$qSvJ=u(q*p9Hlv#T^BasB|~*LOd`>DRwU!b&duLi-LY<;8fKl9Nx}ckEvFcUH7-WcyR*+-%nc=9oX!a=)Fw zGRE6AQVA&TGj$2c{PB2IdlGxGSXGhwN*P zhg(@h#cpL1l%K4NWppJ!MRCfsRad->k5V>yf7)+AsER)RH||cH+P&j0k|+5Tu4=j% zXARtn$J&m5@-13cHs(w^Z7F2g=#qN+1&|u%<72l^EuUXW^qi<7e_+n19xnM+wS&o$ zJDpV_5lR*x6lq*-f_HnJ0F3>;_GEXeh}ojMDmD8r2cN$dDYb06qr@TOr&jG`;UHs-{fB!^>N#hV?p`>aTG8!_ zzqCWTLM?Tnot?MTm+g`jU{-=NSXwr^eltpWSu-2hVdb1k=z-vIoMw}5F>%>wf* zwBoaMPw`saSB+tJjpq-Z(QLCpjN(aW{L1z4t}~2Ju0SvpSwalvwIX%s!}GTZ>V&*R zZ^o1FaxDu$LqNB_P-7SSS}BpgOC}53@NW2dUOBf@Hf!Wtf={k>fgK;C$nch!uDO-Rg? z$ostBpYQja-|u&>-|t-K4}aylkX+9^UypIW-|p)O5%_B&UwbxK%D~K|w(5;IXM4f) zb-z>%A>#+gclP{}bPKJ%d|>~ydacPk(dU1*D2ljjx%L^6qQrl(vKw_JT-UEy(Wpbc zpiiL^d(I#p@{}g=ZiYKWv&_PYH|xXIi999bLy_mFGzKtbay}^lug%>S#BWQ#&Lye{ zxIL~b-1Ce`kY`%v9<@T$NV#_)en2B}6KNKt?&3faqpkAmOw*+JM&!d-$;)21I^*8+ zbiNanTyp2Mg6%KW1j&$@ar1ASM-_nUX7m2lNNCHBmiXdZ*ZrTRY9dXo&XeRvxaYuY z@fHUZ15!~%K>0>WefDAp@}=%A&*c1)?f2m?JX3}t_S4U2o$8V-W-Pm0T!7p-{)=K_ z3BlJFIST#wx_5&|U^6g^Ij)I>Lx^mYty*r9Kr#*&z{{OJ{CHnwVc~@9bY+c+?EnRa zF|b7QrBm*kI-}hrH+$OEw=oTyJ3RnQ?bm8^{i0IHp>1@IbS9oJ-mTBtI;2%}T%y-f z%I5tq+8s@0Wr2POiPcXh1bo?w`rDR^q5`Pdg>5!Y-lu%+eru~=_i_8T?5Cup343>m zb3so|gGf@x=fpZ=qVhPkfngQx`gNKlUgK9j>~TyEFF)$!q0+1#or=SaSb?P$&KOp- zwkn)D_I7yhF-NJ|j*gBz>@^nyGDQ&~@?{6&J(^bLkTF#vE<965!@*B3Sz;&@|2+52mLD zIrmHH*lcYmSIH3IZHMLvTgyENPJe~5#tzWtZ1j*+4ggPB+exx6;}E18kkRoG6Q4Ex zART3YBfBi|oL1Xxfv-eoSvgei>BW7`DM$*PXuyMPHfB^9&A@Ip*xNh+&X&W_l4eZS!?O%u zn7h3&qrP8rB%hYwbEtKPS8t~J3kXJ zOKTxJ?|%N^glp!bkgv~Zq-m88mF@gaLt5^wQ0Pt{z+{(tWw+sa1&?Xnul8iVCI7Vq z`AZ7y&~C#dp3q}2&c8}-{}f@WeL3`_4$m*MkDD`z(dgHK78uOJjfPBHGD7^)SnXGq zN3V-PjUUw{c}6o>iUDyIS-yVHe$(iYPsNKFKOL_hAKzDr=h~f1d>WVlj%0oc z?z#p@G!^<$d_(gIMa|ZCP7fR6)ycSfGN|BzT7 zC;JW&VexACZBl0t-ugR+Q9PM(S7jytG;}AC1};xb>!@J6gJ6WYKPC=+`8n8{?)*{e zBY2-6@c!_1ulnFSV8N_!_;$}f=bQe`UpFgD3(Z~p;YWh;*{yl@_qIRJ07JDKe50u! z=mVW6dBnle3N3^7X6BZ6_^(9KhZM+vwj!L?wLUp(g}k;z z$57d7$dQXLP7qzgbcqBu!J`pcnK@nGmV5-9^JlKg-yba!u7^)hH|6(km+BeYIOdPq zxB(cu*Hz?GA_7BIs5TC9`PJMsYvOvAv%x-Xf7p#n9lmM~^*_is(XExpQ2PvI*8YDm zpR)hMeEM&X@K0MoiWd=tnct{{<#f#8P)%}Mz^EW_K>q!DAje|>x!qa4NXi7>k*-LC(?(~|5CMYZ( zaMQVvY&$vFV1l#5B!;G!1=r-yPi!V&cPhQG!HW19Bq2I)(+pKi=Ehj8B`VTp1x8Hf zN0RIcgO8^Z{U?dV+o1p+cM9S*;ab^jQpzQ;Q`(}K&fA|`-FMohXhC8G8w!GYz=93U z23p;XtM&LnUEy>^sd`=X`DZ@^S&|3hVc#)Q4)0CONgF$GaHf=1x$W+!I^r~?&-0q^4$!(HP%O7EbM0*YA-Wa zF0~541;?oZf!~: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%0A;Gi9wG) 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

te9-&Gaw8zr~O$N@{q`L-zP}g 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 XyMK*O2yAQ|Ts&+Dl#~)mk_i6~yVs{~ literal 0 HcmV?d00001 diff --git a/doc/src/CNN/cnn-plain-minted.tex b/doc/src/CNN/cnn-plain-minted.tex new file mode 100644 index 000000000..6fb87ff00 --- /dev/null +++ b/doc/src/CNN/cnn-plain-minted.tex @@ -0,0 +1,781 @@ +%% +%% Automatically generated file from DocOnce source +%% (https://github.com/hplgit/doconce/) +%% +%% + + +%-------------------- begin preamble ---------------------- + +\documentclass[% +oneside, % oneside: electronic viewing, twoside: printing +final, % draft: marks overfull hboxes, figures with paths +10pt]{article} + +\listfiles % print all files needed to compile this document + +\usepackage{relsize,makeidx,color,setspace,amsmath,amsfonts,amssymb} +\usepackage[table]{xcolor} +\usepackage{bm,ltablex,microtype} + +\usepackage[pdftex]{graphicx} + +\usepackage{fancyvrb} % packages needed for verbatim environments +\usepackage{minted} +\usemintedstyle{default} + +\usepackage[T1]{fontenc} +%\usepackage[latin1]{inputenc} +\usepackage{ucs} +\usepackage[utf8x]{inputenc} + +\usepackage{lmodern} % Latin Modern fonts derived from Computer Modern + +% Hyperlinks in PDF: +\definecolor{linkcolor}{rgb}{0,0,0.4} +\usepackage{hyperref} +\hypersetup{ + breaklinks=true, + colorlinks=true, + linkcolor=linkcolor, + urlcolor=linkcolor, + citecolor=black, + filecolor=black, + %filecolor=blue, + pdfmenubar=true, + pdftoolbar=true, + bookmarksdepth=3 % Uncomment (and tweak) for PDF bookmarks with more levels than the TOC + } +%\hyperbaseurl{} % hyperlinks are relative to this root + +\setcounter{tocdepth}{2} % levels in table of contents + +% Tricks for having figures close to where they are defined: +% 1. define less restrictive rules for where to put figures +\setcounter{topnumber}{2} +\setcounter{bottomnumber}{2} +\setcounter{totalnumber}{4} +\renewcommand{\topfraction}{0.95} +\renewcommand{\bottomfraction}{0.95} +\renewcommand{\textfraction}{0} +\renewcommand{\floatpagefraction}{0.75} +% floatpagefraction must always be less than topfraction! +% 2. ensure all figures are flushed before next section +\usepackage[section]{placeins} +% 3. enable begin{figure}[H] (often leads to ugly pagebreaks) +%\usepackage{float}\restylefloat{figure} + +% --- fancyhdr package for fancy headers --- +\usepackage{fancyhdr} +\fancyhf{} % sets both header and footer to nothing +\renewcommand{\headrulewidth}{0pt} +\fancyfoot[LE,RO]{\thepage} +% Ensure copyright on titlepage (article style) and chapter pages (book style) +\fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} +% \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} +% Ensure copyright on titlepages with \thispagestyle{empty} +\fancypagestyle{empty}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} + \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} + +\pagestyle{fancy} + + +% prevent orhpans and widows +\clubpenalty = 10000 +\widowpenalty = 10000 + +% --- end of standard preamble for documents --- + + +% insert custom LaTeX commands... + +\raggedbottom +\makeindex +\usepackage[totoc]{idxlayout} % for index in the toc +\usepackage[nottoc]{tocbibind} % for references/bibliography in the toc + +%-------------------- end preamble ---------------------- + +\begin{document} + +% matching end for #ifdef PREAMBLE + +\newcommand{\exercisesection}[1]{\subsection*{#1}} + + +% ------------------- main content ---------------------- + + + +% ----------------- title ------------------------- + +\thispagestyle{empty} + +\begin{center} +{\LARGE\bf +\begin{spacing}{1.25} +Convolutional Neural Networks +\end{spacing} +} +\end{center} + +% ----------------- author(s) ------------------------- + +\begin{center} +{\bf Morten Hjorth-Jensen${}^{1, 2}$} \\ [0mm] +\end{center} + +\begin{center} +% List of all institutions: +\centerline{{\small ${}^1$Department of Physics, University of Oslo}} +\centerline{{\small ${}^2$Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University}} +\end{center} + +% ----------------- end author(s) ------------------------- + +% --- begin date --- +\begin{center} +Oct 3, 2019 +\end{center} +% --- end date --- + +\vspace{1cm} + + +% !split +\subsection*{Convolutional Neural Networks (recognizing images)} + +Convolutional Neural Networks (CNN) are very similar to ordinary Neural Networks. + +They are made up of neurons that have learnable weights and +biases. Each neuron receives some inputs, performs a dot product and +optionally follows it with a non-linearity. The whole network still +expresses a single differentiable score function: from the raw image +pixels on one end to class scores at the other. And they still have a +loss function (for example Softmax) on the last (fully-connected) layer +and all the tips/tricks we developed for learning regular Neural +Networks still apply (back propagation, gradient descent etc etc). + +What is the difference? \textbf{CNN architectures make the explicit assumption that +the inputs are images, which allows us to encode certain properties +into the architecture. These then make the forward function more +efficient to implement and vastly reduce the amount of parameters in +the network.} + +Here we provide only a superficial overview, for the more interested, we recommend highly the course +\href{{https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html}}{IN5400 – Machine Learning for Image Analysis} +and the slides of \href{{http://cs231n.github.io/convolutional-networks/}}{CS231}. + +% !split +\subsection*{Regular NNs don’t scale well to full images} + +As an example, consider +an image of size $32\times 32\times 3$ (32 wide, 32 high, 3 color channels), so a +single fully-connected neuron in a first hidden layer of a regular +Neural Network would have $32\times 32\times 3 = 3072$ weights. This amount still +seems manageable, but clearly this fully-connected structure does not +scale to larger images. For example, an image of more respectable +size, say $200\times 200\times 3$, would lead to neurons that have +$200\times 200\times 3 = 120,000$ weights. + +We could have +several such neurons, and the parameters would add up quickly! Clearly, +this full connectivity is wasteful and the huge number of parameters +would quickly lead to possible overfitting. + + +\begin{figure}[!ht] % + \centerline{\includegraphics[width=0.6\linewidth]{figslides/nn.jpeg}} + \caption{ + A regular 3-layer Neural Network. + } +\end{figure} +%\clearpage % flush figures + + +% !split +\subsection*{3D volumes of neurons} + +Convolutional Neural Networks take advantage of the fact that the +input consists of images and they constrain the architecture in a more +sensible way. + +In particular, unlike a regular Neural Network, the +layers of a CNN have neurons arranged in 3 dimensions: width, +height, depth. (Note that the word depth here refers to the third +dimension of an activation volume, not to the depth of a full Neural +Network, which can refer to the total number of layers in a network.) + +To understand it better, the above example of an image +with an input volume of +activations has dimensions $32\times 32\times 3$ (width, height, +depth respectively). + +The neurons in a layer will +only be connected to a small region of the layer before it, instead of +all of the neurons in a fully-connected manner. Moreover, the final +output layer could for this specific image have dimensions $1\times 1 \times 10$, +because by the +end of the CNN architecture we will reduce the full image into a +single vector of class scores, arranged along the depth +dimension. + + +\begin{figure}[!ht] % + \centerline{\includegraphics[width=0.6\linewidth]{figslides/cnn.jpeg}} + \caption{ + A CNN arranges its neurons in three dimensions (width, height, depth), as visualized in one of the layers. Every layer of a CNN transforms the 3D input volume to a 3D output volume of neuron activations. In this example, the red input layer holds the image, so its width and height would be the dimensions of the image, and the depth would be 3 (Red, Green, Blue channels). + } +\end{figure} +%\clearpage % flush figures + + + + +% !split +\subsection*{Layers used to build CNNs} + + +A simple CNN is a sequence of layers, and every layer of a CNN +transforms one volume of activations to another through a +differentiable function. We use three main types of layers to build +CNN architectures: Convolutional Layer, Pooling Layer, and +Fully-Connected Layer (exactly as seen in regular Neural Networks). We +will stack these layers to form a full CNN architecture. + +A simple CNN for image classification could have the architecture: + +\begin{itemize} +\item \textbf{INPUT} ($32\times 32 \times 3$) will hold the raw pixel values of the image, in this case an image of width 32, height 32, and with three color channels R,G,B. + +\item \textbf{CONV} (convolutional )layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and a small region they are connected to in the input volume. This may result in volume such as $[32\times 32\times 12]$ if we decided to use 12 filters. + +\item \textbf{RELU} layer will apply an elementwise activation function, such as the $max(0,x)$ thresholding at zero. This leaves the size of the volume unchanged ($[32\times 32\times 12]$). + +\item \textbf{POOL} (pooling) layer will perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as $[16\times 16\times 12]$. + +\item \textbf{FC} (i.e.~fully-connected) layer will compute the class scores, resulting in volume of size $[1\times 1\times 10]$, where each of the 10 numbers correspond to a class score, such as among the 10 categories of the MNIST images we considered above . As with ordinary Neural Networks and as the name implies, each neuron in this layer will be connected to all the numbers in the previous volume. +\end{itemize} + +\noindent +% !split +\subsection*{Transforming images} + +CNNs transform the original image layer by layer from the original +pixel values to the final class scores. + +Observe that some layers contain +parameters and other don’t. In particular, the CNN layers perform +transformations that are a function of not only the activations in the +input volume, but also of the parameters (the weights and biases of +the neurons). On the other hand, the RELU/POOL layers will implement a +fixed function. The parameters in the CONV/FC layers will be trained +with gradient descent so that the class scores that the CNN computes +are consistent with the labels in the training set for each image. + + +% !split +\subsection*{CNNs in brief} + +In summary: + +\begin{itemize} +\item A CNN architecture is in the simplest case a list of Layers that transform the image volume into an output volume (e.g.~holding the class scores) + +\item There are a few distinct types of Layers (e.g.~CONV/FC/RELU/POOL are by far the most popular) + +\item Each Layer accepts an input 3D volume and transforms it to an output 3D volume through a differentiable function + +\item Each Layer may or may not have parameters (e.g.~CONV/FC do, RELU/POOL don’t) + +\item Each Layer may or may not have additional hyperparameters (e.g.~CONV/FC/POOL do, RELU doesn’t) +\end{itemize} + +\noindent +For more material on convolutional networks, we strongly recommend +the course +\href{{https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html}}{IN5400 – Machine Learning for Image Analysis} +and the slides of \href{{http://cs231n.github.io/convolutional-networks/}}{CS231} which is taught at Stanford University (consistently ranked as one of the top computer science programs in the world). \href{{http://neuralnetworksanddeeplearning.com/chap6.html}}{Michael Nielsen's book is a must read, in particular chapter 6 which deals with CNNs}. + + +% !split +\subsection*{CNNs in more detail, building convolutional neural networks in Tensorflow and Keras} + + +As discussed above, CNNs are neural networks built from the assumption that the inputs +to the network are 2D images. This is important because the number of features or pixels in images +grows very fast with the image size, and an enormous number of weights and biases are needed in order to build an accurate network. + +As before, we still have our input, a hidden layer and an output. What's novel about convolutional networks +are the \textbf{convolutional} and \textbf{pooling} layers stacked in pairs between the input and the hidden layer. +In addition, the data is no longer represented as a 2D feature matrix, instead each input is a number of 2D +matrices, typically 1 for each color dimension (Red, Green, Blue). + + +% !split +\subsection*{Setting it up} + +It means that to represent the entire +dataset of images, we require a 4D matrix or \textbf{tensor}. This tensor has the dimensions: +\[ +(n_{inputs},\, n_{pixels, width},\, n_{pixels, height},\, depth) . +\] + +% !split +\subsection*{The MNIST dataset again} + +The MNIST dataset consists of grayscale images with a pixel size of +$28\times 28$, meaning we require $28 \times 28 = 724$ weights to each +neuron in the first hidden layer. + +If we were to analyze images of size $128\times 128$ we would require +$128 \times 128 = 16384$ weights to each neuron. Even worse if we were +dealing with color images, as most images are, we have an image matrix +of size $128\times 128$ for each color dimension (Red, Green, Blue), +meaning 3 times the number of weights $= 49152$ are required for every +single neuron in the first hidden layer. + + +% !split +\subsection*{Strong correlations} +Images typically have strong local correlations, meaning that a small +part of the image varies little from its neighboring regions. If for +example we have an image of a blue car, we can roughly assume that a +small blue part of the image is surrounded by other blue regions. + +Therefore, instead of connecting every single pixel to a neuron in the +first hidden layer, as we have previously done with deep neural +networks, we can instead connect each neuron to a small part of the +image (in all 3 RGB depth dimensions). The size of each small area is +fixed, and known as a \href{{https://en.wikipedia.org/wiki/Receptive_field}}{receptive}. + + +% !split +\subsection*{Layers of a CNN} +The layers of a convolutional neural network arrange neurons in 3D: width, height and depth. +The input image is typically a square matrix of depth 3. + +A \textbf{convolution} is performed on the image which outputs +a 3D volume of neurons. The weights to the input are arranged in a number of 2D matrices, known as \textbf{filters}. + + +Each filter slides along the input image, taking the dot product +between each small part of the image and the filter, in all depth +dimensions. This is then passed through a non-linear function, +typically the \textbf{Rectified Linear (ReLu)} function, which serves as the +activation of the neurons in the first convolutional layer. This is +further passed through a \textbf{pooling layer}, which reduces the size of the +convolutional layer, e.g.~by taking the maximum or average across some +small regions, and this serves as input to the next convolutional +layer. + + +% !split +\subsection*{Systematic reduction} + +By systematically reducing the size of the input volume, through +convolution and pooling, the network should create representations of +small parts of the input, and then from them assemble representations +of larger areas. The final pooling layer is flattened to serve as +input to a hidden layer, such that each neuron in the final pooling +layer is connected to every single neuron in the hidden layer. This +then serves as input to the output layer, e.g.~a softmax output for +classification. + + +% !split +\subsection*{Prerequisites: Collect and pre-process data} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn import datasets + + +# ensure the same random numbers appear every time +np.random.seed(0) + +# display images in notebook +%matplotlib inline +plt.rcParams['figure.figsize'] = (12,12) + + +# download MNIST dataset +digits = datasets.load_digits() + +# define inputs and labels +inputs = digits.images +labels = digits.target + +# RGB images have a depth of 3 +# our images are grayscale so they should have a depth of 1 +inputs = inputs[:,:,:,np.newaxis] + +print("inputs = (n_inputs, pixel_width, pixel_height, depth) = " + str(inputs.shape)) +print("labels = (n_inputs) = " + str(labels.shape)) + + +# choose some random images to display +n_inputs = len(inputs) +indices = np.arange(n_inputs) +random_indices = np.random.choice(indices, size=5) + +for i, image in enumerate(digits.images[random_indices]): + plt.subplot(1, 5, i+1) + plt.axis('off') + plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') + plt.title("Label: %d" % digits.target[random_indices[i]]) +plt.show() +\end{minted} + + +% !split +\subsection*{Importing Keras and Tensorflow} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from keras.utils import to_categorical +from sklearn.model_selection import train_test_split + +# representation of labels +labels = to_categorical(labels) + +# split into train and test data +# one-liner from scikit-learn library +train_size = 0.8 +test_size = 1 - train_size +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size, + test_size=test_size) +\end{minted} + +% !split +\subsection*{Using TensorFlow backend} + +We need to define model and architecture and choose cost function and optmizer. +\begin{Verbatim}[numbers=none,fontsize=\fontsize{9pt}{9pt},baselinestretch=0.95] + +import tensorflow as tf + +class ConvolutionalNeuralNetworkTensorflow: + def __init__( + self, + X_train, + Y_train, + X_test, + Y_test, + n_filters=10, + n_neurons_connected=50, + n_categories=10, + receptive_field=3, + stride=1, + padding=1, + epochs=10, + batch_size=100, + eta=0.1, + lmbd=0.0): + + self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step') + + self.X_train = X_train + self.Y_train = Y_train + self.X_test = X_test + self.Y_test = Y_test + + self.n_inputs, self.input_width, self.input_height, self.depth = X_train.shape + + self.n_filters = n_filters + self.n_downsampled = int(self.input_width*self.input_height*n_filters / 4) + self.n_neurons_connected = n_neurons_connected + self.n_categories = n_categories + + self.receptive_field = receptive_field + self.stride = stride + self.strides = [stride, stride, stride, stride] + self.padding = padding + + self.epochs = epochs + self.batch_size = batch_size + self.iterations = self.n_inputs // self.batch_size + self.eta = eta + self.lmbd = lmbd + + self.create_placeholders() + self.create_CNN() + self.create_loss() + self.create_optimiser() + self.create_accuracy() + + def create_placeholders(self): + with tf.name_scope('data'): + self.X = tf.placeholder(tf.float32, shape=(None, self.input_width, self.input_height, self.depth), name='X_data') + self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data') + + def create_CNN(self): + with tf.name_scope('CNN'): + + # Convolutional layer + self.W_conv = self.weight_variable([self.receptive_field, self.receptive_field, self.depth, self.n_filters], name='conv', dtype=tf.float32) + b_conv = self.weight_variable([self.n_filters], name='conv', dtype=tf.float32) + z_conv = tf.nn.conv2d(self.X, self.W_conv, self.strides, padding='SAME', name='conv') + b_conv + a_conv = tf.nn.relu(z_conv) + + # 2x2 max pooling + a_pool = tf.nn.max_pool(a_conv, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME', name='pool') + + # Fully connected layer + a_pool_flat = tf.reshape(a_pool, [-1, self.n_downsampled]) + self.W_fc = self.weight_variable([self.n_downsampled, self.n_neurons_connected], name='fc', dtype=tf.float32) + b_fc = self.bias_variable([self.n_neurons_connected], name='fc', dtype=tf.float32) + a_fc = tf.nn.relu(tf.matmul(a_pool_flat, self.W_fc) + b_fc) + + # Output layer + self.W_out = self.weight_variable([self.n_neurons_connected, self.n_categories], name='out', dtype=tf.float32) + b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32) + self.z_out = tf.matmul(a_fc, self.W_out) + b_out + + def create_loss(self): + with tf.name_scope('loss'): + softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out)) + + regularizer_loss_conv = tf.nn.l2_loss(self.W_conv) + regularizer_loss_fc = tf.nn.l2_loss(self.W_fc) + regularizer_loss_out = tf.nn.l2_loss(self.W_out) + regularizer_loss = self.lmbd*(regularizer_loss_conv + regularizer_loss_fc + regularizer_loss_out) + + self.loss = softmax_loss + regularizer_loss + + def create_accuracy(self): + with tf.name_scope('accuracy'): + probabilities = tf.nn.softmax(self.z_out) + predictions = tf.argmax(probabilities, 1) + labels = tf.argmax(self.Y, 1) + + correct_predictions = tf.equal(predictions, labels) + correct_predictions = tf.cast(correct_predictions, tf.float32) + self.accuracy = tf.reduce_mean(correct_predictions) + + def create_optimiser(self): + with tf.name_scope('optimizer'): + self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step) + + def weight_variable(self, shape, name='', dtype=tf.float32): + initial = tf.truncated_normal(shape, stddev=0.1) + return tf.Variable(initial, name=name, dtype=dtype) + + def bias_variable(self, shape, name='', dtype=tf.float32): + initial = tf.constant(0.1, shape=shape) + return tf.Variable(initial, name=name, dtype=dtype) + + def fit(self): + data_indices = np.arange(self.n_inputs) + + with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + for i in range(self.epochs): + for j in range(self.iterations): + chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False) + batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints] + + sess.run([CNN.loss, CNN.optimizer], + feed_dict={CNN.X: batch_X, + CNN.Y: batch_Y}) + accuracy = sess.run(CNN.accuracy, + feed_dict={CNN.X: batch_X, + CNN.Y: batch_Y}) + step = sess.run(CNN.global_step) + + self.train_loss, self.train_accuracy = sess.run([CNN.loss, CNN.accuracy], + feed_dict={CNN.X: self.X_train, + CNN.Y: self.Y_train}) + + self.test_loss, self.test_accuracy = sess.run([CNN.loss, CNN.accuracy], + feed_dict={CNN.X: self.X_test, + CNN.Y: self.Y_test}) +\end{Verbatim} + +% !split +\subsection*{Train the model} + +We need now to train the model, evaluate it and test its performance on test data, and eventually include hyperparameters. +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +epochs = 100 +batch_size = 100 +n_filters = 10 +n_neurons_connected = 50 +n_categories = 10 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +CNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + CNN = ConvolutionalNeuralNetworkTensorflow(X_train, Y_train, X_test, Y_test, + n_filters=n_filters, n_neurons_connected=n_neurons_connected, + n_categories=n_categories, epochs=epochs, batch_size=batch_size, + eta=eta, lmbd=lmbd) + CNN.fit() + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Test accuracy: %.3f" % CNN.test_accuracy) + print() + + CNN_tf[i][j] = CNN +\end{minted} + +% !split +\subsection*{Visualizing the results} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + CNN = CNN_tf[i][j] + + train_accuracy[i][j] = CNN.train_accuracy + test_accuracy[i][j] = CNN.test_accuracy + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() +\end{minted} + +% !split +\subsection*{Running with Keras} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from keras.models import Sequential +from keras.layers.convolutional import Conv2D +from keras.layers.convolutional import MaxPooling2D +from keras.layers import Flatten +from keras.layers import Dense +from keras.regularizers import l2 +from keras.optimizers import SGD + +def create_convolutional_neural_network_keras(input_shape, receptive_field, + n_filters, n_neurons_connected, n_categories, + eta, lmbd): + model = Sequential() + model.add(Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same', + activation='relu', kernel_regularizer=l2(lmbd))) + model.add(MaxPooling2D(pool_size=(2, 2))) + model.add(Flatten()) + model.add(Dense(n_neurons_connected, activation='relu', kernel_regularizer=l2(lmbd))) + model.add(Dense(n_categories, activation='softmax', kernel_regularizer=l2(lmbd))) + + sgd = SGD(lr=eta) + model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) + + return model + +epochs = 100 +batch_size = 100 +input_shape = X_train.shape[1:4] +receptive_field = 3 +n_filters = 10 +n_neurons_connected = 50 +n_categories = 10 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +\end{minted} + +% !split +\subsection*{Final part} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + CNN = create_convolutional_neural_network_keras(input_shape, receptive_field, + n_filters, n_neurons_connected, n_categories, + eta, lmbd) + CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0) + scores = CNN.evaluate(X_test, Y_test) + + CNN_keras[i][j] = CNN + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Test accuracy: %.3f" % scores[1]) + print() +\end{minted} + +% !split +\subsection*{Final visualization} + +\begin{Verbatim}[numbers=none,fontsize=\fontsize{9pt}{9pt},baselinestretch=0.95] +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + CNN = CNN_keras[i][j] + + train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1] + test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1] + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() +\end{Verbatim} + +% !split +\subsection*{Fun links} + +\begin{enumerate} +\item \href{{https://arxiv.org/abs/1604.07316}}{Self-Driving cars using a convolutional neural network} + +\item \href{{https://deepdreamgenerator.com/}}{Abstract art using convolutional neural networks} +\end{enumerate} + +\noindent + +% ------------------- end of main content --------------- + +\end{document} + diff --git a/doc/src/CNN/cnn-reveal.html b/doc/src/CNN/cnn-reveal.html new file mode 100644 index 000000000..78ea52651 --- /dev/null +++ b/doc/src/CNN/cnn-reveal.html @@ -0,0 +1,984 @@ + + + + + + + +Convolutional Neural Networks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+ + + + + + + + + + + + + + +
+ + + + +

Convolutional Neural Networks

+ +

+ + +

+Morten Hjorth-Jensen [1, 2] +
+ +

 
+ + +

[1] Department of Physics, University of Oslo
+
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University
+
+

 
+

Oct 3, 2019

+
+

+ +

+ © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
+
+ + +
+

Convolutional Neural Networks (recognizing images)

+ +

+Convolutional Neural Networks (CNN) are very similar to ordinary Neural Networks. + +

+They are made up of neurons that have learnable weights and +biases. Each neuron receives some inputs, performs a dot product and +optionally follows it with a non-linearity. The whole network still +expresses a single differentiable score function: from the raw image +pixels on one end to class scores at the other. And they still have a +loss function (for example Softmax) on the last (fully-connected) layer +and all the tips/tricks we developed for learning regular Neural +Networks still apply (back propagation, gradient descent etc etc). + +

+What is the difference? CNN architectures make the explicit assumption that +the inputs are images, which allows us to encode certain properties +into the architecture. These then make the forward function more +efficient to implement and vastly reduce the amount of parameters in +the network. + +

+Here we provide only a superficial overview, for the more interested, we recommend highly the course +IN5400 – Machine Learning for Image Analysis +and the slides of CS231. +

+ + +
+

Regular NNs don’t scale well to full images

+ +

+As an example, consider +an image of size \( 32\times 32\times 3 \) (32 wide, 32 high, 3 color channels), so a +single fully-connected neuron in a first hidden layer of a regular +Neural Network would have \( 32\times 32\times 3 = 3072 \) weights. This amount still +seems manageable, but clearly this fully-connected structure does not +scale to larger images. For example, an image of more respectable +size, say \( 200\times 200\times 3 \), would lead to neurons that have +\( 200\times 200\times 3 = 120,000 \) weights. + +

+We could have +several such neurons, and the parameters would add up quickly! Clearly, +this full connectivity is wasteful and the huge number of parameters +would quickly lead to possible overfitting. + +

+

+
+

Figure 1: A regular 3-layer Neural Network.

+

+
+
+ + +
+

3D volumes of neurons

+ +

+Convolutional Neural Networks take advantage of the fact that the +input consists of images and they constrain the architecture in a more +sensible way. + +

+In particular, unlike a regular Neural Network, the +layers of a CNN have neurons arranged in 3 dimensions: width, +height, depth. (Note that the word depth here refers to the third +dimension of an activation volume, not to the depth of a full Neural +Network, which can refer to the total number of layers in a network.) + +

+To understand it better, the above example of an image +with an input volume of +activations has dimensions \( 32\times 32\times 3 \) (width, height, +depth respectively). + +

+The neurons in a layer will +only be connected to a small region of the layer before it, instead of +all of the neurons in a fully-connected manner. Moreover, the final +output layer could for this specific image have dimensions \( 1\times 1 \times 10 \), +because by the +end of the CNN architecture we will reduce the full image into a +single vector of class scores, arranged along the depth +dimension. + +

+

+
+

Figure 2: A CNN arranges its neurons in three dimensions (width, height, depth), as visualized in one of the layers. Every layer of a CNN transforms the 3D input volume to a 3D output volume of neuron activations. In this example, the red input layer holds the image, so its width and height would be the dimensions of the image, and the depth would be 3 (Red, Green, Blue channels).

+

+
+
+ + +
+

Layers used to build CNNs

+ +

+A simple CNN is a sequence of layers, and every layer of a CNN +transforms one volume of activations to another through a +differentiable function. We use three main types of layers to build +CNN architectures: Convolutional Layer, Pooling Layer, and +Fully-Connected Layer (exactly as seen in regular Neural Networks). We +will stack these layers to form a full CNN architecture. + +

+A simple CNN for image classification could have the architecture: + +

    +

  • INPUT (\( 32\times 32 \times 3 \)) will hold the raw pixel values of the image, in this case an image of width 32, height 32, and with three color channels R,G,B.
  • +

  • CONV (convolutional )layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and a small region they are connected to in the input volume. This may result in volume such as \( [32\times 32\times 12] \) if we decided to use 12 filters.
  • +

  • RELU layer will apply an elementwise activation function, such as the \( max(0,x) \) thresholding at zero. This leaves the size of the volume unchanged (\( [32\times 32\times 12] \)).
  • +

  • POOL (pooling) layer will perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as \( [16\times 16\times 12] \).
  • +

  • FC (i.e. fully-connected) layer will compute the class scores, resulting in volume of size \( [1\times 1\times 10] \), where each of the 10 numbers correspond to a class score, such as among the 10 categories of the MNIST images we considered above . As with ordinary Neural Networks and as the name implies, each neuron in this layer will be connected to all the numbers in the previous volume.
  • +
+
+ + +
+

Transforming images

+ +

+CNNs transform the original image layer by layer from the original +pixel values to the final class scores. + +

+Observe that some layers contain +parameters and other don’t. In particular, the CNN layers perform +transformations that are a function of not only the activations in the +input volume, but also of the parameters (the weights and biases of +the neurons). On the other hand, the RELU/POOL layers will implement a +fixed function. The parameters in the CONV/FC layers will be trained +with gradient descent so that the class scores that the CNN computes +are consistent with the labels in the training set for each image. +

+ + +
+

CNNs in brief

+ +

+In summary: + +

    +

  • A CNN architecture is in the simplest case a list of Layers that transform the image volume into an output volume (e.g. holding the class scores)
  • +

  • There are a few distinct types of Layers (e.g. CONV/FC/RELU/POOL are by far the most popular)
  • +

  • Each Layer accepts an input 3D volume and transforms it to an output 3D volume through a differentiable function
  • +

  • Each Layer may or may not have parameters (e.g. CONV/FC do, RELU/POOL don’t)
  • +

  • Each Layer may or may not have additional hyperparameters (e.g. CONV/FC/POOL do, RELU doesn’t)
  • +
+

+ +For more material on convolutional networks, we strongly recommend +the course +IN5400 – Machine Learning for Image Analysis +and the slides of CS231 which is taught at Stanford University (consistently ranked as one of the top computer science programs in the world). Michael Nielsen's book is a must read, in particular chapter 6 which deals with CNNs. +

+ + +
+

CNNs in more detail, building convolutional neural networks in Tensorflow and Keras

+ +

+As discussed above, CNNs are neural networks built from the assumption that the inputs +to the network are 2D images. This is important because the number of features or pixels in images +grows very fast with the image size, and an enormous number of weights and biases are needed in order to build an accurate network. + +

+As before, we still have our input, a hidden layer and an output. What's novel about convolutional networks +are the convolutional and pooling layers stacked in pairs between the input and the hidden layer. +In addition, the data is no longer represented as a 2D feature matrix, instead each input is a number of 2D +matrices, typically 1 for each color dimension (Red, Green, Blue). +

+ + +
+

Setting it up

+ +

+It means that to represent the entire +dataset of images, we require a 4D matrix or tensor. This tensor has the dimensions: + +

 
+$$ +(n_{inputs},\, n_{pixels, width},\, n_{pixels, height},\, depth) . +$$ +

 
+

+ + +
+

The MNIST dataset again

+ +

+The MNIST dataset consists of grayscale images with a pixel size of +\( 28\times 28 \), meaning we require \( 28 \times 28 = 724 \) weights to each +neuron in the first hidden layer. + +

+If we were to analyze images of size \( 128\times 128 \) we would require +\( 128 \times 128 = 16384 \) weights to each neuron. Even worse if we were +dealing with color images, as most images are, we have an image matrix +of size \( 128\times 128 \) for each color dimension (Red, Green, Blue), +meaning 3 times the number of weights \( = 49152 \) are required for every +single neuron in the first hidden layer. +

+ + +
+

Strong correlations

+Images typically have strong local correlations, meaning that a small +part of the image varies little from its neighboring regions. If for +example we have an image of a blue car, we can roughly assume that a +small blue part of the image is surrounded by other blue regions. + +

+Therefore, instead of connecting every single pixel to a neuron in the +first hidden layer, as we have previously done with deep neural +networks, we can instead connect each neuron to a small part of the +image (in all 3 RGB depth dimensions). The size of each small area is +fixed, and known as a receptive. +

+ + +
+

Layers of a CNN

+The layers of a convolutional neural network arrange neurons in 3D: width, height and depth. +The input image is typically a square matrix of depth 3. + +

+A convolution is performed on the image which outputs +a 3D volume of neurons. The weights to the input are arranged in a number of 2D matrices, known as filters. + +

+Each filter slides along the input image, taking the dot product +between each small part of the image and the filter, in all depth +dimensions. This is then passed through a non-linear function, +typically the Rectified Linear (ReLu) function, which serves as the +activation of the neurons in the first convolutional layer. This is +further passed through a pooling layer, which reduces the size of the +convolutional layer, e.g. by taking the maximum or average across some +small regions, and this serves as input to the next convolutional +layer. +

+ + +
+

Systematic reduction

+ +

+By systematically reducing the size of the input volume, through +convolution and pooling, the network should create representations of +small parts of the input, and then from them assemble representations +of larger areas. The final pooling layer is flattened to serve as +input to a hidden layer, such that each neuron in the final pooling +layer is connected to every single neuron in the hidden layer. This +then serves as input to the output layer, e.g. a softmax output for +classification. +

+ + +
+

Prerequisites: Collect and pre-process data

+

+ + +

# import necessary packages
+import numpy as np
+import matplotlib.pyplot as plt
+from sklearn import datasets
+
+
+# ensure the same random numbers appear every time
+np.random.seed(0)
+
+# display images in notebook
+%matplotlib inline
+plt.rcParams['figure.figsize'] = (12,12)
+
+
+# download MNIST dataset
+digits = datasets.load_digits()
+
+# define inputs and labels
+inputs = digits.images
+labels = digits.target
+
+# RGB images have a depth of 3
+# our images are grayscale so they should have a depth of 1
+inputs = inputs[:,:,:,np.newaxis]
+
+print("inputs = (n_inputs, pixel_width, pixel_height, depth) = " + str(inputs.shape))
+print("labels = (n_inputs) = " + str(labels.shape))
+
+
+# choose some random images to display
+n_inputs = len(inputs)
+indices = np.arange(n_inputs)
+random_indices = np.random.choice(indices, size=5)
+
+for i, image in enumerate(digits.images[random_indices]):
+    plt.subplot(1, 5, i+1)
+    plt.axis('off')
+    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
+    plt.title("Label: %d" % digits.target[random_indices[i]])
+plt.show()
+
+
+ + +
+

Importing Keras and Tensorflow

+

+ + +

from keras.utils import to_categorical
+from sklearn.model_selection import train_test_split
+
+# representation of labels
+labels = to_categorical(labels)
+
+# split into train and test data
+# one-liner from scikit-learn library
+train_size = 0.8
+test_size = 1 - train_size
+X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,
+                                                    test_size=test_size)
+
+
+ + +
+

Using TensorFlow backend

+ +

+We need to define model and architecture and choose cost function and optmizer. +

+ + +

import tensorflow as tf
+
+class ConvolutionalNeuralNetworkTensorflow:
+    def __init__(
+            self,
+            X_train,
+            Y_train,
+            X_test,
+            Y_test,
+            n_filters=10,
+            n_neurons_connected=50,
+            n_categories=10,
+            receptive_field=3,
+            stride=1,
+            padding=1,
+            epochs=10,
+            batch_size=100,
+            eta=0.1,
+            lmbd=0.0):
+        
+        self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step')
+        
+        self.X_train = X_train
+        self.Y_train = Y_train
+        self.X_test = X_test
+        self.Y_test = Y_test
+        
+        self.n_inputs, self.input_width, self.input_height, self.depth = X_train.shape
+        
+        self.n_filters = n_filters
+        self.n_downsampled = int(self.input_width*self.input_height*n_filters / 4)
+        self.n_neurons_connected = n_neurons_connected
+        self.n_categories = n_categories
+        
+        self.receptive_field = receptive_field
+        self.stride = stride
+        self.strides = [stride, stride, stride, stride]
+        self.padding = padding
+        
+        self.epochs = epochs
+        self.batch_size = batch_size
+        self.iterations = self.n_inputs // self.batch_size
+        self.eta = eta
+        self.lmbd = lmbd
+        
+        self.create_placeholders()
+        self.create_CNN()
+        self.create_loss()
+        self.create_optimiser()
+        self.create_accuracy()
+    
+    def create_placeholders(self):
+        with tf.name_scope('data'):
+            self.X = tf.placeholder(tf.float32, shape=(None, self.input_width, self.input_height, self.depth), name='X_data')
+            self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data')
+    
+    def create_CNN(self):
+        with tf.name_scope('CNN'):
+            
+            # Convolutional layer
+            self.W_conv = self.weight_variable([self.receptive_field, self.receptive_field, self.depth, self.n_filters], name='conv', dtype=tf.float32)
+            b_conv = self.weight_variable([self.n_filters], name='conv', dtype=tf.float32)
+            z_conv = tf.nn.conv2d(self.X, self.W_conv, self.strides, padding='SAME', name='conv') + b_conv
+            a_conv = tf.nn.relu(z_conv)
+            
+            # 2x2 max pooling
+            a_pool = tf.nn.max_pool(a_conv, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME', name='pool')
+            
+            # Fully connected layer
+            a_pool_flat = tf.reshape(a_pool, [-1, self.n_downsampled])
+            self.W_fc = self.weight_variable([self.n_downsampled, self.n_neurons_connected], name='fc', dtype=tf.float32)
+            b_fc = self.bias_variable([self.n_neurons_connected], name='fc', dtype=tf.float32)
+            a_fc = tf.nn.relu(tf.matmul(a_pool_flat, self.W_fc) + b_fc)
+            
+            # Output layer
+            self.W_out = self.weight_variable([self.n_neurons_connected, self.n_categories], name='out', dtype=tf.float32)
+            b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32)
+            self.z_out = tf.matmul(a_fc, self.W_out) + b_out
+    
+    def create_loss(self):
+        with tf.name_scope('loss'):
+            softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out))
+            
+            regularizer_loss_conv = tf.nn.l2_loss(self.W_conv)
+            regularizer_loss_fc = tf.nn.l2_loss(self.W_fc)
+            regularizer_loss_out = tf.nn.l2_loss(self.W_out)
+            regularizer_loss = self.lmbd*(regularizer_loss_conv + regularizer_loss_fc + regularizer_loss_out)
+            
+            self.loss = softmax_loss + regularizer_loss
+
+    def create_accuracy(self):
+        with tf.name_scope('accuracy'):
+            probabilities = tf.nn.softmax(self.z_out)
+            predictions = tf.argmax(probabilities, 1)
+            labels = tf.argmax(self.Y, 1)
+            
+            correct_predictions = tf.equal(predictions, labels)
+            correct_predictions = tf.cast(correct_predictions, tf.float32)
+            self.accuracy = tf.reduce_mean(correct_predictions)
+    
+    def create_optimiser(self):
+        with tf.name_scope('optimizer'):
+            self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step)
+            
+    def weight_variable(self, shape, name='', dtype=tf.float32):
+        initial = tf.truncated_normal(shape, stddev=0.1)
+        return tf.Variable(initial, name=name, dtype=dtype)
+    
+    def bias_variable(self, shape, name='', dtype=tf.float32):
+        initial = tf.constant(0.1, shape=shape)
+        return tf.Variable(initial, name=name, dtype=dtype)
+
+    def fit(self):
+        data_indices = np.arange(self.n_inputs)
+
+        with tf.Session() as sess:
+            sess.run(tf.global_variables_initializer())
+            for i in range(self.epochs):
+                for j in range(self.iterations):
+                    chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False)
+                    batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints]
+            
+                    sess.run([CNN.loss, CNN.optimizer],
+                        feed_dict={CNN.X: batch_X,
+                                   CNN.Y: batch_Y})
+                    accuracy = sess.run(CNN.accuracy,
+                        feed_dict={CNN.X: batch_X,
+                                   CNN.Y: batch_Y})
+                    step = sess.run(CNN.global_step)
+    
+            self.train_loss, self.train_accuracy = sess.run([CNN.loss, CNN.accuracy],
+                feed_dict={CNN.X: self.X_train,
+                           CNN.Y: self.Y_train})
+        
+            self.test_loss, self.test_accuracy = sess.run([CNN.loss, CNN.accuracy],
+                feed_dict={CNN.X: self.X_test,
+                           CNN.Y: self.Y_test})
+
+
+ + +
+

Train the model

+ +

+We need now to train the model, evaluate it and test its performance on test data, and eventually include hyperparameters. +

+ + +

epochs = 100
+batch_size = 100
+n_filters = 10
+n_neurons_connected = 50
+n_categories = 10
+
+eta_vals = np.logspace(-5, 1, 7)
+lmbd_vals = np.logspace(-5, 1, 7)
+CNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
+        
+for i, eta in enumerate(eta_vals):
+    for j, lmbd in enumerate(lmbd_vals):
+        CNN = ConvolutionalNeuralNetworkTensorflow(X_train, Y_train, X_test, Y_test,
+                                      n_filters=n_filters, n_neurons_connected=n_neurons_connected,
+                                      n_categories=n_categories, epochs=epochs, batch_size=batch_size,
+                                      eta=eta, lmbd=lmbd)
+        CNN.fit()
+        
+        print("Learning rate = ", eta)
+        print("Lambda = ", lmbd)
+        print("Test accuracy: %.3f" % CNN.test_accuracy)
+        print()
+            
+        CNN_tf[i][j] = CNN
+
+
+ + +
+

Visualizing the results

+ +

+ + +

# visual representation of grid search
+# uses seaborn heatmap, could probably do this in matplotlib
+import seaborn as sns
+
+sns.set()
+
+train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+
+for i in range(len(eta_vals)):
+    for j in range(len(lmbd_vals)):
+        CNN = CNN_tf[i][j]
+
+        train_accuracy[i][j] = CNN.train_accuracy
+        test_accuracy[i][j] = CNN.test_accuracy
+
+        
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Training Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Test Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+
+ + +
+

Running with Keras

+ +

+ + +

from keras.models import Sequential
+from keras.layers.convolutional import Conv2D
+from keras.layers.convolutional import MaxPooling2D
+from keras.layers import Flatten
+from keras.layers import Dense
+from keras.regularizers import l2
+from keras.optimizers import SGD
+
+def create_convolutional_neural_network_keras(input_shape, receptive_field,
+                                              n_filters, n_neurons_connected, n_categories,
+                                              eta, lmbd):
+    model = Sequential()
+    model.add(Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same',
+              activation='relu', kernel_regularizer=l2(lmbd)))
+    model.add(MaxPooling2D(pool_size=(2, 2)))
+    model.add(Flatten())
+    model.add(Dense(n_neurons_connected, activation='relu', kernel_regularizer=l2(lmbd)))
+    model.add(Dense(n_categories, activation='softmax', kernel_regularizer=l2(lmbd)))
+    
+    sgd = SGD(lr=eta)
+    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
+    
+    return model
+
+epochs = 100
+batch_size = 100
+input_shape = X_train.shape[1:4]
+receptive_field = 3
+n_filters = 10
+n_neurons_connected = 50
+n_categories = 10
+
+eta_vals = np.logspace(-5, 1, 7)
+lmbd_vals = np.logspace(-5, 1, 7)
+
+
+ + +
+

Final part

+ +

+ + +

CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
+        
+for i, eta in enumerate(eta_vals):
+    for j, lmbd in enumerate(lmbd_vals):
+        CNN = create_convolutional_neural_network_keras(input_shape, receptive_field,
+                                              n_filters, n_neurons_connected, n_categories,
+                                              eta, lmbd)
+        CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0)
+        scores = CNN.evaluate(X_test, Y_test)
+        
+        CNN_keras[i][j] = CNN
+        
+        print("Learning rate = ", eta)
+        print("Lambda = ", lmbd)
+        print("Test accuracy: %.3f" % scores[1])
+        print()
+
+
+ + +
+

Final visualization

+ +

+ + +

# visual representation of grid search
+# uses seaborn heatmap, could probably do this in matplotlib
+import seaborn as sns
+
+sns.set()
+
+train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+
+for i in range(len(eta_vals)):
+    for j in range(len(lmbd_vals)):
+        CNN = CNN_keras[i][j]
+
+        train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1]
+        test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1]
+
+        
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Training Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Test Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+
+ + +
+

Fun links

+ +
    +

  1. Self-Driving cars using a convolutional neural network
  2. +

  3. Abstract art using convolutional neural networks
  4. +
+
+ + + +
+
+ + + + + + + + + + + + diff --git a/doc/src/CNN/cnn-solarized.html b/doc/src/CNN/cnn-solarized.html new file mode 100644 index 000000000..4979fb1bb --- /dev/null +++ b/doc/src/CNN/cnn-solarized.html @@ -0,0 +1,794 @@ + + + + + + + + +Convolutional Neural Networks + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Convolutional Neural Networks

+ +

+ + +

+Morten Hjorth-Jensen [1, 2] +
+ +

+ + +

[1] Department of Physics, University of Oslo
+
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University
+
+

+

Oct 3, 2019

+
+

+









+ +

Convolutional Neural Networks (recognizing images)

+ +

+Convolutional Neural Networks (CNN) are very similar to ordinary Neural Networks. + +

+They are made up of neurons that have learnable weights and +biases. Each neuron receives some inputs, performs a dot product and +optionally follows it with a non-linearity. The whole network still +expresses a single differentiable score function: from the raw image +pixels on one end to class scores at the other. And they still have a +loss function (for example Softmax) on the last (fully-connected) layer +and all the tips/tricks we developed for learning regular Neural +Networks still apply (back propagation, gradient descent etc etc). + +

+What is the difference? CNN architectures make the explicit assumption that +the inputs are images, which allows us to encode certain properties +into the architecture. These then make the forward function more +efficient to implement and vastly reduce the amount of parameters in +the network. + +

+Here we provide only a superficial overview, for the more interested, we recommend highly the course +IN5400 – Machine Learning for Image Analysis +and the slides of CS231. + +

+









+ +

Regular NNs don’t scale well to full images

+ +

+As an example, consider +an image of size \( 32\times 32\times 3 \) (32 wide, 32 high, 3 color channels), so a +single fully-connected neuron in a first hidden layer of a regular +Neural Network would have \( 32\times 32\times 3 = 3072 \) weights. This amount still +seems manageable, but clearly this fully-connected structure does not +scale to larger images. For example, an image of more respectable +size, say \( 200\times 200\times 3 \), would lead to neurons that have +\( 200\times 200\times 3 = 120,000 \) weights. + +

+We could have +several such neurons, and the parameters would add up quickly! Clearly, +this full connectivity is wasteful and the huge number of parameters +would quickly lead to possible overfitting. + +

+

+
+

Figure 1: A regular 3-layer Neural Network.

+

+
+ +

+









+ +

3D volumes of neurons

+ +

+Convolutional Neural Networks take advantage of the fact that the +input consists of images and they constrain the architecture in a more +sensible way. + +

+In particular, unlike a regular Neural Network, the +layers of a CNN have neurons arranged in 3 dimensions: width, +height, depth. (Note that the word depth here refers to the third +dimension of an activation volume, not to the depth of a full Neural +Network, which can refer to the total number of layers in a network.) + +

+To understand it better, the above example of an image +with an input volume of +activations has dimensions \( 32\times 32\times 3 \) (width, height, +depth respectively). + +

+The neurons in a layer will +only be connected to a small region of the layer before it, instead of +all of the neurons in a fully-connected manner. Moreover, the final +output layer could for this specific image have dimensions \( 1\times 1 \times 10 \), +because by the +end of the CNN architecture we will reduce the full image into a +single vector of class scores, arranged along the depth +dimension. + +

+

+
+

Figure 2: A CNN arranges its neurons in three dimensions (width, height, depth), as visualized in one of the layers. Every layer of a CNN transforms the 3D input volume to a 3D output volume of neuron activations. In this example, the red input layer holds the image, so its width and height would be the dimensions of the image, and the depth would be 3 (Red, Green, Blue channels).

+

+
+ +

+ + +

Layers used to build CNNs

+ +

+A simple CNN is a sequence of layers, and every layer of a CNN +transforms one volume of activations to another through a +differentiable function. We use three main types of layers to build +CNN architectures: Convolutional Layer, Pooling Layer, and +Fully-Connected Layer (exactly as seen in regular Neural Networks). We +will stack these layers to form a full CNN architecture. + +

+A simple CNN for image classification could have the architecture: + +

    +
  • INPUT (\( 32\times 32 \times 3 \)) will hold the raw pixel values of the image, in this case an image of width 32, height 32, and with three color channels R,G,B.
  • +
  • CONV (convolutional )layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and a small region they are connected to in the input volume. This may result in volume such as \( [32\times 32\times 12] \) if we decided to use 12 filters.
  • +
  • RELU layer will apply an elementwise activation function, such as the \( max(0,x) \) thresholding at zero. This leaves the size of the volume unchanged (\( [32\times 32\times 12] \)).
  • +
  • POOL (pooling) layer will perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as \( [16\times 16\times 12] \).
  • +
  • FC (i.e. fully-connected) layer will compute the class scores, resulting in volume of size \( [1\times 1\times 10] \), where each of the 10 numbers correspond to a class score, such as among the 10 categories of the MNIST images we considered above . As with ordinary Neural Networks and as the name implies, each neuron in this layer will be connected to all the numbers in the previous volume.
  • +
+ +









+ +

Transforming images

+ +

+CNNs transform the original image layer by layer from the original +pixel values to the final class scores. + +

+Observe that some layers contain +parameters and other don’t. In particular, the CNN layers perform +transformations that are a function of not only the activations in the +input volume, but also of the parameters (the weights and biases of +the neurons). On the other hand, the RELU/POOL layers will implement a +fixed function. The parameters in the CONV/FC layers will be trained +with gradient descent so that the class scores that the CNN computes +are consistent with the labels in the training set for each image. + +

+









+ +

CNNs in brief

+ +

+In summary: + +

    +
  • A CNN architecture is in the simplest case a list of Layers that transform the image volume into an output volume (e.g. holding the class scores)
  • +
  • There are a few distinct types of Layers (e.g. CONV/FC/RELU/POOL are by far the most popular)
  • +
  • Each Layer accepts an input 3D volume and transforms it to an output 3D volume through a differentiable function
  • +
  • Each Layer may or may not have parameters (e.g. CONV/FC do, RELU/POOL don’t)
  • +
  • Each Layer may or may not have additional hyperparameters (e.g. CONV/FC/POOL do, RELU doesn’t)
  • +
+ +For more material on convolutional networks, we strongly recommend +the course +IN5400 – Machine Learning for Image Analysis +and the slides of CS231 which is taught at Stanford University (consistently ranked as one of the top computer science programs in the world). Michael Nielsen's book is a must read, in particular chapter 6 which deals with CNNs. + +

+









+ +

CNNs in more detail, building convolutional neural networks in Tensorflow and Keras

+ +

+As discussed above, CNNs are neural networks built from the assumption that the inputs +to the network are 2D images. This is important because the number of features or pixels in images +grows very fast with the image size, and an enormous number of weights and biases are needed in order to build an accurate network. + +

+As before, we still have our input, a hidden layer and an output. What's novel about convolutional networks +are the convolutional and pooling layers stacked in pairs between the input and the hidden layer. +In addition, the data is no longer represented as a 2D feature matrix, instead each input is a number of 2D +matrices, typically 1 for each color dimension (Red, Green, Blue). + +

+









+ +

Setting it up

+ +

+It means that to represent the entire +dataset of images, we require a 4D matrix or tensor. This tensor has the dimensions: +$$ +(n_{inputs},\, n_{pixels, width},\, n_{pixels, height},\, depth) . +$$ + +

+









+ +

The MNIST dataset again

+ +

+The MNIST dataset consists of grayscale images with a pixel size of +\( 28\times 28 \), meaning we require \( 28 \times 28 = 724 \) weights to each +neuron in the first hidden layer. + +

+If we were to analyze images of size \( 128\times 128 \) we would require +\( 128 \times 128 = 16384 \) weights to each neuron. Even worse if we were +dealing with color images, as most images are, we have an image matrix +of size \( 128\times 128 \) for each color dimension (Red, Green, Blue), +meaning 3 times the number of weights \( = 49152 \) are required for every +single neuron in the first hidden layer. + +

+









+ +

Strong correlations

+Images typically have strong local correlations, meaning that a small +part of the image varies little from its neighboring regions. If for +example we have an image of a blue car, we can roughly assume that a +small blue part of the image is surrounded by other blue regions. + +

+Therefore, instead of connecting every single pixel to a neuron in the +first hidden layer, as we have previously done with deep neural +networks, we can instead connect each neuron to a small part of the +image (in all 3 RGB depth dimensions). The size of each small area is +fixed, and known as a receptive. + +

+ + +

Layers of a CNN

+The layers of a convolutional neural network arrange neurons in 3D: width, height and depth. +The input image is typically a square matrix of depth 3. + +

+A convolution is performed on the image which outputs +a 3D volume of neurons. The weights to the input are arranged in a number of 2D matrices, known as filters. + +

+Each filter slides along the input image, taking the dot product +between each small part of the image and the filter, in all depth +dimensions. This is then passed through a non-linear function, +typically the Rectified Linear (ReLu) function, which serves as the +activation of the neurons in the first convolutional layer. This is +further passed through a pooling layer, which reduces the size of the +convolutional layer, e.g. by taking the maximum or average across some +small regions, and this serves as input to the next convolutional +layer. + +

+









+ +

Systematic reduction

+ +

+By systematically reducing the size of the input volume, through +convolution and pooling, the network should create representations of +small parts of the input, and then from them assemble representations +of larger areas. The final pooling layer is flattened to serve as +input to a hidden layer, such that each neuron in the final pooling +layer is connected to every single neuron in the hidden layer. This +then serves as input to the output layer, e.g. a softmax output for +classification. + +

+









+ +

Prerequisites: Collect and pre-process data

+

+ + +

# import necessary packages
+import numpy as np
+import matplotlib.pyplot as plt
+from sklearn import datasets
+
+
+# ensure the same random numbers appear every time
+np.random.seed(0)
+
+# display images in notebook
+%matplotlib inline
+plt.rcParams['figure.figsize'] = (12,12)
+
+
+# download MNIST dataset
+digits = datasets.load_digits()
+
+# define inputs and labels
+inputs = digits.images
+labels = digits.target
+
+# RGB images have a depth of 3
+# our images are grayscale so they should have a depth of 1
+inputs = inputs[:,:,:,np.newaxis]
+
+print("inputs = (n_inputs, pixel_width, pixel_height, depth) = " + str(inputs.shape))
+print("labels = (n_inputs) = " + str(labels.shape))
+
+
+# choose some random images to display
+n_inputs = len(inputs)
+indices = np.arange(n_inputs)
+random_indices = np.random.choice(indices, size=5)
+
+for i, image in enumerate(digits.images[random_indices]):
+    plt.subplot(1, 5, i+1)
+    plt.axis('off')
+    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
+    plt.title("Label: %d" % digits.target[random_indices[i]])
+plt.show()
+
+

+









+ +

Importing Keras and Tensorflow

+

+ + +

from keras.utils import to_categorical
+from sklearn.model_selection import train_test_split
+
+# representation of labels
+labels = to_categorical(labels)
+
+# split into train and test data
+# one-liner from scikit-learn library
+train_size = 0.8
+test_size = 1 - train_size
+X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,
+                                                    test_size=test_size)
+
+

+









+ +

Using TensorFlow backend

+ +

+We need to define model and architecture and choose cost function and optmizer. +

+ + +

import tensorflow as tf
+
+class ConvolutionalNeuralNetworkTensorflow:
+    def __init__(
+            self,
+            X_train,
+            Y_train,
+            X_test,
+            Y_test,
+            n_filters=10,
+            n_neurons_connected=50,
+            n_categories=10,
+            receptive_field=3,
+            stride=1,
+            padding=1,
+            epochs=10,
+            batch_size=100,
+            eta=0.1,
+            lmbd=0.0):
+        
+        self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step')
+        
+        self.X_train = X_train
+        self.Y_train = Y_train
+        self.X_test = X_test
+        self.Y_test = Y_test
+        
+        self.n_inputs, self.input_width, self.input_height, self.depth = X_train.shape
+        
+        self.n_filters = n_filters
+        self.n_downsampled = int(self.input_width*self.input_height*n_filters / 4)
+        self.n_neurons_connected = n_neurons_connected
+        self.n_categories = n_categories
+        
+        self.receptive_field = receptive_field
+        self.stride = stride
+        self.strides = [stride, stride, stride, stride]
+        self.padding = padding
+        
+        self.epochs = epochs
+        self.batch_size = batch_size
+        self.iterations = self.n_inputs // self.batch_size
+        self.eta = eta
+        self.lmbd = lmbd
+        
+        self.create_placeholders()
+        self.create_CNN()
+        self.create_loss()
+        self.create_optimiser()
+        self.create_accuracy()
+    
+    def create_placeholders(self):
+        with tf.name_scope('data'):
+            self.X = tf.placeholder(tf.float32, shape=(None, self.input_width, self.input_height, self.depth), name='X_data')
+            self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data')
+    
+    def create_CNN(self):
+        with tf.name_scope('CNN'):
+            
+            # Convolutional layer
+            self.W_conv = self.weight_variable([self.receptive_field, self.receptive_field, self.depth, self.n_filters], name='conv', dtype=tf.float32)
+            b_conv = self.weight_variable([self.n_filters], name='conv', dtype=tf.float32)
+            z_conv = tf.nn.conv2d(self.X, self.W_conv, self.strides, padding='SAME', name='conv') + b_conv
+            a_conv = tf.nn.relu(z_conv)
+            
+            # 2x2 max pooling
+            a_pool = tf.nn.max_pool(a_conv, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME', name='pool')
+            
+            # Fully connected layer
+            a_pool_flat = tf.reshape(a_pool, [-1, self.n_downsampled])
+            self.W_fc = self.weight_variable([self.n_downsampled, self.n_neurons_connected], name='fc', dtype=tf.float32)
+            b_fc = self.bias_variable([self.n_neurons_connected], name='fc', dtype=tf.float32)
+            a_fc = tf.nn.relu(tf.matmul(a_pool_flat, self.W_fc) + b_fc)
+            
+            # Output layer
+            self.W_out = self.weight_variable([self.n_neurons_connected, self.n_categories], name='out', dtype=tf.float32)
+            b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32)
+            self.z_out = tf.matmul(a_fc, self.W_out) + b_out
+    
+    def create_loss(self):
+        with tf.name_scope('loss'):
+            softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out))
+            
+            regularizer_loss_conv = tf.nn.l2_loss(self.W_conv)
+            regularizer_loss_fc = tf.nn.l2_loss(self.W_fc)
+            regularizer_loss_out = tf.nn.l2_loss(self.W_out)
+            regularizer_loss = self.lmbd*(regularizer_loss_conv + regularizer_loss_fc + regularizer_loss_out)
+            
+            self.loss = softmax_loss + regularizer_loss
+
+    def create_accuracy(self):
+        with tf.name_scope('accuracy'):
+            probabilities = tf.nn.softmax(self.z_out)
+            predictions = tf.argmax(probabilities, 1)
+            labels = tf.argmax(self.Y, 1)
+            
+            correct_predictions = tf.equal(predictions, labels)
+            correct_predictions = tf.cast(correct_predictions, tf.float32)
+            self.accuracy = tf.reduce_mean(correct_predictions)
+    
+    def create_optimiser(self):
+        with tf.name_scope('optimizer'):
+            self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step)
+            
+    def weight_variable(self, shape, name='', dtype=tf.float32):
+        initial = tf.truncated_normal(shape, stddev=0.1)
+        return tf.Variable(initial, name=name, dtype=dtype)
+    
+    def bias_variable(self, shape, name='', dtype=tf.float32):
+        initial = tf.constant(0.1, shape=shape)
+        return tf.Variable(initial, name=name, dtype=dtype)
+
+    def fit(self):
+        data_indices = np.arange(self.n_inputs)
+
+        with tf.Session() as sess:
+            sess.run(tf.global_variables_initializer())
+            for i in range(self.epochs):
+                for j in range(self.iterations):
+                    chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False)
+                    batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints]
+            
+                    sess.run([CNN.loss, CNN.optimizer],
+                        feed_dict={CNN.X: batch_X,
+                                   CNN.Y: batch_Y})
+                    accuracy = sess.run(CNN.accuracy,
+                        feed_dict={CNN.X: batch_X,
+                                   CNN.Y: batch_Y})
+                    step = sess.run(CNN.global_step)
+    
+            self.train_loss, self.train_accuracy = sess.run([CNN.loss, CNN.accuracy],
+                feed_dict={CNN.X: self.X_train,
+                           CNN.Y: self.Y_train})
+        
+            self.test_loss, self.test_accuracy = sess.run([CNN.loss, CNN.accuracy],
+                feed_dict={CNN.X: self.X_test,
+                           CNN.Y: self.Y_test})
+
+

+









+ +

Train the model

+ +

+We need now to train the model, evaluate it and test its performance on test data, and eventually include hyperparameters. +

+ + +

epochs = 100
+batch_size = 100
+n_filters = 10
+n_neurons_connected = 50
+n_categories = 10
+
+eta_vals = np.logspace(-5, 1, 7)
+lmbd_vals = np.logspace(-5, 1, 7)
+CNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
+        
+for i, eta in enumerate(eta_vals):
+    for j, lmbd in enumerate(lmbd_vals):
+        CNN = ConvolutionalNeuralNetworkTensorflow(X_train, Y_train, X_test, Y_test,
+                                      n_filters=n_filters, n_neurons_connected=n_neurons_connected,
+                                      n_categories=n_categories, epochs=epochs, batch_size=batch_size,
+                                      eta=eta, lmbd=lmbd)
+        CNN.fit()
+        
+        print("Learning rate = ", eta)
+        print("Lambda = ", lmbd)
+        print("Test accuracy: %.3f" % CNN.test_accuracy)
+        print()
+            
+        CNN_tf[i][j] = CNN
+
+

+









+ +

Visualizing the results

+ +

+ + +

# visual representation of grid search
+# uses seaborn heatmap, could probably do this in matplotlib
+import seaborn as sns
+
+sns.set()
+
+train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+
+for i in range(len(eta_vals)):
+    for j in range(len(lmbd_vals)):
+        CNN = CNN_tf[i][j]
+
+        train_accuracy[i][j] = CNN.train_accuracy
+        test_accuracy[i][j] = CNN.test_accuracy
+
+        
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Training Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Test Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+

+ + +

Running with Keras

+ +

+ + +

from keras.models import Sequential
+from keras.layers.convolutional import Conv2D
+from keras.layers.convolutional import MaxPooling2D
+from keras.layers import Flatten
+from keras.layers import Dense
+from keras.regularizers import l2
+from keras.optimizers import SGD
+
+def create_convolutional_neural_network_keras(input_shape, receptive_field,
+                                              n_filters, n_neurons_connected, n_categories,
+                                              eta, lmbd):
+    model = Sequential()
+    model.add(Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same',
+              activation='relu', kernel_regularizer=l2(lmbd)))
+    model.add(MaxPooling2D(pool_size=(2, 2)))
+    model.add(Flatten())
+    model.add(Dense(n_neurons_connected, activation='relu', kernel_regularizer=l2(lmbd)))
+    model.add(Dense(n_categories, activation='softmax', kernel_regularizer=l2(lmbd)))
+    
+    sgd = SGD(lr=eta)
+    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
+    
+    return model
+
+epochs = 100
+batch_size = 100
+input_shape = X_train.shape[1:4]
+receptive_field = 3
+n_filters = 10
+n_neurons_connected = 50
+n_categories = 10
+
+eta_vals = np.logspace(-5, 1, 7)
+lmbd_vals = np.logspace(-5, 1, 7)
+
+

+









+ +

Final part

+ +

+ + +

CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
+        
+for i, eta in enumerate(eta_vals):
+    for j, lmbd in enumerate(lmbd_vals):
+        CNN = create_convolutional_neural_network_keras(input_shape, receptive_field,
+                                              n_filters, n_neurons_connected, n_categories,
+                                              eta, lmbd)
+        CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0)
+        scores = CNN.evaluate(X_test, Y_test)
+        
+        CNN_keras[i][j] = CNN
+        
+        print("Learning rate = ", eta)
+        print("Lambda = ", lmbd)
+        print("Test accuracy: %.3f" % scores[1])
+        print()
+
+

+









+ +

Final visualization

+ +

+ + +

# visual representation of grid search
+# uses seaborn heatmap, could probably do this in matplotlib
+import seaborn as sns
+
+sns.set()
+
+train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+
+for i in range(len(eta_vals)):
+    for j in range(len(lmbd_vals)):
+        CNN = CNN_keras[i][j]
+
+        train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1]
+        test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1]
+
+        
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Training Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Test Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+

+









+ +

Fun links

+ +
    +
  1. Self-Driving cars using a convolutional neural network
  2. +
  3. Abstract art using convolutional neural networks
  4. +
+ + + + + +
+ © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
+ + + + + + diff --git a/doc/src/CNN/cnn.do.txt b/doc/src/CNN/cnn.do.txt new file mode 100644 index 000000000..e20014726 --- /dev/null +++ b/doc/src/CNN/cnn.do.txt @@ -0,0 +1,600 @@ +TITLE: Convolutional Neural Networks +AUTHOR: Morten Hjorth-Jensen {copyright, 1999-present|CC BY-NC} at Department of Physics, University of Oslo & Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University +DATE: today + + + +!split +===== Convolutional Neural Networks (recognizing images) ===== + +Convolutional Neural Networks (CNN) are very similar to ordinary Neural Networks. + +They are made up of neurons that have learnable weights and +biases. Each neuron receives some inputs, performs a dot product and +optionally follows it with a non-linearity. The whole network still +expresses a single differentiable score function: from the raw image +pixels on one end to class scores at the other. And they still have a +loss function (for example Softmax) on the last (fully-connected) layer +and all the tips/tricks we developed for learning regular Neural +Networks still apply (back propagation, gradient descent etc etc). + +What is the difference? _CNN architectures make the explicit assumption that +the inputs are images, which allows us to encode certain properties +into the architecture. These then make the forward function more +efficient to implement and vastly reduce the amount of parameters in +the network._ + +Here we provide only a superficial overview, for the more interested, we recommend highly the course +"IN5400 – Machine Learning for Image Analysis":"https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html" +and the slides of "CS231":"http://cs231n.github.io/convolutional-networks/". + +!split +===== Regular NNs don’t scale well to full images ===== + +As an example, consider +an image of size $32\times 32\times 3$ (32 wide, 32 high, 3 color channels), so a +single fully-connected neuron in a first hidden layer of a regular +Neural Network would have $32\times 32\times 3 = 3072$ weights. This amount still +seems manageable, but clearly this fully-connected structure does not +scale to larger images. For example, an image of more respectable +size, say $200\times 200\times 3$, would lead to neurons that have +$200\times 200\times 3 = 120,000$ weights. + +We could have +several such neurons, and the parameters would add up quickly! Clearly, +this full connectivity is wasteful and the huge number of parameters +would quickly lead to possible overfitting. + +FIGURE: [figslides/nn.jpeg, width=500 frac=0.6] A regular 3-layer Neural Network. + +!split +===== 3D volumes of neurons ===== + +Convolutional Neural Networks take advantage of the fact that the +input consists of images and they constrain the architecture in a more +sensible way. + +In particular, unlike a regular Neural Network, the +layers of a CNN have neurons arranged in 3 dimensions: width, +height, depth. (Note that the word depth here refers to the third +dimension of an activation volume, not to the depth of a full Neural +Network, which can refer to the total number of layers in a network.) + +To understand it better, the above example of an image +with an input volume of +activations has dimensions $32\times 32\times 3$ (width, height, +depth respectively). + +The neurons in a layer will +only be connected to a small region of the layer before it, instead of +all of the neurons in a fully-connected manner. Moreover, the final +output layer could for this specific image have dimensions $1\times 1 \times 10$, +because by the +end of the CNN architecture we will reduce the full image into a +single vector of class scores, arranged along the depth +dimension. + +FIGURE: [figslides/cnn.jpeg, width=500 frac=0.6] A CNN arranges its neurons in three dimensions (width, height, depth), as visualized in one of the layers. Every layer of a CNN transforms the 3D input volume to a 3D output volume of neuron activations. In this example, the red input layer holds the image, so its width and height would be the dimensions of the image, and the depth would be 3 (Red, Green, Blue channels). + + + +!split +===== Layers used to build CNNs ===== + + +A simple CNN is a sequence of layers, and every layer of a CNN +transforms one volume of activations to another through a +differentiable function. We use three main types of layers to build +CNN architectures: Convolutional Layer, Pooling Layer, and +Fully-Connected Layer (exactly as seen in regular Neural Networks). We +will stack these layers to form a full CNN architecture. + +A simple CNN for image classification could have the architecture: + +* _INPUT_ ($32\times 32 \times 3$) will hold the raw pixel values of the image, in this case an image of width 32, height 32, and with three color channels R,G,B. +* _CONV_ (convolutional )layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and a small region they are connected to in the input volume. This may result in volume such as $[32\times 32\times 12]$ if we decided to use 12 filters. +* _RELU_ layer will apply an elementwise activation function, such as the $max(0,x)$ thresholding at zero. This leaves the size of the volume unchanged ($[32\times 32\times 12]$). +* _POOL_ (pooling) layer will perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as $[16\times 16\times 12]$. +* _FC_ (i.e. fully-connected) layer will compute the class scores, resulting in volume of size $[1\times 1\times 10]$, where each of the 10 numbers correspond to a class score, such as among the 10 categories of the MNIST images we considered above . As with ordinary Neural Networks and as the name implies, each neuron in this layer will be connected to all the numbers in the previous volume. + + +!split +===== Transforming images ===== + +CNNs transform the original image layer by layer from the original +pixel values to the final class scores. + +Observe that some layers contain +parameters and other don’t. In particular, the CNN layers perform +transformations that are a function of not only the activations in the +input volume, but also of the parameters (the weights and biases of +the neurons). On the other hand, the RELU/POOL layers will implement a +fixed function. The parameters in the CONV/FC layers will be trained +with gradient descent so that the class scores that the CNN computes +are consistent with the labels in the training set for each image. + + +!split +===== CNNs in brief ===== + +In summary: + +* A CNN architecture is in the simplest case a list of Layers that transform the image volume into an output volume (e.g. holding the class scores) +* There are a few distinct types of Layers (e.g. CONV/FC/RELU/POOL are by far the most popular) +* Each Layer accepts an input 3D volume and transforms it to an output 3D volume through a differentiable function +* Each Layer may or may not have parameters (e.g. CONV/FC do, RELU/POOL don’t) +* Each Layer may or may not have additional hyperparameters (e.g. CONV/FC/POOL do, RELU doesn’t) + +For more material on convolutional networks, we strongly recommend +the course +"IN5400 – Machine Learning for Image Analysis":"https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html" +and the slides of "CS231":"http://cs231n.github.io/convolutional-networks/" which is taught at Stanford University (consistently ranked as one of the top computer science programs in the world). "Michael Nielsen's book is a must read, in particular chapter 6 which deals with CNNs":"http://neuralnetworksanddeeplearning.com/chap6.html". + + +!split +===== CNNs in more detail, building convolutional neural networks in Tensorflow and Keras ===== + + +As discussed above, CNNs are neural networks built from the assumption that the inputs +to the network are 2D images. This is important because the number of features or pixels in images +grows very fast with the image size, and an enormous number of weights and biases are needed in order to build an accurate network. + +As before, we still have our input, a hidden layer and an output. What's novel about convolutional networks +are the _convolutional_ and _pooling_ layers stacked in pairs between the input and the hidden layer. +In addition, the data is no longer represented as a 2D feature matrix, instead each input is a number of 2D +matrices, typically 1 for each color dimension (Red, Green, Blue). + + +!split +===== Setting it up ===== + +It means that to represent the entire +dataset of images, we require a 4D matrix or _tensor_. This tensor has the dimensions: +!bt +\[ +(n_{inputs},\, n_{pixels, width},\, n_{pixels, height},\, depth) . +\] +!et + +!split +===== The MNIST dataset again ===== + +The MNIST dataset consists of grayscale images with a pixel size of +$28\times 28$, meaning we require $28 \times 28 = 724$ weights to each +neuron in the first hidden layer. + +If we were to analyze images of size $128\times 128$ we would require +$128 \times 128 = 16384$ weights to each neuron. Even worse if we were +dealing with color images, as most images are, we have an image matrix +of size $128\times 128$ for each color dimension (Red, Green, Blue), +meaning 3 times the number of weights $= 49152$ are required for every +single neuron in the first hidden layer. + + +!split +===== Strong correlations ===== +Images typically have strong local correlations, meaning that a small +part of the image varies little from its neighboring regions. If for +example we have an image of a blue car, we can roughly assume that a +small blue part of the image is surrounded by other blue regions. + +Therefore, instead of connecting every single pixel to a neuron in the +first hidden layer, as we have previously done with deep neural +networks, we can instead connect each neuron to a small part of the +image (in all 3 RGB depth dimensions). The size of each small area is +fixed, and known as a "receptive":"https://en.wikipedia.org/wiki/Receptive_field". + + +!split +===== Layers of a CNN ===== +The layers of a convolutional neural network arrange neurons in 3D: width, height and depth. +The input image is typically a square matrix of depth 3. + +A _convolution_ is performed on the image which outputs +a 3D volume of neurons. The weights to the input are arranged in a number of 2D matrices, known as _filters_. + + +Each filter slides along the input image, taking the dot product +between each small part of the image and the filter, in all depth +dimensions. This is then passed through a non-linear function, +typically the _Rectified Linear (ReLu)_ function, which serves as the +activation of the neurons in the first convolutional layer. This is +further passed through a _pooling layer_, which reduces the size of the +convolutional layer, e.g. by taking the maximum or average across some +small regions, and this serves as input to the next convolutional +layer. + + +!split +===== Systematic reduction ===== + +By systematically reducing the size of the input volume, through +convolution and pooling, the network should create representations of +small parts of the input, and then from them assemble representations +of larger areas. The final pooling layer is flattened to serve as +input to a hidden layer, such that each neuron in the final pooling +layer is connected to every single neuron in the hidden layer. This +then serves as input to the output layer, e.g. a softmax output for +classification. + + +!split +===== Prerequisites: Collect and pre-process data ===== +!bc pycod +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn import datasets + + +# ensure the same random numbers appear every time +np.random.seed(0) + +# display images in notebook +%matplotlib inline +plt.rcParams['figure.figsize'] = (12,12) + + +# download MNIST dataset +digits = datasets.load_digits() + +# define inputs and labels +inputs = digits.images +labels = digits.target + +# RGB images have a depth of 3 +# our images are grayscale so they should have a depth of 1 +inputs = inputs[:,:,:,np.newaxis] + +print("inputs = (n_inputs, pixel_width, pixel_height, depth) = " + str(inputs.shape)) +print("labels = (n_inputs) = " + str(labels.shape)) + + +# choose some random images to display +n_inputs = len(inputs) +indices = np.arange(n_inputs) +random_indices = np.random.choice(indices, size=5) + +for i, image in enumerate(digits.images[random_indices]): + plt.subplot(1, 5, i+1) + plt.axis('off') + plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') + plt.title("Label: %d" % digits.target[random_indices[i]]) +plt.show() +!ec + + +!split +===== Importing Keras and Tensorflow ===== +!bc pycod +from keras.utils import to_categorical +from sklearn.model_selection import train_test_split + +# representation of labels +labels = to_categorical(labels) + +# split into train and test data +# one-liner from scikit-learn library +train_size = 0.8 +test_size = 1 - train_size +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size, + test_size=test_size) +!ec + +!split +===== Using TensorFlow backend ===== + +We need to define model and architecture and choose cost function and optmizer. +!bc pycid + +import tensorflow as tf + +class ConvolutionalNeuralNetworkTensorflow: + def __init__( + self, + X_train, + Y_train, + X_test, + Y_test, + n_filters=10, + n_neurons_connected=50, + n_categories=10, + receptive_field=3, + stride=1, + padding=1, + epochs=10, + batch_size=100, + eta=0.1, + lmbd=0.0): + + self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step') + + self.X_train = X_train + self.Y_train = Y_train + self.X_test = X_test + self.Y_test = Y_test + + self.n_inputs, self.input_width, self.input_height, self.depth = X_train.shape + + self.n_filters = n_filters + self.n_downsampled = int(self.input_width*self.input_height*n_filters / 4) + self.n_neurons_connected = n_neurons_connected + self.n_categories = n_categories + + self.receptive_field = receptive_field + self.stride = stride + self.strides = [stride, stride, stride, stride] + self.padding = padding + + self.epochs = epochs + self.batch_size = batch_size + self.iterations = self.n_inputs // self.batch_size + self.eta = eta + self.lmbd = lmbd + + self.create_placeholders() + self.create_CNN() + self.create_loss() + self.create_optimiser() + self.create_accuracy() + + def create_placeholders(self): + with tf.name_scope('data'): + self.X = tf.placeholder(tf.float32, shape=(None, self.input_width, self.input_height, self.depth), name='X_data') + self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data') + + def create_CNN(self): + with tf.name_scope('CNN'): + + # Convolutional layer + self.W_conv = self.weight_variable([self.receptive_field, self.receptive_field, self.depth, self.n_filters], name='conv', dtype=tf.float32) + b_conv = self.weight_variable([self.n_filters], name='conv', dtype=tf.float32) + z_conv = tf.nn.conv2d(self.X, self.W_conv, self.strides, padding='SAME', name='conv') + b_conv + a_conv = tf.nn.relu(z_conv) + + # 2x2 max pooling + a_pool = tf.nn.max_pool(a_conv, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME', name='pool') + + # Fully connected layer + a_pool_flat = tf.reshape(a_pool, [-1, self.n_downsampled]) + self.W_fc = self.weight_variable([self.n_downsampled, self.n_neurons_connected], name='fc', dtype=tf.float32) + b_fc = self.bias_variable([self.n_neurons_connected], name='fc', dtype=tf.float32) + a_fc = tf.nn.relu(tf.matmul(a_pool_flat, self.W_fc) + b_fc) + + # Output layer + self.W_out = self.weight_variable([self.n_neurons_connected, self.n_categories], name='out', dtype=tf.float32) + b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32) + self.z_out = tf.matmul(a_fc, self.W_out) + b_out + + def create_loss(self): + with tf.name_scope('loss'): + softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out)) + + regularizer_loss_conv = tf.nn.l2_loss(self.W_conv) + regularizer_loss_fc = tf.nn.l2_loss(self.W_fc) + regularizer_loss_out = tf.nn.l2_loss(self.W_out) + regularizer_loss = self.lmbd*(regularizer_loss_conv + regularizer_loss_fc + regularizer_loss_out) + + self.loss = softmax_loss + regularizer_loss + + def create_accuracy(self): + with tf.name_scope('accuracy'): + probabilities = tf.nn.softmax(self.z_out) + predictions = tf.argmax(probabilities, 1) + labels = tf.argmax(self.Y, 1) + + correct_predictions = tf.equal(predictions, labels) + correct_predictions = tf.cast(correct_predictions, tf.float32) + self.accuracy = tf.reduce_mean(correct_predictions) + + def create_optimiser(self): + with tf.name_scope('optimizer'): + self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step) + + def weight_variable(self, shape, name='', dtype=tf.float32): + initial = tf.truncated_normal(shape, stddev=0.1) + return tf.Variable(initial, name=name, dtype=dtype) + + def bias_variable(self, shape, name='', dtype=tf.float32): + initial = tf.constant(0.1, shape=shape) + return tf.Variable(initial, name=name, dtype=dtype) + + def fit(self): + data_indices = np.arange(self.n_inputs) + + with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + for i in range(self.epochs): + for j in range(self.iterations): + chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False) + batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints] + + sess.run([CNN.loss, CNN.optimizer], + feed_dict={CNN.X: batch_X, + CNN.Y: batch_Y}) + accuracy = sess.run(CNN.accuracy, + feed_dict={CNN.X: batch_X, + CNN.Y: batch_Y}) + step = sess.run(CNN.global_step) + + self.train_loss, self.train_accuracy = sess.run([CNN.loss, CNN.accuracy], + feed_dict={CNN.X: self.X_train, + CNN.Y: self.Y_train}) + + self.test_loss, self.test_accuracy = sess.run([CNN.loss, CNN.accuracy], + feed_dict={CNN.X: self.X_test, + CNN.Y: self.Y_test}) +!ec + +!split +===== Train the model ===== + +We need now to train the model, evaluate it and test its performance on test data, and eventually include hyperparameters. +!bc pycod +epochs = 100 +batch_size = 100 +n_filters = 10 +n_neurons_connected = 50 +n_categories = 10 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +CNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + CNN = ConvolutionalNeuralNetworkTensorflow(X_train, Y_train, X_test, Y_test, + n_filters=n_filters, n_neurons_connected=n_neurons_connected, + n_categories=n_categories, epochs=epochs, batch_size=batch_size, + eta=eta, lmbd=lmbd) + CNN.fit() + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Test accuracy: %.3f" % CNN.test_accuracy) + print() + + CNN_tf[i][j] = CNN +!ec + +!split +===== Visualizing the results ===== + +!bc pycod +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + CNN = CNN_tf[i][j] + + train_accuracy[i][j] = CNN.train_accuracy + test_accuracy[i][j] = CNN.test_accuracy + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() +!ec + +!split +===== Running with Keras ===== + +!bc pycod +from keras.models import Sequential +from keras.layers.convolutional import Conv2D +from keras.layers.convolutional import MaxPooling2D +from keras.layers import Flatten +from keras.layers import Dense +from keras.regularizers import l2 +from keras.optimizers import SGD + +def create_convolutional_neural_network_keras(input_shape, receptive_field, + n_filters, n_neurons_connected, n_categories, + eta, lmbd): + model = Sequential() + model.add(Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same', + activation='relu', kernel_regularizer=l2(lmbd))) + model.add(MaxPooling2D(pool_size=(2, 2))) + model.add(Flatten()) + model.add(Dense(n_neurons_connected, activation='relu', kernel_regularizer=l2(lmbd))) + model.add(Dense(n_categories, activation='softmax', kernel_regularizer=l2(lmbd))) + + sgd = SGD(lr=eta) + model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) + + return model + +epochs = 100 +batch_size = 100 +input_shape = X_train.shape[1:4] +receptive_field = 3 +n_filters = 10 +n_neurons_connected = 50 +n_categories = 10 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +!ec + +!split +===== Final part ===== + +!bc pycod +CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + CNN = create_convolutional_neural_network_keras(input_shape, receptive_field, + n_filters, n_neurons_connected, n_categories, + eta, lmbd) + CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0) + scores = CNN.evaluate(X_test, Y_test) + + CNN_keras[i][j] = CNN + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Test accuracy: %.3f" % scores[1]) + print() +!ec + +!split +===== Final visualization ===== + +!bc +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + CNN = CNN_keras[i][j] + + train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1] + test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1] + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() +!ec + +!split +===== Fun links ===== + +o "Self-Driving cars using a convolutional neural network":"https://arxiv.org/abs/1604.07316" +o "Abstract art using convolutional neural networks":"https://deepdreamgenerator.com/" + + diff --git a/doc/src/CNN/cnn.html b/doc/src/CNN/cnn.html new file mode 100644 index 000000000..176bc3958 --- /dev/null +++ b/doc/src/CNN/cnn.html @@ -0,0 +1,799 @@ + + + + + + + + +Convolutional Neural Networks + + + + + + + + + + + + + + + + + + + + + + + +

Convolutional Neural Networks

+ +

+ + +

+Morten Hjorth-Jensen [1, 2] +
+ +

+ + +

[1] Department of Physics, University of Oslo
+
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University
+
+

+

Oct 3, 2019

+
+

+









+ +

Convolutional Neural Networks (recognizing images)

+ +

+Convolutional Neural Networks (CNN) are very similar to ordinary Neural Networks. + +

+They are made up of neurons that have learnable weights and +biases. Each neuron receives some inputs, performs a dot product and +optionally follows it with a non-linearity. The whole network still +expresses a single differentiable score function: from the raw image +pixels on one end to class scores at the other. And they still have a +loss function (for example Softmax) on the last (fully-connected) layer +and all the tips/tricks we developed for learning regular Neural +Networks still apply (back propagation, gradient descent etc etc). + +

+What is the difference? CNN architectures make the explicit assumption that +the inputs are images, which allows us to encode certain properties +into the architecture. These then make the forward function more +efficient to implement and vastly reduce the amount of parameters in +the network. + +

+Here we provide only a superficial overview, for the more interested, we recommend highly the course +IN5400 – Machine Learning for Image Analysis +and the slides of CS231. + +

+









+ +

Regular NNs don’t scale well to full images

+ +

+As an example, consider +an image of size \( 32\times 32\times 3 \) (32 wide, 32 high, 3 color channels), so a +single fully-connected neuron in a first hidden layer of a regular +Neural Network would have \( 32\times 32\times 3 = 3072 \) weights. This amount still +seems manageable, but clearly this fully-connected structure does not +scale to larger images. For example, an image of more respectable +size, say \( 200\times 200\times 3 \), would lead to neurons that have +\( 200\times 200\times 3 = 120,000 \) weights. + +

+We could have +several such neurons, and the parameters would add up quickly! Clearly, +this full connectivity is wasteful and the huge number of parameters +would quickly lead to possible overfitting. + +

+

+
+

Figure 1: A regular 3-layer Neural Network.

+

+
+ +

+









+ +

3D volumes of neurons

+ +

+Convolutional Neural Networks take advantage of the fact that the +input consists of images and they constrain the architecture in a more +sensible way. + +

+In particular, unlike a regular Neural Network, the +layers of a CNN have neurons arranged in 3 dimensions: width, +height, depth. (Note that the word depth here refers to the third +dimension of an activation volume, not to the depth of a full Neural +Network, which can refer to the total number of layers in a network.) + +

+To understand it better, the above example of an image +with an input volume of +activations has dimensions \( 32\times 32\times 3 \) (width, height, +depth respectively). + +

+The neurons in a layer will +only be connected to a small region of the layer before it, instead of +all of the neurons in a fully-connected manner. Moreover, the final +output layer could for this specific image have dimensions \( 1\times 1 \times 10 \), +because by the +end of the CNN architecture we will reduce the full image into a +single vector of class scores, arranged along the depth +dimension. + +

+

+
+

Figure 2: A CNN arranges its neurons in three dimensions (width, height, depth), as visualized in one of the layers. Every layer of a CNN transforms the 3D input volume to a 3D output volume of neuron activations. In this example, the red input layer holds the image, so its width and height would be the dimensions of the image, and the depth would be 3 (Red, Green, Blue channels).

+

+
+ +

+ + +

Layers used to build CNNs

+ +

+A simple CNN is a sequence of layers, and every layer of a CNN +transforms one volume of activations to another through a +differentiable function. We use three main types of layers to build +CNN architectures: Convolutional Layer, Pooling Layer, and +Fully-Connected Layer (exactly as seen in regular Neural Networks). We +will stack these layers to form a full CNN architecture. + +

+A simple CNN for image classification could have the architecture: + +

    +
  • INPUT (\( 32\times 32 \times 3 \)) will hold the raw pixel values of the image, in this case an image of width 32, height 32, and with three color channels R,G,B.
  • +
  • CONV (convolutional )layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and a small region they are connected to in the input volume. This may result in volume such as \( [32\times 32\times 12] \) if we decided to use 12 filters.
  • +
  • RELU layer will apply an elementwise activation function, such as the \( max(0,x) \) thresholding at zero. This leaves the size of the volume unchanged (\( [32\times 32\times 12] \)).
  • +
  • POOL (pooling) layer will perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as \( [16\times 16\times 12] \).
  • +
  • FC (i.e. fully-connected) layer will compute the class scores, resulting in volume of size \( [1\times 1\times 10] \), where each of the 10 numbers correspond to a class score, such as among the 10 categories of the MNIST images we considered above . As with ordinary Neural Networks and as the name implies, each neuron in this layer will be connected to all the numbers in the previous volume.
  • +
+ +









+ +

Transforming images

+ +

+CNNs transform the original image layer by layer from the original +pixel values to the final class scores. + +

+Observe that some layers contain +parameters and other don’t. In particular, the CNN layers perform +transformations that are a function of not only the activations in the +input volume, but also of the parameters (the weights and biases of +the neurons). On the other hand, the RELU/POOL layers will implement a +fixed function. The parameters in the CONV/FC layers will be trained +with gradient descent so that the class scores that the CNN computes +are consistent with the labels in the training set for each image. + +

+









+ +

CNNs in brief

+ +

+In summary: + +

    +
  • A CNN architecture is in the simplest case a list of Layers that transform the image volume into an output volume (e.g. holding the class scores)
  • +
  • There are a few distinct types of Layers (e.g. CONV/FC/RELU/POOL are by far the most popular)
  • +
  • Each Layer accepts an input 3D volume and transforms it to an output 3D volume through a differentiable function
  • +
  • Each Layer may or may not have parameters (e.g. CONV/FC do, RELU/POOL don’t)
  • +
  • Each Layer may or may not have additional hyperparameters (e.g. CONV/FC/POOL do, RELU doesn’t)
  • +
+ +For more material on convolutional networks, we strongly recommend +the course +IN5400 – Machine Learning for Image Analysis +and the slides of CS231 which is taught at Stanford University (consistently ranked as one of the top computer science programs in the world). Michael Nielsen's book is a must read, in particular chapter 6 which deals with CNNs. + +

+









+ +

CNNs in more detail, building convolutional neural networks in Tensorflow and Keras

+ +

+As discussed above, CNNs are neural networks built from the assumption that the inputs +to the network are 2D images. This is important because the number of features or pixels in images +grows very fast with the image size, and an enormous number of weights and biases are needed in order to build an accurate network. + +

+As before, we still have our input, a hidden layer and an output. What's novel about convolutional networks +are the convolutional and pooling layers stacked in pairs between the input and the hidden layer. +In addition, the data is no longer represented as a 2D feature matrix, instead each input is a number of 2D +matrices, typically 1 for each color dimension (Red, Green, Blue). + +

+









+ +

Setting it up

+ +

+It means that to represent the entire +dataset of images, we require a 4D matrix or tensor. This tensor has the dimensions: +$$ +(n_{inputs},\, n_{pixels, width},\, n_{pixels, height},\, depth) . +$$ + +

+









+ +

The MNIST dataset again

+ +

+The MNIST dataset consists of grayscale images with a pixel size of +\( 28\times 28 \), meaning we require \( 28 \times 28 = 724 \) weights to each +neuron in the first hidden layer. + +

+If we were to analyze images of size \( 128\times 128 \) we would require +\( 128 \times 128 = 16384 \) weights to each neuron. Even worse if we were +dealing with color images, as most images are, we have an image matrix +of size \( 128\times 128 \) for each color dimension (Red, Green, Blue), +meaning 3 times the number of weights \( = 49152 \) are required for every +single neuron in the first hidden layer. + +

+









+ +

Strong correlations

+Images typically have strong local correlations, meaning that a small +part of the image varies little from its neighboring regions. If for +example we have an image of a blue car, we can roughly assume that a +small blue part of the image is surrounded by other blue regions. + +

+Therefore, instead of connecting every single pixel to a neuron in the +first hidden layer, as we have previously done with deep neural +networks, we can instead connect each neuron to a small part of the +image (in all 3 RGB depth dimensions). The size of each small area is +fixed, and known as a receptive. + +

+ + +

Layers of a CNN

+The layers of a convolutional neural network arrange neurons in 3D: width, height and depth. +The input image is typically a square matrix of depth 3. + +

+A convolution is performed on the image which outputs +a 3D volume of neurons. The weights to the input are arranged in a number of 2D matrices, known as filters. + +

+Each filter slides along the input image, taking the dot product +between each small part of the image and the filter, in all depth +dimensions. This is then passed through a non-linear function, +typically the Rectified Linear (ReLu) function, which serves as the +activation of the neurons in the first convolutional layer. This is +further passed through a pooling layer, which reduces the size of the +convolutional layer, e.g. by taking the maximum or average across some +small regions, and this serves as input to the next convolutional +layer. + +

+









+ +

Systematic reduction

+ +

+By systematically reducing the size of the input volume, through +convolution and pooling, the network should create representations of +small parts of the input, and then from them assemble representations +of larger areas. The final pooling layer is flattened to serve as +input to a hidden layer, such that each neuron in the final pooling +layer is connected to every single neuron in the hidden layer. This +then serves as input to the output layer, e.g. a softmax output for +classification. + +

+









+ +

Prerequisites: Collect and pre-process data

+

+ + +

# import necessary packages
+import numpy as np
+import matplotlib.pyplot as plt
+from sklearn import datasets
+
+
+# ensure the same random numbers appear every time
+np.random.seed(0)
+
+# display images in notebook
+%matplotlib inline
+plt.rcParams['figure.figsize'] = (12,12)
+
+
+# download MNIST dataset
+digits = datasets.load_digits()
+
+# define inputs and labels
+inputs = digits.images
+labels = digits.target
+
+# RGB images have a depth of 3
+# our images are grayscale so they should have a depth of 1
+inputs = inputs[:,:,:,np.newaxis]
+
+print("inputs = (n_inputs, pixel_width, pixel_height, depth) = " + str(inputs.shape))
+print("labels = (n_inputs) = " + str(labels.shape))
+
+
+# choose some random images to display
+n_inputs = len(inputs)
+indices = np.arange(n_inputs)
+random_indices = np.random.choice(indices, size=5)
+
+for i, image in enumerate(digits.images[random_indices]):
+    plt.subplot(1, 5, i+1)
+    plt.axis('off')
+    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
+    plt.title("Label: %d" % digits.target[random_indices[i]])
+plt.show()
+
+

+









+ +

Importing Keras and Tensorflow

+

+ + +

from keras.utils import to_categorical
+from sklearn.model_selection import train_test_split
+
+# representation of labels
+labels = to_categorical(labels)
+
+# split into train and test data
+# one-liner from scikit-learn library
+train_size = 0.8
+test_size = 1 - train_size
+X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,
+                                                    test_size=test_size)
+
+

+









+ +

Using TensorFlow backend

+ +

+We need to define model and architecture and choose cost function and optmizer. +

+ + +

import tensorflow as tf
+
+class ConvolutionalNeuralNetworkTensorflow:
+    def __init__(
+            self,
+            X_train,
+            Y_train,
+            X_test,
+            Y_test,
+            n_filters=10,
+            n_neurons_connected=50,
+            n_categories=10,
+            receptive_field=3,
+            stride=1,
+            padding=1,
+            epochs=10,
+            batch_size=100,
+            eta=0.1,
+            lmbd=0.0):
+        
+        self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step')
+        
+        self.X_train = X_train
+        self.Y_train = Y_train
+        self.X_test = X_test
+        self.Y_test = Y_test
+        
+        self.n_inputs, self.input_width, self.input_height, self.depth = X_train.shape
+        
+        self.n_filters = n_filters
+        self.n_downsampled = int(self.input_width*self.input_height*n_filters / 4)
+        self.n_neurons_connected = n_neurons_connected
+        self.n_categories = n_categories
+        
+        self.receptive_field = receptive_field
+        self.stride = stride
+        self.strides = [stride, stride, stride, stride]
+        self.padding = padding
+        
+        self.epochs = epochs
+        self.batch_size = batch_size
+        self.iterations = self.n_inputs // self.batch_size
+        self.eta = eta
+        self.lmbd = lmbd
+        
+        self.create_placeholders()
+        self.create_CNN()
+        self.create_loss()
+        self.create_optimiser()
+        self.create_accuracy()
+    
+    def create_placeholders(self):
+        with tf.name_scope('data'):
+            self.X = tf.placeholder(tf.float32, shape=(None, self.input_width, self.input_height, self.depth), name='X_data')
+            self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data')
+    
+    def create_CNN(self):
+        with tf.name_scope('CNN'):
+            
+            # Convolutional layer
+            self.W_conv = self.weight_variable([self.receptive_field, self.receptive_field, self.depth, self.n_filters], name='conv', dtype=tf.float32)
+            b_conv = self.weight_variable([self.n_filters], name='conv', dtype=tf.float32)
+            z_conv = tf.nn.conv2d(self.X, self.W_conv, self.strides, padding='SAME', name='conv') + b_conv
+            a_conv = tf.nn.relu(z_conv)
+            
+            # 2x2 max pooling
+            a_pool = tf.nn.max_pool(a_conv, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME', name='pool')
+            
+            # Fully connected layer
+            a_pool_flat = tf.reshape(a_pool, [-1, self.n_downsampled])
+            self.W_fc = self.weight_variable([self.n_downsampled, self.n_neurons_connected], name='fc', dtype=tf.float32)
+            b_fc = self.bias_variable([self.n_neurons_connected], name='fc', dtype=tf.float32)
+            a_fc = tf.nn.relu(tf.matmul(a_pool_flat, self.W_fc) + b_fc)
+            
+            # Output layer
+            self.W_out = self.weight_variable([self.n_neurons_connected, self.n_categories], name='out', dtype=tf.float32)
+            b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32)
+            self.z_out = tf.matmul(a_fc, self.W_out) + b_out
+    
+    def create_loss(self):
+        with tf.name_scope('loss'):
+            softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out))
+            
+            regularizer_loss_conv = tf.nn.l2_loss(self.W_conv)
+            regularizer_loss_fc = tf.nn.l2_loss(self.W_fc)
+            regularizer_loss_out = tf.nn.l2_loss(self.W_out)
+            regularizer_loss = self.lmbd*(regularizer_loss_conv + regularizer_loss_fc + regularizer_loss_out)
+            
+            self.loss = softmax_loss + regularizer_loss
+
+    def create_accuracy(self):
+        with tf.name_scope('accuracy'):
+            probabilities = tf.nn.softmax(self.z_out)
+            predictions = tf.argmax(probabilities, 1)
+            labels = tf.argmax(self.Y, 1)
+            
+            correct_predictions = tf.equal(predictions, labels)
+            correct_predictions = tf.cast(correct_predictions, tf.float32)
+            self.accuracy = tf.reduce_mean(correct_predictions)
+    
+    def create_optimiser(self):
+        with tf.name_scope('optimizer'):
+            self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step)
+            
+    def weight_variable(self, shape, name='', dtype=tf.float32):
+        initial = tf.truncated_normal(shape, stddev=0.1)
+        return tf.Variable(initial, name=name, dtype=dtype)
+    
+    def bias_variable(self, shape, name='', dtype=tf.float32):
+        initial = tf.constant(0.1, shape=shape)
+        return tf.Variable(initial, name=name, dtype=dtype)
+
+    def fit(self):
+        data_indices = np.arange(self.n_inputs)
+
+        with tf.Session() as sess:
+            sess.run(tf.global_variables_initializer())
+            for i in range(self.epochs):
+                for j in range(self.iterations):
+                    chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False)
+                    batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints]
+            
+                    sess.run([CNN.loss, CNN.optimizer],
+                        feed_dict={CNN.X: batch_X,
+                                   CNN.Y: batch_Y})
+                    accuracy = sess.run(CNN.accuracy,
+                        feed_dict={CNN.X: batch_X,
+                                   CNN.Y: batch_Y})
+                    step = sess.run(CNN.global_step)
+    
+            self.train_loss, self.train_accuracy = sess.run([CNN.loss, CNN.accuracy],
+                feed_dict={CNN.X: self.X_train,
+                           CNN.Y: self.Y_train})
+        
+            self.test_loss, self.test_accuracy = sess.run([CNN.loss, CNN.accuracy],
+                feed_dict={CNN.X: self.X_test,
+                           CNN.Y: self.Y_test})
+
+

+









+ +

Train the model

+ +

+We need now to train the model, evaluate it and test its performance on test data, and eventually include hyperparameters. +

+ + +

epochs = 100
+batch_size = 100
+n_filters = 10
+n_neurons_connected = 50
+n_categories = 10
+
+eta_vals = np.logspace(-5, 1, 7)
+lmbd_vals = np.logspace(-5, 1, 7)
+CNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
+        
+for i, eta in enumerate(eta_vals):
+    for j, lmbd in enumerate(lmbd_vals):
+        CNN = ConvolutionalNeuralNetworkTensorflow(X_train, Y_train, X_test, Y_test,
+                                      n_filters=n_filters, n_neurons_connected=n_neurons_connected,
+                                      n_categories=n_categories, epochs=epochs, batch_size=batch_size,
+                                      eta=eta, lmbd=lmbd)
+        CNN.fit()
+        
+        print("Learning rate = ", eta)
+        print("Lambda = ", lmbd)
+        print("Test accuracy: %.3f" % CNN.test_accuracy)
+        print()
+            
+        CNN_tf[i][j] = CNN
+
+

+









+ +

Visualizing the results

+ +

+ + +

# visual representation of grid search
+# uses seaborn heatmap, could probably do this in matplotlib
+import seaborn as sns
+
+sns.set()
+
+train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+
+for i in range(len(eta_vals)):
+    for j in range(len(lmbd_vals)):
+        CNN = CNN_tf[i][j]
+
+        train_accuracy[i][j] = CNN.train_accuracy
+        test_accuracy[i][j] = CNN.test_accuracy
+
+        
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Training Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Test Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+

+ + +

Running with Keras

+ +

+ + +

from keras.models import Sequential
+from keras.layers.convolutional import Conv2D
+from keras.layers.convolutional import MaxPooling2D
+from keras.layers import Flatten
+from keras.layers import Dense
+from keras.regularizers import l2
+from keras.optimizers import SGD
+
+def create_convolutional_neural_network_keras(input_shape, receptive_field,
+                                              n_filters, n_neurons_connected, n_categories,
+                                              eta, lmbd):
+    model = Sequential()
+    model.add(Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same',
+              activation='relu', kernel_regularizer=l2(lmbd)))
+    model.add(MaxPooling2D(pool_size=(2, 2)))
+    model.add(Flatten())
+    model.add(Dense(n_neurons_connected, activation='relu', kernel_regularizer=l2(lmbd)))
+    model.add(Dense(n_categories, activation='softmax', kernel_regularizer=l2(lmbd)))
+    
+    sgd = SGD(lr=eta)
+    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
+    
+    return model
+
+epochs = 100
+batch_size = 100
+input_shape = X_train.shape[1:4]
+receptive_field = 3
+n_filters = 10
+n_neurons_connected = 50
+n_categories = 10
+
+eta_vals = np.logspace(-5, 1, 7)
+lmbd_vals = np.logspace(-5, 1, 7)
+
+

+









+ +

Final part

+ +

+ + +

CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
+        
+for i, eta in enumerate(eta_vals):
+    for j, lmbd in enumerate(lmbd_vals):
+        CNN = create_convolutional_neural_network_keras(input_shape, receptive_field,
+                                              n_filters, n_neurons_connected, n_categories,
+                                              eta, lmbd)
+        CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0)
+        scores = CNN.evaluate(X_test, Y_test)
+        
+        CNN_keras[i][j] = CNN
+        
+        print("Learning rate = ", eta)
+        print("Lambda = ", lmbd)
+        print("Test accuracy: %.3f" % scores[1])
+        print()
+
+

+









+ +

Final visualization

+ +

+ + +

# visual representation of grid search
+# uses seaborn heatmap, could probably do this in matplotlib
+import seaborn as sns
+
+sns.set()
+
+train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+
+for i in range(len(eta_vals)):
+    for j in range(len(lmbd_vals)):
+        CNN = CNN_keras[i][j]
+
+        train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1]
+        test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1]
+
+        
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Training Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Test Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+

+









+ +

Fun links

+ +
    +
  1. Self-Driving cars using a convolutional neural network
  2. +
  3. Abstract art using convolutional neural networks
  4. +
+ + + + + +
+ © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
+ + + + + + diff --git a/doc/src/CNN/cnn.ipynb b/doc/src/CNN/cnn.ipynb new file mode 100644 index 000000000..07b751bcb --- /dev/null +++ b/doc/src/CNN/cnn.ipynb @@ -0,0 +1,729 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Convolutional Neural Networks\n", + "\n", + " \n", + "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n", + "\n", + "Date: **Oct 3, 2019**\n", + "\n", + "Copyright 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Convolutional Neural Networks (recognizing images)\n", + "\n", + "Convolutional Neural Networks (CNN) are very similar to ordinary Neural Networks.\n", + "\n", + "They are made up of neurons that have learnable weights and\n", + "biases. Each neuron receives some inputs, performs a dot product and\n", + "optionally follows it with a non-linearity. The whole network still\n", + "expresses a single differentiable score function: from the raw image\n", + "pixels on one end to class scores at the other. And they still have a\n", + "loss function (for example Softmax) on the last (fully-connected) layer\n", + "and all the tips/tricks we developed for learning regular Neural\n", + "Networks still apply (back propagation, gradient descent etc etc).\n", + "\n", + "What is the difference? **CNN architectures make the explicit assumption that\n", + "the inputs are images, which allows us to encode certain properties\n", + "into the architecture. These then make the forward function more\n", + "efficient to implement and vastly reduce the amount of parameters in\n", + "the network.**\n", + "\n", + "Here we provide only a superficial overview, for the more interested, we recommend highly the course\n", + "[IN5400 – Machine Learning for Image Analysis](https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html)\n", + "and the slides of [CS231](http://cs231n.github.io/convolutional-networks/).\n", + "\n", + "## Regular NNs don’t scale well to full images\n", + "\n", + "As an example, consider\n", + "an image of size $32\\times 32\\times 3$ (32 wide, 32 high, 3 color channels), so a\n", + "single fully-connected neuron in a first hidden layer of a regular\n", + "Neural Network would have $32\\times 32\\times 3 = 3072$ weights. This amount still\n", + "seems manageable, but clearly this fully-connected structure does not\n", + "scale to larger images. For example, an image of more respectable\n", + "size, say $200\\times 200\\times 3$, would lead to neurons that have \n", + "$200\\times 200\\times 3 = 120,000$ weights. \n", + "\n", + "We could have\n", + "several such neurons, and the parameters would add up quickly! Clearly,\n", + "this full connectivity is wasteful and the huge number of parameters\n", + "would quickly lead to possible overfitting.\n", + "\n", + "\n", + "\n", + "\n", + "

A regular 3-layer Neural Network.

\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## 3D volumes of neurons\n", + "\n", + "Convolutional Neural Networks take advantage of the fact that the\n", + "input consists of images and they constrain the architecture in a more\n", + "sensible way. \n", + "\n", + "In particular, unlike a regular Neural Network, the\n", + "layers of a CNN have neurons arranged in 3 dimensions: width,\n", + "height, depth. (Note that the word depth here refers to the third\n", + "dimension of an activation volume, not to the depth of a full Neural\n", + "Network, which can refer to the total number of layers in a network.)\n", + "\n", + "To understand it better, the above example of an image \n", + "with an input volume of\n", + "activations has dimensions $32\\times 32\\times 3$ (width, height,\n", + "depth respectively). \n", + "\n", + "The neurons in a layer will\n", + "only be connected to a small region of the layer before it, instead of\n", + "all of the neurons in a fully-connected manner. Moreover, the final\n", + "output layer could for this specific image have dimensions $1\\times 1 \\times 10$, \n", + "because by the\n", + "end of the CNN architecture we will reduce the full image into a\n", + "single vector of class scores, arranged along the depth\n", + "dimension. \n", + "\n", + "\n", + "\n", + "\n", + "

A CNN arranges its neurons in three dimensions (width, height, depth), as visualized in one of the layers. Every layer of a CNN transforms the 3D input volume to a 3D output volume of neuron activations. In this example, the red input layer holds the image, so its width and height would be the dimensions of the image, and the depth would be 3 (Red, Green, Blue channels).

\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Layers used to build CNNs\n", + "\n", + "\n", + "A simple CNN is a sequence of layers, and every layer of a CNN\n", + "transforms one volume of activations to another through a\n", + "differentiable function. We use three main types of layers to build\n", + "CNN architectures: Convolutional Layer, Pooling Layer, and\n", + "Fully-Connected Layer (exactly as seen in regular Neural Networks). We\n", + "will stack these layers to form a full CNN architecture.\n", + "\n", + "A simple CNN for image classification could have the architecture:\n", + "\n", + "* **INPUT** ($32\\times 32 \\times 3$) will hold the raw pixel values of the image, in this case an image of width 32, height 32, and with three color channels R,G,B.\n", + "\n", + "* **CONV** (convolutional )layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and a small region they are connected to in the input volume. This may result in volume such as $[32\\times 32\\times 12]$ if we decided to use 12 filters.\n", + "\n", + "* **RELU** layer will apply an elementwise activation function, such as the $max(0,x)$ thresholding at zero. This leaves the size of the volume unchanged ($[32\\times 32\\times 12]$).\n", + "\n", + "* **POOL** (pooling) layer will perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as $[16\\times 16\\times 12]$.\n", + "\n", + "* **FC** (i.e. fully-connected) layer will compute the class scores, resulting in volume of size $[1\\times 1\\times 10]$, where each of the 10 numbers correspond to a class score, such as among the 10 categories of the MNIST images we considered above . As with ordinary Neural Networks and as the name implies, each neuron in this layer will be connected to all the numbers in the previous volume.\n", + "\n", + "## Transforming images\n", + "\n", + "CNNs transform the original image layer by layer from the original\n", + "pixel values to the final class scores. \n", + "\n", + "Observe that some layers contain\n", + "parameters and other don’t. In particular, the CNN layers perform\n", + "transformations that are a function of not only the activations in the\n", + "input volume, but also of the parameters (the weights and biases of\n", + "the neurons). On the other hand, the RELU/POOL layers will implement a\n", + "fixed function. The parameters in the CONV/FC layers will be trained\n", + "with gradient descent so that the class scores that the CNN computes\n", + "are consistent with the labels in the training set for each image.\n", + "\n", + "\n", + "## CNNs in brief\n", + "\n", + "In summary:\n", + "\n", + "* A CNN architecture is in the simplest case a list of Layers that transform the image volume into an output volume (e.g. holding the class scores)\n", + "\n", + "* There are a few distinct types of Layers (e.g. CONV/FC/RELU/POOL are by far the most popular)\n", + "\n", + "* Each Layer accepts an input 3D volume and transforms it to an output 3D volume through a differentiable function\n", + "\n", + "* Each Layer may or may not have parameters (e.g. CONV/FC do, RELU/POOL don’t)\n", + "\n", + "* Each Layer may or may not have additional hyperparameters (e.g. CONV/FC/POOL do, RELU doesn’t)\n", + "\n", + "For more material on convolutional networks, we strongly recommend\n", + "the course\n", + "[IN5400 – Machine Learning for Image Analysis](https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html)\n", + "and the slides of [CS231](http://cs231n.github.io/convolutional-networks/) which is taught at Stanford University (consistently ranked as one of the top computer science programs in the world). [Michael Nielsen's book is a must read, in particular chapter 6 which deals with CNNs](http://neuralnetworksanddeeplearning.com/chap6.html).\n", + "\n", + "\n", + "## CNNs in more detail, building convolutional neural networks in Tensorflow and Keras\n", + "\n", + "\n", + "As discussed above, CNNs are neural networks built from the assumption that the inputs\n", + "to the network are 2D images. This is important because the number of features or pixels in images\n", + "grows very fast with the image size, and an enormous number of weights and biases are needed in order to build an accurate network. \n", + "\n", + "As before, we still have our input, a hidden layer and an output. What's novel about convolutional networks\n", + "are the **convolutional** and **pooling** layers stacked in pairs between the input and the hidden layer.\n", + "In addition, the data is no longer represented as a 2D feature matrix, instead each input is a number of 2D\n", + "matrices, typically 1 for each color dimension (Red, Green, Blue). \n", + "\n", + "\n", + "## Setting it up\n", + "\n", + "It means that to represent the entire\n", + "dataset of images, we require a 4D matrix or **tensor**. This tensor has the dimensions:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "(n_{inputs},\\, n_{pixels, width},\\, n_{pixels, height},\\, depth) .\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The MNIST dataset again\n", + "\n", + "The MNIST dataset consists of grayscale images with a pixel size of\n", + "$28\\times 28$, meaning we require $28 \\times 28 = 724$ weights to each\n", + "neuron in the first hidden layer.\n", + "\n", + "If we were to analyze images of size $128\\times 128$ we would require\n", + "$128 \\times 128 = 16384$ weights to each neuron. Even worse if we were\n", + "dealing with color images, as most images are, we have an image matrix\n", + "of size $128\\times 128$ for each color dimension (Red, Green, Blue),\n", + "meaning 3 times the number of weights $= 49152$ are required for every\n", + "single neuron in the first hidden layer.\n", + "\n", + "\n", + "## Strong correlations\n", + "Images typically have strong local correlations, meaning that a small\n", + "part of the image varies little from its neighboring regions. If for\n", + "example we have an image of a blue car, we can roughly assume that a\n", + "small blue part of the image is surrounded by other blue regions.\n", + "\n", + "Therefore, instead of connecting every single pixel to a neuron in the\n", + "first hidden layer, as we have previously done with deep neural\n", + "networks, we can instead connect each neuron to a small part of the\n", + "image (in all 3 RGB depth dimensions). The size of each small area is\n", + "fixed, and known as a [receptive](https://en.wikipedia.org/wiki/Receptive_field).\n", + "\n", + "\n", + "\n", + "## Layers of a CNN\n", + "The layers of a convolutional neural network arrange neurons in 3D: width, height and depth. \n", + "The input image is typically a square matrix of depth 3. \n", + "\n", + "A **convolution** is performed on the image which outputs\n", + "a 3D volume of neurons. The weights to the input are arranged in a number of 2D matrices, known as **filters**.\n", + "\n", + "\n", + "Each filter slides along the input image, taking the dot product\n", + "between each small part of the image and the filter, in all depth\n", + "dimensions. This is then passed through a non-linear function,\n", + "typically the **Rectified Linear (ReLu)** function, which serves as the\n", + "activation of the neurons in the first convolutional layer. This is\n", + "further passed through a **pooling layer**, which reduces the size of the\n", + "convolutional layer, e.g. by taking the maximum or average across some\n", + "small regions, and this serves as input to the next convolutional\n", + "layer.\n", + "\n", + "\n", + "## Systematic reduction\n", + "\n", + "By systematically reducing the size of the input volume, through\n", + "convolution and pooling, the network should create representations of\n", + "small parts of the input, and then from them assemble representations\n", + "of larger areas. The final pooling layer is flattened to serve as\n", + "input to a hidden layer, such that each neuron in the final pooling\n", + "layer is connected to every single neuron in the hidden layer. This\n", + "then serves as input to the output layer, e.g. a softmax output for\n", + "classification.\n", + "\n", + "\n", + "## Prerequisites: Collect and pre-process data" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn import datasets\n", + "\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# display images in notebook\n", + "%matplotlib inline\n", + "plt.rcParams['figure.figsize'] = (12,12)\n", + "\n", + "\n", + "# download MNIST dataset\n", + "digits = datasets.load_digits()\n", + "\n", + "# define inputs and labels\n", + "inputs = digits.images\n", + "labels = digits.target\n", + "\n", + "# RGB images have a depth of 3\n", + "# our images are grayscale so they should have a depth of 1\n", + "inputs = inputs[:,:,:,np.newaxis]\n", + "\n", + "print(\"inputs = (n_inputs, pixel_width, pixel_height, depth) = \" + str(inputs.shape))\n", + "print(\"labels = (n_inputs) = \" + str(labels.shape))\n", + "\n", + "\n", + "# choose some random images to display\n", + "n_inputs = len(inputs)\n", + "indices = np.arange(n_inputs)\n", + "random_indices = np.random.choice(indices, size=5)\n", + "\n", + "for i, image in enumerate(digits.images[random_indices]):\n", + " plt.subplot(1, 5, i+1)\n", + " plt.axis('off')\n", + " plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')\n", + " plt.title(\"Label: %d\" % digits.target[random_indices[i]])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Importing Keras and Tensorflow" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from keras.utils import to_categorical\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "# representation of labels\n", + "labels = to_categorical(labels)\n", + "\n", + "# split into train and test data\n", + "# one-liner from scikit-learn library\n", + "train_size = 0.8\n", + "test_size = 1 - train_size\n", + "X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,\n", + " test_size=test_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using TensorFlow backend\n", + "\n", + "We need to define model and architecture and choose cost function and optmizer." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "\n", + "import tensorflow as tf\n", + "\n", + "class ConvolutionalNeuralNetworkTensorflow:\n", + " def __init__(\n", + " self,\n", + " X_train,\n", + " Y_train,\n", + " X_test,\n", + " Y_test,\n", + " n_filters=10,\n", + " n_neurons_connected=50,\n", + " n_categories=10,\n", + " receptive_field=3,\n", + " stride=1,\n", + " padding=1,\n", + " epochs=10,\n", + " batch_size=100,\n", + " eta=0.1,\n", + " lmbd=0.0):\n", + " \n", + " self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step')\n", + " \n", + " self.X_train = X_train\n", + " self.Y_train = Y_train\n", + " self.X_test = X_test\n", + " self.Y_test = Y_test\n", + " \n", + " self.n_inputs, self.input_width, self.input_height, self.depth = X_train.shape\n", + " \n", + " self.n_filters = n_filters\n", + " self.n_downsampled = int(self.input_width*self.input_height*n_filters / 4)\n", + " self.n_neurons_connected = n_neurons_connected\n", + " self.n_categories = n_categories\n", + " \n", + " self.receptive_field = receptive_field\n", + " self.stride = stride\n", + " self.strides = [stride, stride, stride, stride]\n", + " self.padding = padding\n", + " \n", + " self.epochs = epochs\n", + " self.batch_size = batch_size\n", + " self.iterations = self.n_inputs // self.batch_size\n", + " self.eta = eta\n", + " self.lmbd = lmbd\n", + " \n", + " self.create_placeholders()\n", + " self.create_CNN()\n", + " self.create_loss()\n", + " self.create_optimiser()\n", + " self.create_accuracy()\n", + " \n", + " def create_placeholders(self):\n", + " with tf.name_scope('data'):\n", + " self.X = tf.placeholder(tf.float32, shape=(None, self.input_width, self.input_height, self.depth), name='X_data')\n", + " self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data')\n", + " \n", + " def create_CNN(self):\n", + " with tf.name_scope('CNN'):\n", + " \n", + " # Convolutional layer\n", + " self.W_conv = self.weight_variable([self.receptive_field, self.receptive_field, self.depth, self.n_filters], name='conv', dtype=tf.float32)\n", + " b_conv = self.weight_variable([self.n_filters], name='conv', dtype=tf.float32)\n", + " z_conv = tf.nn.conv2d(self.X, self.W_conv, self.strides, padding='SAME', name='conv') + b_conv\n", + " a_conv = tf.nn.relu(z_conv)\n", + " \n", + " # 2x2 max pooling\n", + " a_pool = tf.nn.max_pool(a_conv, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME', name='pool')\n", + " \n", + " # Fully connected layer\n", + " a_pool_flat = tf.reshape(a_pool, [-1, self.n_downsampled])\n", + " self.W_fc = self.weight_variable([self.n_downsampled, self.n_neurons_connected], name='fc', dtype=tf.float32)\n", + " b_fc = self.bias_variable([self.n_neurons_connected], name='fc', dtype=tf.float32)\n", + " a_fc = tf.nn.relu(tf.matmul(a_pool_flat, self.W_fc) + b_fc)\n", + " \n", + " # Output layer\n", + " self.W_out = self.weight_variable([self.n_neurons_connected, self.n_categories], name='out', dtype=tf.float32)\n", + " b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32)\n", + " self.z_out = tf.matmul(a_fc, self.W_out) + b_out\n", + " \n", + " def create_loss(self):\n", + " with tf.name_scope('loss'):\n", + " softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out))\n", + " \n", + " regularizer_loss_conv = tf.nn.l2_loss(self.W_conv)\n", + " regularizer_loss_fc = tf.nn.l2_loss(self.W_fc)\n", + " regularizer_loss_out = tf.nn.l2_loss(self.W_out)\n", + " regularizer_loss = self.lmbd*(regularizer_loss_conv + regularizer_loss_fc + regularizer_loss_out)\n", + " \n", + " self.loss = softmax_loss + regularizer_loss\n", + "\n", + " def create_accuracy(self):\n", + " with tf.name_scope('accuracy'):\n", + " probabilities = tf.nn.softmax(self.z_out)\n", + " predictions = tf.argmax(probabilities, 1)\n", + " labels = tf.argmax(self.Y, 1)\n", + " \n", + " correct_predictions = tf.equal(predictions, labels)\n", + " correct_predictions = tf.cast(correct_predictions, tf.float32)\n", + " self.accuracy = tf.reduce_mean(correct_predictions)\n", + " \n", + " def create_optimiser(self):\n", + " with tf.name_scope('optimizer'):\n", + " self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step)\n", + " \n", + " def weight_variable(self, shape, name='', dtype=tf.float32):\n", + " initial = tf.truncated_normal(shape, stddev=0.1)\n", + " return tf.Variable(initial, name=name, dtype=dtype)\n", + " \n", + " def bias_variable(self, shape, name='', dtype=tf.float32):\n", + " initial = tf.constant(0.1, shape=shape)\n", + " return tf.Variable(initial, name=name, dtype=dtype)\n", + "\n", + " def fit(self):\n", + " data_indices = np.arange(self.n_inputs)\n", + "\n", + " with tf.Session() as sess:\n", + " sess.run(tf.global_variables_initializer())\n", + " for i in range(self.epochs):\n", + " for j in range(self.iterations):\n", + " chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False)\n", + " batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints]\n", + " \n", + " sess.run([CNN.loss, CNN.optimizer],\n", + " feed_dict={CNN.X: batch_X,\n", + " CNN.Y: batch_Y})\n", + " accuracy = sess.run(CNN.accuracy,\n", + " feed_dict={CNN.X: batch_X,\n", + " CNN.Y: batch_Y})\n", + " step = sess.run(CNN.global_step)\n", + " \n", + " self.train_loss, self.train_accuracy = sess.run([CNN.loss, CNN.accuracy],\n", + " feed_dict={CNN.X: self.X_train,\n", + " CNN.Y: self.Y_train})\n", + " \n", + " self.test_loss, self.test_accuracy = sess.run([CNN.loss, CNN.accuracy],\n", + " feed_dict={CNN.X: self.X_test,\n", + " CNN.Y: self.Y_test})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train the model\n", + "\n", + "We need now to train the model, evaluate it and test its performance on test data, and eventually include hyperparameters." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "epochs = 100\n", + "batch_size = 100\n", + "n_filters = 10\n", + "n_neurons_connected = 50\n", + "n_categories = 10\n", + "\n", + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)\n", + "CNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + " \n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " CNN = ConvolutionalNeuralNetworkTensorflow(X_train, Y_train, X_test, Y_test,\n", + " n_filters=n_filters, n_neurons_connected=n_neurons_connected,\n", + " n_categories=n_categories, epochs=epochs, batch_size=batch_size,\n", + " eta=eta, lmbd=lmbd)\n", + " CNN.fit()\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Test accuracy: %.3f\" % CNN.test_accuracy)\n", + " print()\n", + " \n", + " CNN_tf[i][j] = CNN" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualizing the results" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# visual representation of grid search\n", + "# uses seaborn heatmap, could probably do this in matplotlib\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "\n", + "train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " CNN = CNN_tf[i][j]\n", + "\n", + " train_accuracy[i][j] = CNN.train_accuracy\n", + " test_accuracy[i][j] = CNN.test_accuracy\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Training Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Running with Keras" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from keras.models import Sequential\n", + "from keras.layers.convolutional import Conv2D\n", + "from keras.layers.convolutional import MaxPooling2D\n", + "from keras.layers import Flatten\n", + "from keras.layers import Dense\n", + "from keras.regularizers import l2\n", + "from keras.optimizers import SGD\n", + "\n", + "def create_convolutional_neural_network_keras(input_shape, receptive_field,\n", + " n_filters, n_neurons_connected, n_categories,\n", + " eta, lmbd):\n", + " model = Sequential()\n", + " model.add(Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same',\n", + " activation='relu', kernel_regularizer=l2(lmbd)))\n", + " model.add(MaxPooling2D(pool_size=(2, 2)))\n", + " model.add(Flatten())\n", + " model.add(Dense(n_neurons_connected, activation='relu', kernel_regularizer=l2(lmbd)))\n", + " model.add(Dense(n_categories, activation='softmax', kernel_regularizer=l2(lmbd)))\n", + " \n", + " sgd = SGD(lr=eta)\n", + " model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])\n", + " \n", + " return model\n", + "\n", + "epochs = 100\n", + "batch_size = 100\n", + "input_shape = X_train.shape[1:4]\n", + "receptive_field = 3\n", + "n_filters = 10\n", + "n_neurons_connected = 50\n", + "n_categories = 10\n", + "\n", + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final part" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + " \n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " CNN = create_convolutional_neural_network_keras(input_shape, receptive_field,\n", + " n_filters, n_neurons_connected, n_categories,\n", + " eta, lmbd)\n", + " CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0)\n", + " scores = CNN.evaluate(X_test, Y_test)\n", + " \n", + " CNN_keras[i][j] = CNN\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Test accuracy: %.3f\" % scores[1])\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final visualization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " # visual representation of grid search\n", + " # uses seaborn heatmap, could probably do this in matplotlib\n", + " import seaborn as sns\n", + " \n", + " sns.set()\n", + " \n", + " train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + " test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + " \n", + " for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " CNN = CNN_keras[i][j]\n", + " \n", + " train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1]\n", + " test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1]\n", + " \n", + " \n", + " fig, ax = plt.subplots(figsize = (10, 10))\n", + " sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + " ax.set_title(\"Training Accuracy\")\n", + " ax.set_ylabel(\"$\\eta$\")\n", + " ax.set_xlabel(\"$\\lambda$\")\n", + " plt.show()\n", + " \n", + " fig, ax = plt.subplots(figsize = (10, 10))\n", + " sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + " ax.set_title(\"Test Accuracy\")\n", + " ax.set_ylabel(\"$\\eta$\")\n", + " ax.set_xlabel(\"$\\lambda$\")\n", + " plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fun links\n", + "\n", + "1. [Self-Driving cars using a convolutional neural network](https://arxiv.org/abs/1604.07316)\n", + "\n", + "2. [Abstract art using convolutional neural networks](https://deepdreamgenerator.com/)" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/doc/src/CNN/cnn.p.tex b/doc/src/CNN/cnn.p.tex new file mode 100644 index 000000000..97e61e91d --- /dev/null +++ b/doc/src/CNN/cnn.p.tex @@ -0,0 +1,811 @@ +%% +%% Automatically generated file from DocOnce source +%% (https://github.com/hplgit/doconce/) +%% +%% +% #ifdef PTEX2TEX_EXPLANATION +%% +%% The file follows the ptex2tex extended LaTeX format, see +%% ptex2tex: http://code.google.com/p/ptex2tex/ +%% +%% Run +%% ptex2tex myfile +%% or +%% doconce ptex2tex myfile +%% +%% to turn myfile.p.tex into an ordinary LaTeX file myfile.tex. +%% (The ptex2tex program: http://code.google.com/p/ptex2tex) +%% Many preprocess options can be added to ptex2tex or doconce ptex2tex +%% +%% ptex2tex -DMINTED myfile +%% doconce ptex2tex myfile envir=minted +%% +%% ptex2tex will typeset code environments according to a global or local +%% .ptex2tex.cfg configure file. doconce ptex2tex will typeset code +%% according to options on the command line (just type doconce ptex2tex to +%% see examples). If doconce ptex2tex has envir=minted, it enables the +%% minted style without needing -DMINTED. +% #endif + +% #define PREAMBLE + +% #ifdef PREAMBLE +%-------------------- begin preamble ---------------------- + +\documentclass[% +oneside, % oneside: electronic viewing, twoside: printing +final, % draft: marks overfull hboxes, figures with paths +10pt]{article} + +\listfiles % print all files needed to compile this document + +\usepackage{relsize,makeidx,color,setspace,amsmath,amsfonts,amssymb} +\usepackage[table]{xcolor} +\usepackage{bm,ltablex,microtype} + +\usepackage[pdftex]{graphicx} + +\usepackage{ptex2tex} +% #ifdef MINTED +\usepackage{minted} +\usemintedstyle{default} +% #endif + +\usepackage[T1]{fontenc} +%\usepackage[latin1]{inputenc} +\usepackage{ucs} +\usepackage[utf8x]{inputenc} + +\usepackage{lmodern} % Latin Modern fonts derived from Computer Modern + +% Hyperlinks in PDF: +\definecolor{linkcolor}{rgb}{0,0,0.4} +\usepackage{hyperref} +\hypersetup{ + breaklinks=true, + colorlinks=true, + linkcolor=linkcolor, + urlcolor=linkcolor, + citecolor=black, + filecolor=black, + %filecolor=blue, + pdfmenubar=true, + pdftoolbar=true, + bookmarksdepth=3 % Uncomment (and tweak) for PDF bookmarks with more levels than the TOC + } +%\hyperbaseurl{} % hyperlinks are relative to this root + +\setcounter{tocdepth}{2} % levels in table of contents + +% Tricks for having figures close to where they are defined: +% 1. define less restrictive rules for where to put figures +\setcounter{topnumber}{2} +\setcounter{bottomnumber}{2} +\setcounter{totalnumber}{4} +\renewcommand{\topfraction}{0.95} +\renewcommand{\bottomfraction}{0.95} +\renewcommand{\textfraction}{0} +\renewcommand{\floatpagefraction}{0.75} +% floatpagefraction must always be less than topfraction! +% 2. ensure all figures are flushed before next section +\usepackage[section]{placeins} +% 3. enable begin{figure}[H] (often leads to ugly pagebreaks) +%\usepackage{float}\restylefloat{figure} + +% --- fancyhdr package for fancy headers --- +\usepackage{fancyhdr} +\fancyhf{} % sets both header and footer to nothing +\renewcommand{\headrulewidth}{0pt} +\fancyfoot[LE,RO]{\thepage} +% Ensure copyright on titlepage (article style) and chapter pages (book style) +\fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} +% \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} +% Ensure copyright on titlepages with \thispagestyle{empty} +\fancypagestyle{empty}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} + \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} + +\pagestyle{fancy} + + +% prevent orhpans and widows +\clubpenalty = 10000 +\widowpenalty = 10000 + +% --- end of standard preamble for documents --- + + +% insert custom LaTeX commands... + +\raggedbottom +\makeindex +\usepackage[totoc]{idxlayout} % for index in the toc +\usepackage[nottoc]{tocbibind} % for references/bibliography in the toc + +%-------------------- end preamble ---------------------- + +\begin{document} + +% matching end for #ifdef PREAMBLE +% #endif + +\newcommand{\exercisesection}[1]{\subsection*{#1}} + + +% ------------------- main content ---------------------- + + + +% ----------------- title ------------------------- + +\thispagestyle{empty} + +\begin{center} +{\LARGE\bf +\begin{spacing}{1.25} +Convolutional Neural Networks +\end{spacing} +} +\end{center} + +% ----------------- author(s) ------------------------- + +\begin{center} +{\bf Morten Hjorth-Jensen${}^{1, 2}$} \\ [0mm] +\end{center} + +\begin{center} +% List of all institutions: +\centerline{{\small ${}^1$Department of Physics, University of Oslo}} +\centerline{{\small ${}^2$Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University}} +\end{center} + +% ----------------- end author(s) ------------------------- + +% --- begin date --- +\begin{center} +Oct 3, 2019 +\end{center} +% --- end date --- + +\vspace{1cm} + + +% !split +\subsection{Convolutional Neural Networks (recognizing images)} + +Convolutional Neural Networks (CNN) are very similar to ordinary Neural Networks. + +They are made up of neurons that have learnable weights and +biases. Each neuron receives some inputs, performs a dot product and +optionally follows it with a non-linearity. The whole network still +expresses a single differentiable score function: from the raw image +pixels on one end to class scores at the other. And they still have a +loss function (for example Softmax) on the last (fully-connected) layer +and all the tips/tricks we developed for learning regular Neural +Networks still apply (back propagation, gradient descent etc etc). + +What is the difference? \textbf{CNN architectures make the explicit assumption that +the inputs are images, which allows us to encode certain properties +into the architecture. These then make the forward function more +efficient to implement and vastly reduce the amount of parameters in +the network.} + +Here we provide only a superficial overview, for the more interested, we recommend highly the course +\href{{https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html}}{IN5400 – Machine Learning for Image Analysis} +and the slides of \href{{http://cs231n.github.io/convolutional-networks/}}{CS231}. + +% !split +\subsection{Regular NNs don’t scale well to full images} + +As an example, consider +an image of size $32\times 32\times 3$ (32 wide, 32 high, 3 color channels), so a +single fully-connected neuron in a first hidden layer of a regular +Neural Network would have $32\times 32\times 3 = 3072$ weights. This amount still +seems manageable, but clearly this fully-connected structure does not +scale to larger images. For example, an image of more respectable +size, say $200\times 200\times 3$, would lead to neurons that have +$200\times 200\times 3 = 120,000$ weights. + +We could have +several such neurons, and the parameters would add up quickly! Clearly, +this full connectivity is wasteful and the huge number of parameters +would quickly lead to possible overfitting. + + +\begin{figure}[!ht] % + \centerline{\includegraphics[width=0.6\linewidth]{figslides/nn.jpeg}} + \caption{ + A regular 3-layer Neural Network. + } +\end{figure} +%\clearpage % flush figures + + +% !split +\subsection{3D volumes of neurons} + +Convolutional Neural Networks take advantage of the fact that the +input consists of images and they constrain the architecture in a more +sensible way. + +In particular, unlike a regular Neural Network, the +layers of a CNN have neurons arranged in 3 dimensions: width, +height, depth. (Note that the word depth here refers to the third +dimension of an activation volume, not to the depth of a full Neural +Network, which can refer to the total number of layers in a network.) + +To understand it better, the above example of an image +with an input volume of +activations has dimensions $32\times 32\times 3$ (width, height, +depth respectively). + +The neurons in a layer will +only be connected to a small region of the layer before it, instead of +all of the neurons in a fully-connected manner. Moreover, the final +output layer could for this specific image have dimensions $1\times 1 \times 10$, +because by the +end of the CNN architecture we will reduce the full image into a +single vector of class scores, arranged along the depth +dimension. + + +\begin{figure}[!ht] % + \centerline{\includegraphics[width=0.6\linewidth]{figslides/cnn.jpeg}} + \caption{ + A CNN arranges its neurons in three dimensions (width, height, depth), as visualized in one of the layers. Every layer of a CNN transforms the 3D input volume to a 3D output volume of neuron activations. In this example, the red input layer holds the image, so its width and height would be the dimensions of the image, and the depth would be 3 (Red, Green, Blue channels). + } +\end{figure} +%\clearpage % flush figures + + + + +% !split +\subsection{Layers used to build CNNs} + + +A simple CNN is a sequence of layers, and every layer of a CNN +transforms one volume of activations to another through a +differentiable function. We use three main types of layers to build +CNN architectures: Convolutional Layer, Pooling Layer, and +Fully-Connected Layer (exactly as seen in regular Neural Networks). We +will stack these layers to form a full CNN architecture. + +A simple CNN for image classification could have the architecture: + +\begin{itemize} +\item \textbf{INPUT} ($32\times 32 \times 3$) will hold the raw pixel values of the image, in this case an image of width 32, height 32, and with three color channels R,G,B. + +\item \textbf{CONV} (convolutional )layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and a small region they are connected to in the input volume. This may result in volume such as $[32\times 32\times 12]$ if we decided to use 12 filters. + +\item \textbf{RELU} layer will apply an elementwise activation function, such as the $max(0,x)$ thresholding at zero. This leaves the size of the volume unchanged ($[32\times 32\times 12]$). + +\item \textbf{POOL} (pooling) layer will perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as $[16\times 16\times 12]$. + +\item \textbf{FC} (i.e.~fully-connected) layer will compute the class scores, resulting in volume of size $[1\times 1\times 10]$, where each of the 10 numbers correspond to a class score, such as among the 10 categories of the MNIST images we considered above . As with ordinary Neural Networks and as the name implies, each neuron in this layer will be connected to all the numbers in the previous volume. +\end{itemize} + +\noindent +% !split +\subsection{Transforming images} + +CNNs transform the original image layer by layer from the original +pixel values to the final class scores. + +Observe that some layers contain +parameters and other don’t. In particular, the CNN layers perform +transformations that are a function of not only the activations in the +input volume, but also of the parameters (the weights and biases of +the neurons). On the other hand, the RELU/POOL layers will implement a +fixed function. The parameters in the CONV/FC layers will be trained +with gradient descent so that the class scores that the CNN computes +are consistent with the labels in the training set for each image. + + +% !split +\subsection{CNNs in brief} + +In summary: + +\begin{itemize} +\item A CNN architecture is in the simplest case a list of Layers that transform the image volume into an output volume (e.g.~holding the class scores) + +\item There are a few distinct types of Layers (e.g.~CONV/FC/RELU/POOL are by far the most popular) + +\item Each Layer accepts an input 3D volume and transforms it to an output 3D volume through a differentiable function + +\item Each Layer may or may not have parameters (e.g.~CONV/FC do, RELU/POOL don’t) + +\item Each Layer may or may not have additional hyperparameters (e.g.~CONV/FC/POOL do, RELU doesn’t) +\end{itemize} + +\noindent +For more material on convolutional networks, we strongly recommend +the course +\href{{https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html}}{IN5400 – Machine Learning for Image Analysis} +and the slides of \href{{http://cs231n.github.io/convolutional-networks/}}{CS231} which is taught at Stanford University (consistently ranked as one of the top computer science programs in the world). \href{{http://neuralnetworksanddeeplearning.com/chap6.html}}{Michael Nielsen's book is a must read, in particular chapter 6 which deals with CNNs}. + + +% !split +\subsection{CNNs in more detail, building convolutional neural networks in Tensorflow and Keras} + + +As discussed above, CNNs are neural networks built from the assumption that the inputs +to the network are 2D images. This is important because the number of features or pixels in images +grows very fast with the image size, and an enormous number of weights and biases are needed in order to build an accurate network. + +As before, we still have our input, a hidden layer and an output. What's novel about convolutional networks +are the \textbf{convolutional} and \textbf{pooling} layers stacked in pairs between the input and the hidden layer. +In addition, the data is no longer represented as a 2D feature matrix, instead each input is a number of 2D +matrices, typically 1 for each color dimension (Red, Green, Blue). + + +% !split +\subsection{Setting it up} + +It means that to represent the entire +dataset of images, we require a 4D matrix or \textbf{tensor}. This tensor has the dimensions: +\[ +(n_{inputs},\, n_{pixels, width},\, n_{pixels, height},\, depth) . +\] + +% !split +\subsection{The MNIST dataset again} + +The MNIST dataset consists of grayscale images with a pixel size of +$28\times 28$, meaning we require $28 \times 28 = 724$ weights to each +neuron in the first hidden layer. + +If we were to analyze images of size $128\times 128$ we would require +$128 \times 128 = 16384$ weights to each neuron. Even worse if we were +dealing with color images, as most images are, we have an image matrix +of size $128\times 128$ for each color dimension (Red, Green, Blue), +meaning 3 times the number of weights $= 49152$ are required for every +single neuron in the first hidden layer. + + +% !split +\subsection{Strong correlations} +Images typically have strong local correlations, meaning that a small +part of the image varies little from its neighboring regions. If for +example we have an image of a blue car, we can roughly assume that a +small blue part of the image is surrounded by other blue regions. + +Therefore, instead of connecting every single pixel to a neuron in the +first hidden layer, as we have previously done with deep neural +networks, we can instead connect each neuron to a small part of the +image (in all 3 RGB depth dimensions). The size of each small area is +fixed, and known as a \href{{https://en.wikipedia.org/wiki/Receptive_field}}{receptive}. + + +% !split +\subsection{Layers of a CNN} +The layers of a convolutional neural network arrange neurons in 3D: width, height and depth. +The input image is typically a square matrix of depth 3. + +A \textbf{convolution} is performed on the image which outputs +a 3D volume of neurons. The weights to the input are arranged in a number of 2D matrices, known as \textbf{filters}. + + +Each filter slides along the input image, taking the dot product +between each small part of the image and the filter, in all depth +dimensions. This is then passed through a non-linear function, +typically the \textbf{Rectified Linear (ReLu)} function, which serves as the +activation of the neurons in the first convolutional layer. This is +further passed through a \textbf{pooling layer}, which reduces the size of the +convolutional layer, e.g.~by taking the maximum or average across some +small regions, and this serves as input to the next convolutional +layer. + + +% !split +\subsection{Systematic reduction} + +By systematically reducing the size of the input volume, through +convolution and pooling, the network should create representations of +small parts of the input, and then from them assemble representations +of larger areas. The final pooling layer is flattened to serve as +input to a hidden layer, such that each neuron in the final pooling +layer is connected to every single neuron in the hidden layer. This +then serves as input to the output layer, e.g.~a softmax output for +classification. + + +% !split +\subsection{Prerequisites: Collect and pre-process data} +\bpycod +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn import datasets + + +# ensure the same random numbers appear every time +np.random.seed(0) + +# display images in notebook +%matplotlib inline +plt.rcParams['figure.figsize'] = (12,12) + + +# download MNIST dataset +digits = datasets.load_digits() + +# define inputs and labels +inputs = digits.images +labels = digits.target + +# RGB images have a depth of 3 +# our images are grayscale so they should have a depth of 1 +inputs = inputs[:,:,:,np.newaxis] + +print("inputs = (n_inputs, pixel_width, pixel_height, depth) = " + str(inputs.shape)) +print("labels = (n_inputs) = " + str(labels.shape)) + + +# choose some random images to display +n_inputs = len(inputs) +indices = np.arange(n_inputs) +random_indices = np.random.choice(indices, size=5) + +for i, image in enumerate(digits.images[random_indices]): + plt.subplot(1, 5, i+1) + plt.axis('off') + plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') + plt.title("Label: %d" % digits.target[random_indices[i]]) +plt.show() +\epycod + + +% !split +\subsection{Importing Keras and Tensorflow} +\bpycod +from keras.utils import to_categorical +from sklearn.model_selection import train_test_split + +# representation of labels +labels = to_categorical(labels) + +# split into train and test data +# one-liner from scikit-learn library +train_size = 0.8 +test_size = 1 - train_size +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size, + test_size=test_size) +\epycod + +% !split +\subsection{Using TensorFlow backend} + +We need to define model and architecture and choose cost function and optmizer. +\bpycid + +import tensorflow as tf + +class ConvolutionalNeuralNetworkTensorflow: + def __init__( + self, + X_train, + Y_train, + X_test, + Y_test, + n_filters=10, + n_neurons_connected=50, + n_categories=10, + receptive_field=3, + stride=1, + padding=1, + epochs=10, + batch_size=100, + eta=0.1, + lmbd=0.0): + + self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step') + + self.X_train = X_train + self.Y_train = Y_train + self.X_test = X_test + self.Y_test = Y_test + + self.n_inputs, self.input_width, self.input_height, self.depth = X_train.shape + + self.n_filters = n_filters + self.n_downsampled = int(self.input_width*self.input_height*n_filters / 4) + self.n_neurons_connected = n_neurons_connected + self.n_categories = n_categories + + self.receptive_field = receptive_field + self.stride = stride + self.strides = [stride, stride, stride, stride] + self.padding = padding + + self.epochs = epochs + self.batch_size = batch_size + self.iterations = self.n_inputs // self.batch_size + self.eta = eta + self.lmbd = lmbd + + self.create_placeholders() + self.create_CNN() + self.create_loss() + self.create_optimiser() + self.create_accuracy() + + def create_placeholders(self): + with tf.name_scope('data'): + self.X = tf.placeholder(tf.float32, shape=(None, self.input_width, self.input_height, self.depth), name='X_data') + self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data') + + def create_CNN(self): + with tf.name_scope('CNN'): + + # Convolutional layer + self.W_conv = self.weight_variable([self.receptive_field, self.receptive_field, self.depth, self.n_filters], name='conv', dtype=tf.float32) + b_conv = self.weight_variable([self.n_filters], name='conv', dtype=tf.float32) + z_conv = tf.nn.conv2d(self.X, self.W_conv, self.strides, padding='SAME', name='conv') + b_conv + a_conv = tf.nn.relu(z_conv) + + # 2x2 max pooling + a_pool = tf.nn.max_pool(a_conv, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME', name='pool') + + # Fully connected layer + a_pool_flat = tf.reshape(a_pool, [-1, self.n_downsampled]) + self.W_fc = self.weight_variable([self.n_downsampled, self.n_neurons_connected], name='fc', dtype=tf.float32) + b_fc = self.bias_variable([self.n_neurons_connected], name='fc', dtype=tf.float32) + a_fc = tf.nn.relu(tf.matmul(a_pool_flat, self.W_fc) + b_fc) + + # Output layer + self.W_out = self.weight_variable([self.n_neurons_connected, self.n_categories], name='out', dtype=tf.float32) + b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32) + self.z_out = tf.matmul(a_fc, self.W_out) + b_out + + def create_loss(self): + with tf.name_scope('loss'): + softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out)) + + regularizer_loss_conv = tf.nn.l2_loss(self.W_conv) + regularizer_loss_fc = tf.nn.l2_loss(self.W_fc) + regularizer_loss_out = tf.nn.l2_loss(self.W_out) + regularizer_loss = self.lmbd*(regularizer_loss_conv + regularizer_loss_fc + regularizer_loss_out) + + self.loss = softmax_loss + regularizer_loss + + def create_accuracy(self): + with tf.name_scope('accuracy'): + probabilities = tf.nn.softmax(self.z_out) + predictions = tf.argmax(probabilities, 1) + labels = tf.argmax(self.Y, 1) + + correct_predictions = tf.equal(predictions, labels) + correct_predictions = tf.cast(correct_predictions, tf.float32) + self.accuracy = tf.reduce_mean(correct_predictions) + + def create_optimiser(self): + with tf.name_scope('optimizer'): + self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step) + + def weight_variable(self, shape, name='', dtype=tf.float32): + initial = tf.truncated_normal(shape, stddev=0.1) + return tf.Variable(initial, name=name, dtype=dtype) + + def bias_variable(self, shape, name='', dtype=tf.float32): + initial = tf.constant(0.1, shape=shape) + return tf.Variable(initial, name=name, dtype=dtype) + + def fit(self): + data_indices = np.arange(self.n_inputs) + + with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + for i in range(self.epochs): + for j in range(self.iterations): + chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False) + batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints] + + sess.run([CNN.loss, CNN.optimizer], + feed_dict={CNN.X: batch_X, + CNN.Y: batch_Y}) + accuracy = sess.run(CNN.accuracy, + feed_dict={CNN.X: batch_X, + CNN.Y: batch_Y}) + step = sess.run(CNN.global_step) + + self.train_loss, self.train_accuracy = sess.run([CNN.loss, CNN.accuracy], + feed_dict={CNN.X: self.X_train, + CNN.Y: self.Y_train}) + + self.test_loss, self.test_accuracy = sess.run([CNN.loss, CNN.accuracy], + feed_dict={CNN.X: self.X_test, + CNN.Y: self.Y_test}) +\epycid + +% !split +\subsection{Train the model} + +We need now to train the model, evaluate it and test its performance on test data, and eventually include hyperparameters. +\bpycod +epochs = 100 +batch_size = 100 +n_filters = 10 +n_neurons_connected = 50 +n_categories = 10 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +CNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + CNN = ConvolutionalNeuralNetworkTensorflow(X_train, Y_train, X_test, Y_test, + n_filters=n_filters, n_neurons_connected=n_neurons_connected, + n_categories=n_categories, epochs=epochs, batch_size=batch_size, + eta=eta, lmbd=lmbd) + CNN.fit() + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Test accuracy: %.3f" % CNN.test_accuracy) + print() + + CNN_tf[i][j] = CNN +\epycod + +% !split +\subsection{Visualizing the results} + +\bpycod +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + CNN = CNN_tf[i][j] + + train_accuracy[i][j] = CNN.train_accuracy + test_accuracy[i][j] = CNN.test_accuracy + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() +\epycod + +% !split +\subsection{Running with Keras} + +\bpycod +from keras.models import Sequential +from keras.layers.convolutional import Conv2D +from keras.layers.convolutional import MaxPooling2D +from keras.layers import Flatten +from keras.layers import Dense +from keras.regularizers import l2 +from keras.optimizers import SGD + +def create_convolutional_neural_network_keras(input_shape, receptive_field, + n_filters, n_neurons_connected, n_categories, + eta, lmbd): + model = Sequential() + model.add(Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same', + activation='relu', kernel_regularizer=l2(lmbd))) + model.add(MaxPooling2D(pool_size=(2, 2))) + model.add(Flatten()) + model.add(Dense(n_neurons_connected, activation='relu', kernel_regularizer=l2(lmbd))) + model.add(Dense(n_categories, activation='softmax', kernel_regularizer=l2(lmbd))) + + sgd = SGD(lr=eta) + model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) + + return model + +epochs = 100 +batch_size = 100 +input_shape = X_train.shape[1:4] +receptive_field = 3 +n_filters = 10 +n_neurons_connected = 50 +n_categories = 10 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +\epycod + +% !split +\subsection{Final part} + +\bpycod +CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + CNN = create_convolutional_neural_network_keras(input_shape, receptive_field, + n_filters, n_neurons_connected, n_categories, + eta, lmbd) + CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0) + scores = CNN.evaluate(X_test, Y_test) + + CNN_keras[i][j] = CNN + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Test accuracy: %.3f" % scores[1]) + print() +\epycod + +% !split +\subsection{Final visualization} + +\bccq +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + CNN = CNN_keras[i][j] + + train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1] + test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1] + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() +\eccq + +% !split +\subsection{Fun links} + +\begin{enumerate} +\item \href{{https://arxiv.org/abs/1604.07316}}{Self-Driving cars using a convolutional neural network} + +\item \href{{https://deepdreamgenerator.com/}}{Abstract art using convolutional neural networks} +\end{enumerate} + +\noindent + +% ------------------- end of main content --------------- + +% #ifdef PREAMBLE +\end{document} +% #endif + diff --git a/doc/src/CNN/cnn.tex b/doc/src/CNN/cnn.tex new file mode 100644 index 000000000..6fb87ff00 --- /dev/null +++ b/doc/src/CNN/cnn.tex @@ -0,0 +1,781 @@ +%% +%% Automatically generated file from DocOnce source +%% (https://github.com/hplgit/doconce/) +%% +%% + + +%-------------------- begin preamble ---------------------- + +\documentclass[% +oneside, % oneside: electronic viewing, twoside: printing +final, % draft: marks overfull hboxes, figures with paths +10pt]{article} + +\listfiles % print all files needed to compile this document + +\usepackage{relsize,makeidx,color,setspace,amsmath,amsfonts,amssymb} +\usepackage[table]{xcolor} +\usepackage{bm,ltablex,microtype} + +\usepackage[pdftex]{graphicx} + +\usepackage{fancyvrb} % packages needed for verbatim environments +\usepackage{minted} +\usemintedstyle{default} + +\usepackage[T1]{fontenc} +%\usepackage[latin1]{inputenc} +\usepackage{ucs} +\usepackage[utf8x]{inputenc} + +\usepackage{lmodern} % Latin Modern fonts derived from Computer Modern + +% Hyperlinks in PDF: +\definecolor{linkcolor}{rgb}{0,0,0.4} +\usepackage{hyperref} +\hypersetup{ + breaklinks=true, + colorlinks=true, + linkcolor=linkcolor, + urlcolor=linkcolor, + citecolor=black, + filecolor=black, + %filecolor=blue, + pdfmenubar=true, + pdftoolbar=true, + bookmarksdepth=3 % Uncomment (and tweak) for PDF bookmarks with more levels than the TOC + } +%\hyperbaseurl{} % hyperlinks are relative to this root + +\setcounter{tocdepth}{2} % levels in table of contents + +% Tricks for having figures close to where they are defined: +% 1. define less restrictive rules for where to put figures +\setcounter{topnumber}{2} +\setcounter{bottomnumber}{2} +\setcounter{totalnumber}{4} +\renewcommand{\topfraction}{0.95} +\renewcommand{\bottomfraction}{0.95} +\renewcommand{\textfraction}{0} +\renewcommand{\floatpagefraction}{0.75} +% floatpagefraction must always be less than topfraction! +% 2. ensure all figures are flushed before next section +\usepackage[section]{placeins} +% 3. enable begin{figure}[H] (often leads to ugly pagebreaks) +%\usepackage{float}\restylefloat{figure} + +% --- fancyhdr package for fancy headers --- +\usepackage{fancyhdr} +\fancyhf{} % sets both header and footer to nothing +\renewcommand{\headrulewidth}{0pt} +\fancyfoot[LE,RO]{\thepage} +% Ensure copyright on titlepage (article style) and chapter pages (book style) +\fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} +% \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} +% Ensure copyright on titlepages with \thispagestyle{empty} +\fancypagestyle{empty}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} + \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} + +\pagestyle{fancy} + + +% prevent orhpans and widows +\clubpenalty = 10000 +\widowpenalty = 10000 + +% --- end of standard preamble for documents --- + + +% insert custom LaTeX commands... + +\raggedbottom +\makeindex +\usepackage[totoc]{idxlayout} % for index in the toc +\usepackage[nottoc]{tocbibind} % for references/bibliography in the toc + +%-------------------- end preamble ---------------------- + +\begin{document} + +% matching end for #ifdef PREAMBLE + +\newcommand{\exercisesection}[1]{\subsection*{#1}} + + +% ------------------- main content ---------------------- + + + +% ----------------- title ------------------------- + +\thispagestyle{empty} + +\begin{center} +{\LARGE\bf +\begin{spacing}{1.25} +Convolutional Neural Networks +\end{spacing} +} +\end{center} + +% ----------------- author(s) ------------------------- + +\begin{center} +{\bf Morten Hjorth-Jensen${}^{1, 2}$} \\ [0mm] +\end{center} + +\begin{center} +% List of all institutions: +\centerline{{\small ${}^1$Department of Physics, University of Oslo}} +\centerline{{\small ${}^2$Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University}} +\end{center} + +% ----------------- end author(s) ------------------------- + +% --- begin date --- +\begin{center} +Oct 3, 2019 +\end{center} +% --- end date --- + +\vspace{1cm} + + +% !split +\subsection*{Convolutional Neural Networks (recognizing images)} + +Convolutional Neural Networks (CNN) are very similar to ordinary Neural Networks. + +They are made up of neurons that have learnable weights and +biases. Each neuron receives some inputs, performs a dot product and +optionally follows it with a non-linearity. The whole network still +expresses a single differentiable score function: from the raw image +pixels on one end to class scores at the other. And they still have a +loss function (for example Softmax) on the last (fully-connected) layer +and all the tips/tricks we developed for learning regular Neural +Networks still apply (back propagation, gradient descent etc etc). + +What is the difference? \textbf{CNN architectures make the explicit assumption that +the inputs are images, which allows us to encode certain properties +into the architecture. These then make the forward function more +efficient to implement and vastly reduce the amount of parameters in +the network.} + +Here we provide only a superficial overview, for the more interested, we recommend highly the course +\href{{https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html}}{IN5400 – Machine Learning for Image Analysis} +and the slides of \href{{http://cs231n.github.io/convolutional-networks/}}{CS231}. + +% !split +\subsection*{Regular NNs don’t scale well to full images} + +As an example, consider +an image of size $32\times 32\times 3$ (32 wide, 32 high, 3 color channels), so a +single fully-connected neuron in a first hidden layer of a regular +Neural Network would have $32\times 32\times 3 = 3072$ weights. This amount still +seems manageable, but clearly this fully-connected structure does not +scale to larger images. For example, an image of more respectable +size, say $200\times 200\times 3$, would lead to neurons that have +$200\times 200\times 3 = 120,000$ weights. + +We could have +several such neurons, and the parameters would add up quickly! Clearly, +this full connectivity is wasteful and the huge number of parameters +would quickly lead to possible overfitting. + + +\begin{figure}[!ht] % + \centerline{\includegraphics[width=0.6\linewidth]{figslides/nn.jpeg}} + \caption{ + A regular 3-layer Neural Network. + } +\end{figure} +%\clearpage % flush figures + + +% !split +\subsection*{3D volumes of neurons} + +Convolutional Neural Networks take advantage of the fact that the +input consists of images and they constrain the architecture in a more +sensible way. + +In particular, unlike a regular Neural Network, the +layers of a CNN have neurons arranged in 3 dimensions: width, +height, depth. (Note that the word depth here refers to the third +dimension of an activation volume, not to the depth of a full Neural +Network, which can refer to the total number of layers in a network.) + +To understand it better, the above example of an image +with an input volume of +activations has dimensions $32\times 32\times 3$ (width, height, +depth respectively). + +The neurons in a layer will +only be connected to a small region of the layer before it, instead of +all of the neurons in a fully-connected manner. Moreover, the final +output layer could for this specific image have dimensions $1\times 1 \times 10$, +because by the +end of the CNN architecture we will reduce the full image into a +single vector of class scores, arranged along the depth +dimension. + + +\begin{figure}[!ht] % + \centerline{\includegraphics[width=0.6\linewidth]{figslides/cnn.jpeg}} + \caption{ + A CNN arranges its neurons in three dimensions (width, height, depth), as visualized in one of the layers. Every layer of a CNN transforms the 3D input volume to a 3D output volume of neuron activations. In this example, the red input layer holds the image, so its width and height would be the dimensions of the image, and the depth would be 3 (Red, Green, Blue channels). + } +\end{figure} +%\clearpage % flush figures + + + + +% !split +\subsection*{Layers used to build CNNs} + + +A simple CNN is a sequence of layers, and every layer of a CNN +transforms one volume of activations to another through a +differentiable function. We use three main types of layers to build +CNN architectures: Convolutional Layer, Pooling Layer, and +Fully-Connected Layer (exactly as seen in regular Neural Networks). We +will stack these layers to form a full CNN architecture. + +A simple CNN for image classification could have the architecture: + +\begin{itemize} +\item \textbf{INPUT} ($32\times 32 \times 3$) will hold the raw pixel values of the image, in this case an image of width 32, height 32, and with three color channels R,G,B. + +\item \textbf{CONV} (convolutional )layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and a small region they are connected to in the input volume. This may result in volume such as $[32\times 32\times 12]$ if we decided to use 12 filters. + +\item \textbf{RELU} layer will apply an elementwise activation function, such as the $max(0,x)$ thresholding at zero. This leaves the size of the volume unchanged ($[32\times 32\times 12]$). + +\item \textbf{POOL} (pooling) layer will perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as $[16\times 16\times 12]$. + +\item \textbf{FC} (i.e.~fully-connected) layer will compute the class scores, resulting in volume of size $[1\times 1\times 10]$, where each of the 10 numbers correspond to a class score, such as among the 10 categories of the MNIST images we considered above . As with ordinary Neural Networks and as the name implies, each neuron in this layer will be connected to all the numbers in the previous volume. +\end{itemize} + +\noindent +% !split +\subsection*{Transforming images} + +CNNs transform the original image layer by layer from the original +pixel values to the final class scores. + +Observe that some layers contain +parameters and other don’t. In particular, the CNN layers perform +transformations that are a function of not only the activations in the +input volume, but also of the parameters (the weights and biases of +the neurons). On the other hand, the RELU/POOL layers will implement a +fixed function. The parameters in the CONV/FC layers will be trained +with gradient descent so that the class scores that the CNN computes +are consistent with the labels in the training set for each image. + + +% !split +\subsection*{CNNs in brief} + +In summary: + +\begin{itemize} +\item A CNN architecture is in the simplest case a list of Layers that transform the image volume into an output volume (e.g.~holding the class scores) + +\item There are a few distinct types of Layers (e.g.~CONV/FC/RELU/POOL are by far the most popular) + +\item Each Layer accepts an input 3D volume and transforms it to an output 3D volume through a differentiable function + +\item Each Layer may or may not have parameters (e.g.~CONV/FC do, RELU/POOL don’t) + +\item Each Layer may or may not have additional hyperparameters (e.g.~CONV/FC/POOL do, RELU doesn’t) +\end{itemize} + +\noindent +For more material on convolutional networks, we strongly recommend +the course +\href{{https://www.uio.no/studier/emner/matnat/ifi/IN5400/index-eng.html}}{IN5400 – Machine Learning for Image Analysis} +and the slides of \href{{http://cs231n.github.io/convolutional-networks/}}{CS231} which is taught at Stanford University (consistently ranked as one of the top computer science programs in the world). \href{{http://neuralnetworksanddeeplearning.com/chap6.html}}{Michael Nielsen's book is a must read, in particular chapter 6 which deals with CNNs}. + + +% !split +\subsection*{CNNs in more detail, building convolutional neural networks in Tensorflow and Keras} + + +As discussed above, CNNs are neural networks built from the assumption that the inputs +to the network are 2D images. This is important because the number of features or pixels in images +grows very fast with the image size, and an enormous number of weights and biases are needed in order to build an accurate network. + +As before, we still have our input, a hidden layer and an output. What's novel about convolutional networks +are the \textbf{convolutional} and \textbf{pooling} layers stacked in pairs between the input and the hidden layer. +In addition, the data is no longer represented as a 2D feature matrix, instead each input is a number of 2D +matrices, typically 1 for each color dimension (Red, Green, Blue). + + +% !split +\subsection*{Setting it up} + +It means that to represent the entire +dataset of images, we require a 4D matrix or \textbf{tensor}. This tensor has the dimensions: +\[ +(n_{inputs},\, n_{pixels, width},\, n_{pixels, height},\, depth) . +\] + +% !split +\subsection*{The MNIST dataset again} + +The MNIST dataset consists of grayscale images with a pixel size of +$28\times 28$, meaning we require $28 \times 28 = 724$ weights to each +neuron in the first hidden layer. + +If we were to analyze images of size $128\times 128$ we would require +$128 \times 128 = 16384$ weights to each neuron. Even worse if we were +dealing with color images, as most images are, we have an image matrix +of size $128\times 128$ for each color dimension (Red, Green, Blue), +meaning 3 times the number of weights $= 49152$ are required for every +single neuron in the first hidden layer. + + +% !split +\subsection*{Strong correlations} +Images typically have strong local correlations, meaning that a small +part of the image varies little from its neighboring regions. If for +example we have an image of a blue car, we can roughly assume that a +small blue part of the image is surrounded by other blue regions. + +Therefore, instead of connecting every single pixel to a neuron in the +first hidden layer, as we have previously done with deep neural +networks, we can instead connect each neuron to a small part of the +image (in all 3 RGB depth dimensions). The size of each small area is +fixed, and known as a \href{{https://en.wikipedia.org/wiki/Receptive_field}}{receptive}. + + +% !split +\subsection*{Layers of a CNN} +The layers of a convolutional neural network arrange neurons in 3D: width, height and depth. +The input image is typically a square matrix of depth 3. + +A \textbf{convolution} is performed on the image which outputs +a 3D volume of neurons. The weights to the input are arranged in a number of 2D matrices, known as \textbf{filters}. + + +Each filter slides along the input image, taking the dot product +between each small part of the image and the filter, in all depth +dimensions. This is then passed through a non-linear function, +typically the \textbf{Rectified Linear (ReLu)} function, which serves as the +activation of the neurons in the first convolutional layer. This is +further passed through a \textbf{pooling layer}, which reduces the size of the +convolutional layer, e.g.~by taking the maximum or average across some +small regions, and this serves as input to the next convolutional +layer. + + +% !split +\subsection*{Systematic reduction} + +By systematically reducing the size of the input volume, through +convolution and pooling, the network should create representations of +small parts of the input, and then from them assemble representations +of larger areas. The final pooling layer is flattened to serve as +input to a hidden layer, such that each neuron in the final pooling +layer is connected to every single neuron in the hidden layer. This +then serves as input to the output layer, e.g.~a softmax output for +classification. + + +% !split +\subsection*{Prerequisites: Collect and pre-process data} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn import datasets + + +# ensure the same random numbers appear every time +np.random.seed(0) + +# display images in notebook +%matplotlib inline +plt.rcParams['figure.figsize'] = (12,12) + + +# download MNIST dataset +digits = datasets.load_digits() + +# define inputs and labels +inputs = digits.images +labels = digits.target + +# RGB images have a depth of 3 +# our images are grayscale so they should have a depth of 1 +inputs = inputs[:,:,:,np.newaxis] + +print("inputs = (n_inputs, pixel_width, pixel_height, depth) = " + str(inputs.shape)) +print("labels = (n_inputs) = " + str(labels.shape)) + + +# choose some random images to display +n_inputs = len(inputs) +indices = np.arange(n_inputs) +random_indices = np.random.choice(indices, size=5) + +for i, image in enumerate(digits.images[random_indices]): + plt.subplot(1, 5, i+1) + plt.axis('off') + plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') + plt.title("Label: %d" % digits.target[random_indices[i]]) +plt.show() +\end{minted} + + +% !split +\subsection*{Importing Keras and Tensorflow} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from keras.utils import to_categorical +from sklearn.model_selection import train_test_split + +# representation of labels +labels = to_categorical(labels) + +# split into train and test data +# one-liner from scikit-learn library +train_size = 0.8 +test_size = 1 - train_size +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size, + test_size=test_size) +\end{minted} + +% !split +\subsection*{Using TensorFlow backend} + +We need to define model and architecture and choose cost function and optmizer. +\begin{Verbatim}[numbers=none,fontsize=\fontsize{9pt}{9pt},baselinestretch=0.95] + +import tensorflow as tf + +class ConvolutionalNeuralNetworkTensorflow: + def __init__( + self, + X_train, + Y_train, + X_test, + Y_test, + n_filters=10, + n_neurons_connected=50, + n_categories=10, + receptive_field=3, + stride=1, + padding=1, + epochs=10, + batch_size=100, + eta=0.1, + lmbd=0.0): + + self.global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name='global_step') + + self.X_train = X_train + self.Y_train = Y_train + self.X_test = X_test + self.Y_test = Y_test + + self.n_inputs, self.input_width, self.input_height, self.depth = X_train.shape + + self.n_filters = n_filters + self.n_downsampled = int(self.input_width*self.input_height*n_filters / 4) + self.n_neurons_connected = n_neurons_connected + self.n_categories = n_categories + + self.receptive_field = receptive_field + self.stride = stride + self.strides = [stride, stride, stride, stride] + self.padding = padding + + self.epochs = epochs + self.batch_size = batch_size + self.iterations = self.n_inputs // self.batch_size + self.eta = eta + self.lmbd = lmbd + + self.create_placeholders() + self.create_CNN() + self.create_loss() + self.create_optimiser() + self.create_accuracy() + + def create_placeholders(self): + with tf.name_scope('data'): + self.X = tf.placeholder(tf.float32, shape=(None, self.input_width, self.input_height, self.depth), name='X_data') + self.Y = tf.placeholder(tf.float32, shape=(None, self.n_categories), name='Y_data') + + def create_CNN(self): + with tf.name_scope('CNN'): + + # Convolutional layer + self.W_conv = self.weight_variable([self.receptive_field, self.receptive_field, self.depth, self.n_filters], name='conv', dtype=tf.float32) + b_conv = self.weight_variable([self.n_filters], name='conv', dtype=tf.float32) + z_conv = tf.nn.conv2d(self.X, self.W_conv, self.strides, padding='SAME', name='conv') + b_conv + a_conv = tf.nn.relu(z_conv) + + # 2x2 max pooling + a_pool = tf.nn.max_pool(a_conv, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME', name='pool') + + # Fully connected layer + a_pool_flat = tf.reshape(a_pool, [-1, self.n_downsampled]) + self.W_fc = self.weight_variable([self.n_downsampled, self.n_neurons_connected], name='fc', dtype=tf.float32) + b_fc = self.bias_variable([self.n_neurons_connected], name='fc', dtype=tf.float32) + a_fc = tf.nn.relu(tf.matmul(a_pool_flat, self.W_fc) + b_fc) + + # Output layer + self.W_out = self.weight_variable([self.n_neurons_connected, self.n_categories], name='out', dtype=tf.float32) + b_out = self.bias_variable([self.n_categories], name='out', dtype=tf.float32) + self.z_out = tf.matmul(a_fc, self.W_out) + b_out + + def create_loss(self): + with tf.name_scope('loss'): + softmax_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.z_out)) + + regularizer_loss_conv = tf.nn.l2_loss(self.W_conv) + regularizer_loss_fc = tf.nn.l2_loss(self.W_fc) + regularizer_loss_out = tf.nn.l2_loss(self.W_out) + regularizer_loss = self.lmbd*(regularizer_loss_conv + regularizer_loss_fc + regularizer_loss_out) + + self.loss = softmax_loss + regularizer_loss + + def create_accuracy(self): + with tf.name_scope('accuracy'): + probabilities = tf.nn.softmax(self.z_out) + predictions = tf.argmax(probabilities, 1) + labels = tf.argmax(self.Y, 1) + + correct_predictions = tf.equal(predictions, labels) + correct_predictions = tf.cast(correct_predictions, tf.float32) + self.accuracy = tf.reduce_mean(correct_predictions) + + def create_optimiser(self): + with tf.name_scope('optimizer'): + self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.eta).minimize(self.loss, global_step=self.global_step) + + def weight_variable(self, shape, name='', dtype=tf.float32): + initial = tf.truncated_normal(shape, stddev=0.1) + return tf.Variable(initial, name=name, dtype=dtype) + + def bias_variable(self, shape, name='', dtype=tf.float32): + initial = tf.constant(0.1, shape=shape) + return tf.Variable(initial, name=name, dtype=dtype) + + def fit(self): + data_indices = np.arange(self.n_inputs) + + with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + for i in range(self.epochs): + for j in range(self.iterations): + chosen_datapoints = np.random.choice(data_indices, size=self.batch_size, replace=False) + batch_X, batch_Y = self.X_train[chosen_datapoints], self.Y_train[chosen_datapoints] + + sess.run([CNN.loss, CNN.optimizer], + feed_dict={CNN.X: batch_X, + CNN.Y: batch_Y}) + accuracy = sess.run(CNN.accuracy, + feed_dict={CNN.X: batch_X, + CNN.Y: batch_Y}) + step = sess.run(CNN.global_step) + + self.train_loss, self.train_accuracy = sess.run([CNN.loss, CNN.accuracy], + feed_dict={CNN.X: self.X_train, + CNN.Y: self.Y_train}) + + self.test_loss, self.test_accuracy = sess.run([CNN.loss, CNN.accuracy], + feed_dict={CNN.X: self.X_test, + CNN.Y: self.Y_test}) +\end{Verbatim} + +% !split +\subsection*{Train the model} + +We need now to train the model, evaluate it and test its performance on test data, and eventually include hyperparameters. +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +epochs = 100 +batch_size = 100 +n_filters = 10 +n_neurons_connected = 50 +n_categories = 10 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +CNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + CNN = ConvolutionalNeuralNetworkTensorflow(X_train, Y_train, X_test, Y_test, + n_filters=n_filters, n_neurons_connected=n_neurons_connected, + n_categories=n_categories, epochs=epochs, batch_size=batch_size, + eta=eta, lmbd=lmbd) + CNN.fit() + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Test accuracy: %.3f" % CNN.test_accuracy) + print() + + CNN_tf[i][j] = CNN +\end{minted} + +% !split +\subsection*{Visualizing the results} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + CNN = CNN_tf[i][j] + + train_accuracy[i][j] = CNN.train_accuracy + test_accuracy[i][j] = CNN.test_accuracy + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() +\end{minted} + +% !split +\subsection*{Running with Keras} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from keras.models import Sequential +from keras.layers.convolutional import Conv2D +from keras.layers.convolutional import MaxPooling2D +from keras.layers import Flatten +from keras.layers import Dense +from keras.regularizers import l2 +from keras.optimizers import SGD + +def create_convolutional_neural_network_keras(input_shape, receptive_field, + n_filters, n_neurons_connected, n_categories, + eta, lmbd): + model = Sequential() + model.add(Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same', + activation='relu', kernel_regularizer=l2(lmbd))) + model.add(MaxPooling2D(pool_size=(2, 2))) + model.add(Flatten()) + model.add(Dense(n_neurons_connected, activation='relu', kernel_regularizer=l2(lmbd))) + model.add(Dense(n_categories, activation='softmax', kernel_regularizer=l2(lmbd))) + + sgd = SGD(lr=eta) + model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) + + return model + +epochs = 100 +batch_size = 100 +input_shape = X_train.shape[1:4] +receptive_field = 3 +n_filters = 10 +n_neurons_connected = 50 +n_categories = 10 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +\end{minted} + +% !split +\subsection*{Final part} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + CNN = create_convolutional_neural_network_keras(input_shape, receptive_field, + n_filters, n_neurons_connected, n_categories, + eta, lmbd) + CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0) + scores = CNN.evaluate(X_test, Y_test) + + CNN_keras[i][j] = CNN + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Test accuracy: %.3f" % scores[1]) + print() +\end{minted} + +% !split +\subsection*{Final visualization} + +\begin{Verbatim}[numbers=none,fontsize=\fontsize{9pt}{9pt},baselinestretch=0.95] +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + CNN = CNN_keras[i][j] + + train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1] + test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1] + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() +\end{Verbatim} + +% !split +\subsection*{Fun links} + +\begin{enumerate} +\item \href{{https://arxiv.org/abs/1604.07316}}{Self-Driving cars using a convolutional neural network} + +\item \href{{https://deepdreamgenerator.com/}}{Abstract art using convolutional neural networks} +\end{enumerate} + +\noindent + +% ------------------- end of main content --------------- + +\end{document} + diff --git a/doc/src/CNN/figslides/cnn.jpeg b/doc/src/CNN/figslides/cnn.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..67bf3ced745f869c2069894442b02cb5c177b4c5 GIT binary patch literal 24437 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 M82{_%Lw|hy3$jmvj{pDw literal 0 HcmV?d00001 diff --git a/doc/src/CNN/figslides/nn.jpeg b/doc/src/CNN/figslides/nn.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0a495cfe42c3419a09341c20d02dd1c7a4f452c7 GIT binary patch literal 68873 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 literal 0 HcmV?d00001 diff --git a/doc/src/CNN/make.sh b/doc/src/CNN/make.sh new file mode 100755 index 000000000..d908b90b9 --- /dev/null +++ b/doc/src/CNN/make.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -x + +function system { + "$@" + if [ $? -ne 0 ]; then + echo "make.sh: unsuccessful command $@" + echo "abort!" + exit 1 + fi +} + +if [ $# -eq 0 ]; then +echo 'bash make.sh slides1|slides2' +exit 1 +fi + +name=$1 +rm -f *.tar.gz + +opt="--encoding=utf-8" +# Note: Makefile examples contain constructions like ${PROG} which +# looks like Mako constructions, but they are not. Use --no_mako +# to turn off Mako processing. +opt="--no_mako" + +rm -f *.aux + + +html=${name}-reveal +system doconce format html $name --pygments_html_style=perldoc --keep_pygments_html_bg --html_links_in_new_window --html_output=$html $opt +system doconce slides_html $html reveal --html_slide_theme=beige + +# Plain HTML documents + +html=${name}-solarized +system doconce format html $name --pygments_html_style=perldoc --html_style=solarized3 --html_links_in_new_window --html_output=$html $opt +system doconce split_html $html.html --method=space10 + +html=${name} +system doconce format html $name --pygments_html_style=default --html_style=bloodish --html_links_in_new_window --html_output=$html $opt +system doconce split_html $html.html --method=space10 + +# Bootstrap style +html=${name}-bs +system doconce format html $name --html_style=bootstrap --pygments_html_style=default --html_admon=bootstrap_panel --html_output=$html $opt +system doconce split_html $html.html --method=split --pagination --nav_button=bottom + +# IPython notebook +system doconce format ipynb $name $opt + + +# Ordinary plain LaTeX document +rm -f *.aux # important after beamer +system doconce format pdflatex $name --minted_latex_style=trac --latex_admon=paragraph $opt +system doconce ptex2tex $name envir=minted +# Add special packages +doconce subst "% Add user's preamble" "\g<1>\n\\usepackage{simplewick}" $name.tex +doconce replace 'section{' 'section*{' $name.tex +pdflatex -shell-escape $name +pdflatex -shell-escape $name +mv -f $name.pdf ${name}-minted.pdf +cp $name.tex ${name}-plain-minted.tex + + + +# Publish +dest=../../pub +if [ ! -d $dest/$name ]; then +mkdir $dest/$name +mkdir $dest/$name/pdf +mkdir $dest/$name/html +mkdir $dest/$name/ipynb +fi +cp ${name}*.pdf $dest/$name/pdf +cp -r ${name}*.html ._${name}*.html reveal.js $dest/$name/html + +# Figures: cannot just copy link, need to physically copy the files +if [ -d fig-${name} ]; then +if [ ! -d $dest/$name/html/fig-$name ]; then +mkdir $dest/$name/html/fig-$name +fi +cp -r fig-${name}/* $dest/$name/html/fig-$name +fi + +cp ${name}.ipynb $dest/$name/ipynb +ipynb_tarfile=ipynb-${name}-src.tar.gz +if [ ! -f ${ipynb_tarfile} ]; then +cat > README.txt < (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' + + ' * http://lab.hakim.se/reveal-js\n' + + ' * MIT licensed\n' + + ' *\n' + + ' * Copyright (C) 2014 Hakim El Hattab, http://hakim.se\n' + + ' */' + }, + + qunit: { + files: [ 'test/*.html' ] + }, + + uglify: { + options: { + banner: '<%= meta.banner %>\n' + }, + build: { + src: 'js/reveal.js', + dest: 'js/reveal.min.js' + } + }, + + cssmin: { + compress: { + files: { + 'css/reveal.min.css': [ 'css/reveal.css' ] + } + } + }, + + sass: { + main: { + files: { + 'css/theme/darkgray.css': 'css/theme/source/darkgray.scss', + 'css/theme/beigesmall.css': 'css/theme/source/beigesmall.scss', + 'css/theme/cbc.css': 'css/theme/source/cbc.scss', + 'css/theme/default.css': 'css/theme/source/default.scss', + 'css/theme/beige.css': 'css/theme/source/beige.scss', + 'css/theme/night.css': 'css/theme/source/night.scss', + 'css/theme/serif.css': 'css/theme/source/serif.scss', + 'css/theme/simple.css': 'css/theme/source/simple.scss', + 'css/theme/sky.css': 'css/theme/source/sky.scss', + 'css/theme/moon.css': 'css/theme/source/moon.scss', + 'css/theme/solarized.css': 'css/theme/source/solarized.scss', + 'css/theme/blood.css': 'css/theme/source/blood.scss' + } + } + }, + + jshint: { + options: { + curly: false, + eqeqeq: true, + immed: true, + latedef: true, + newcap: true, + noarg: true, + sub: true, + undef: true, + eqnull: true, + browser: true, + expr: true, + globals: { + head: false, + module: false, + console: false, + unescape: false + } + }, + files: [ 'Gruntfile.js', 'js/reveal.js' ] + }, + + connect: { + server: { + options: { + port: port, + base: '.' + } + } + }, + + zip: { + 'reveal-js-presentation.zip': [ + 'index.html', + 'css/**', + 'js/**', + 'lib/**', + 'images/**', + 'plugin/**' + ] + }, + + watch: { + main: { + files: [ 'Gruntfile.js', 'js/reveal.js', 'css/reveal.css' ], + tasks: 'default' + }, + theme: { + files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ], + tasks: 'themes' + } + } + + }); + + // Dependencies + grunt.loadNpmTasks( 'grunt-contrib-qunit' ); + grunt.loadNpmTasks( 'grunt-contrib-jshint' ); + grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); + grunt.loadNpmTasks( 'grunt-contrib-uglify' ); + grunt.loadNpmTasks( 'grunt-contrib-watch' ); + grunt.loadNpmTasks( 'grunt-contrib-sass' ); + grunt.loadNpmTasks( 'grunt-contrib-connect' ); + grunt.loadNpmTasks( 'grunt-zip' ); + + // Default task + grunt.registerTask( 'default', [ 'jshint', 'cssmin', 'uglify', 'qunit' ] ); + + // Theme task + grunt.registerTask( 'themes', [ 'sass' ] ); + + // Package presentation to archive + grunt.registerTask( 'package', [ 'default', 'zip' ] ); + + // Serve presentation locally + grunt.registerTask( 'serve', [ 'connect', 'watch' ] ); + + // Run tests + grunt.registerTask( 'test', [ 'jshint', 'qunit' ] ); + +}; diff --git a/doc/src/CNN/reveal.js/LICENSE b/doc/src/CNN/reveal.js/LICENSE new file mode 100644 index 000000000..09623076f --- /dev/null +++ b/doc/src/CNN/reveal.js/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2015 Hakim El Hattab, http://hakim.se + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/doc/src/CNN/reveal.js/README.md b/doc/src/CNN/reveal.js/README.md new file mode 100644 index 000000000..573b19597 --- /dev/null +++ b/doc/src/CNN/reveal.js/README.md @@ -0,0 +1,1052 @@ +# reveal.js [![Build Status](https://travis-ci.org/hakimel/reveal.js.svg?branch=master)](https://travis-ci.org/hakimel/reveal.js) + +A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://lab.hakim.se/reveal-js/). + +reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [Markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). It's best viewed in a modern browser but [fallbacks](https://github.com/hakimel/reveal.js/wiki/Browser-Support) are available to make sure your presentation can still be viewed elsewhere. + + +#### More reading: +- [Installation](#installation): Step-by-step instructions for getting reveal.js running on your computer. +- [Changelog](https://github.com/hakimel/reveal.js/releases): Up-to-date version history. +- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own! +- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Browser-Support): Explanation of browser support and fallbacks. +- [Plugins](https://github.com/hakimel/reveal.js/wiki/Plugins,-Tools-and-Hardware): A list of plugins that can be used to extend reveal.js. + +## Online Editor + +Presentations are written using HTML or Markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at [http://slides.com](http://slides.com). + + +## Instructions + +### Markup + +Markup hierarchy needs to be ``
`` where the ``
`` represents one slide and can be repeated indefinitely. If you place multiple ``
``'s inside of another ``
`` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and it will be included in the horizontal sequence. For example: + +```html +
+
+
Single Horizontal Slide
+
+
Vertical Slide 1
+
Vertical Slide 2
+
+
+
+``` + +### Markdown + +It's possible to write your slides using Markdown. To enable Markdown, add the ```data-markdown``` attribute to your ```
``` elements and wrap the contents in a ``` +
+``` + +#### External Markdown + +You can write your content as a separate file and have reveal.js load it at runtime. Note the separator arguments which determine how slides are delimited in the external file. The ```data-charset``` attribute is optional and specifies which charset to use when loading the external file. + +When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup). + +```html +
+
+``` + +#### Element Attributes + +Special syntax (in html comment) is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things. + +```html +
+ +
+``` + +#### Slide Attributes + +Special syntax (in html comment) is available for adding attributes to the slide `
` elements generated by your Markdown. + +```html +
+ +
+``` + + +### Configuration + +At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below. + +```javascript +Reveal.initialize({ + + // Display controls in the bottom right corner + controls: true, + + // Display a presentation progress bar + progress: true, + + // Display the page number of the current slide + slideNumber: false, + + // Push each slide change to the browser history + history: false, + + // Enable keyboard shortcuts for navigation + keyboard: true, + + // Enable the slide overview mode + overview: true, + + // Vertical centering of slides + center: true, + + // Enables touch navigation on devices with touch input + touch: true, + + // Loop the presentation + loop: false, + + // Change the presentation direction to be RTL + rtl: false, + + // Turns fragments on and off globally + fragments: true, + + // Flags if the presentation is running in an embedded mode, + // i.e. contained within a limited portion of the screen + embedded: false, + + // Flags if we should show a help overlay when the questionmark + // key is pressed + help: true, + + // Number of milliseconds between automatically proceeding to the + // next slide, disabled when set to 0, this value can be overwritten + // by using a data-autoslide attribute on your slides + autoSlide: 0, + + // Stop auto-sliding after user input + autoSlideStoppable: true, + + // Enable slide navigation via mouse wheel + mouseWheel: false, + + // Hides the address bar on mobile devices + hideAddressBar: true, + + // Opens links in an iframe preview overlay + previewLinks: false, + + // Transition style + transition: 'default', // none/fade/slide/convex/concave/zoom + + // Transition speed + transitionSpeed: 'default', // default/fast/slow + + // Transition style for full page slide backgrounds + backgroundTransition: 'default', // none/fade/slide/convex/concave/zoom + + // Number of slides away from the current that are visible + viewDistance: 3, + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" + + // Amount to move parallax background (horizontal and vertical) on slide change + // Number, e.g. 100 + parallaxBackgroundHorizontal: '', + parallaxBackgroundVertical: '' + +}); +``` + + +The configuration can be updated after initialization using the ```configure``` method: + +```javascript +// Turn autoSlide off +Reveal.configure({ autoSlide: 0 }); + +// Start auto-sliding every 5s +Reveal.configure({ autoSlide: 5000 }); +``` + + +### Dependencies + +Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example: + +```javascript +Reveal.initialize({ + dependencies: [ + // Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/ + { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } }, + + // Interpret Markdown in
elements + { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + + // Syntax highlight for elements + { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, + + // Zoom in and out with Alt+click + { src: 'plugin/zoom-js/zoom.js', async: true }, + + // Speaker notes + { src: 'plugin/notes/notes.js', async: true }, + + // Remote control your reveal.js presentation using a touch device + { src: 'plugin/remotes/remotes.js', async: true }, + + // MathJax + { src: 'plugin/math/math.js', async: true } + ] +}); +``` + +You can add your own extensions using the same syntax. The following properties are available for each dependency object: +- **src**: Path to the script to load +- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false +- **callback**: [optional] Function to execute when the script has loaded +- **condition**: [optional] Function which must return true for the script to be loaded + + +### Ready Event + +A 'ready' event is fired when reveal.js has loaded all non-async dependencies and is ready to start navigating. To check if reveal.js is already 'ready' you can call `Reveal.isReady()`. + +```javascript +Reveal.addEventListener( 'ready', function( event ) { + // event.currentSlide, event.indexh, event.indexv +} ); +``` + + +### Presentation Size + +All presentations have a normal size, that is the resolution at which they are authored. The framework will automatically scale presentations uniformly based on this size to ensure that everything fits on any given display or viewport. + +See below for a list of configuration options related to sizing, including default values: + +```javascript +Reveal.initialize({ + + ... + + // The "normal" size of the presentation, aspect ratio will be preserved + // when the presentation is scaled to fit different resolutions. Can be + // specified using percentage units. + width: 960, + height: 700, + + // Factor of the display size that should remain empty around the content + margin: 0.1, + + // Bounds for smallest/largest possible scale to apply to content + minScale: 0.2, + maxScale: 1.5 + +}); +``` + + +### Auto-sliding + +Presentations can be configured to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides: + +```javascript +// Slide every five seconds +Reveal.configure({ + autoSlide: 5000 +}); +``` +When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Alternatively, sliding can be paused or resumed by pressing »a« on the keyboard. Sliding is paused automatically as soon as the user starts navigating. You can disable these controls by specifying ```autoSlideStoppable: false``` in your reveal.js config. + +You can also override the slide duration for individual slides and fragments by using the ```data-autoslide``` attribute: + +```html +
+

After 2 seconds the first fragment will be shown.

+

After 10 seconds the next fragment will be shown.

+

Now, the fragment is displayed for 2 seconds before the next slide is shown.

+
+``` + +Whenever the auto-slide mode is resumed or paused the ```autoslideresumed``` and ```autoslidepaused``` events are fired. + + +### Keyboard Bindings + +If you're unhappy with any of the default keyboard bindings you can override them using the ```keyboard``` config option: + +```javascript +Reveal.configure({ + keyboard: { + 13: 'next', // go to the next slide when the ENTER key is pressed + 27: function() {}, // do something custom when ESC is pressed + 32: null // don't do anything when SPACE is pressed (i.e. disable a reveal.js default binding) + } +}); +``` + +### Lazy Loading + +When working on presentation with a lot of media or iframe content it's important to load lazily. Lazy loading means that reveal.js will only load content for the few slides nearest to the current slide. The number of slides that are preloaded is determined by the `viewDistance` configuration option. + +To enable lazy loading all you need to do is change your "src" attributes to "data-src" as shown below. This is supported for image, video, audio and iframe elements. Lazy loaded iframes will also unload when the containing slide is no longer visible. + +```html +
+ + + +
+``` + + +### API + +The ``Reveal`` object exposes a JavaScript API for controlling navigation and reading state: + +```javascript +// Navigation +Reveal.slide( indexh, indexv, indexf ); +Reveal.left(); +Reveal.right(); +Reveal.up(); +Reveal.down(); +Reveal.prev(); +Reveal.next(); +Reveal.prevFragment(); +Reveal.nextFragment(); + +// Toggle presentation states, optionally pass true/false to force on/off +Reveal.toggleOverview(); +Reveal.togglePause(); +Reveal.toggleAutoSlide(); + +// Change a config value at runtime +Reveal.configure({ controls: true }); + +// Returns the present configuration options +Reveal.getConfig(); + +// Fetch the current scale of the presentation +Reveal.getScale(); + +// Retrieves the previous and current slide elements +Reveal.getPreviousSlide(); +Reveal.getCurrentSlide(); + +Reveal.getIndices(); // { h: 0, v: 0 } } +Reveal.getProgress(); // 0-1 +Reveal.getTotalSlides(); + +// State checks +Reveal.isFirstSlide(); +Reveal.isLastSlide(); +Reveal.isOverview(); +Reveal.isPaused(); +Reveal.isAutoSliding(); +``` + +### Slide Changed Event + +A 'slidechanged' event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes. + +Some libraries, like MathJax (see [#226](https://github.com/hakimel/reveal.js/issues/226#issuecomment-10261609)), get confused by the transforms and display states of slides. Often times, this can be fixed by calling their update or render function from this callback. + +```javascript +Reveal.addEventListener( 'slidechanged', function( event ) { + // event.previousSlide, event.currentSlide, event.indexh, event.indexv +} ); +``` + +### Presentation State + +The presentation's current state can be fetched by using the `getState` method. A state object contains all of the information required to put the presentation back as it was when `getState` was first called. Sort of like a snapshot. It's a simple object that can easily be stringified and persisted or sent over the wire. + +```javascript +Reveal.slide( 1 ); +// we're on slide 1 + +var state = Reveal.getState(); + +Reveal.slide( 3 ); +// we're on slide 3 + +Reveal.setState( state ); +// we're back on slide 1 +``` + +### Slide States + +If you set ``data-state="somestate"`` on a slide ``
``, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide. + +Furthermore you can also listen to these changes in state via JavaScript: + +```javascript +Reveal.addEventListener( 'somestate', function() { + // TODO: Sprinkle magic +}, false ); +``` + +### Slide Backgrounds + +Slides are contained within a limited portion of the screen by default to allow them to fit any display and scale uniformly. You can apply full page backgrounds outside of the slide area by adding a ```data-background``` attribute to your ```
``` elements. Four different types of backgrounds are supported: color, image, video and iframe. Below are a few examples. + +```html +
+

All CSS color formats are supported, like rgba() or hsl().

+
+
+

This slide will have a full-size background image.

+
+
+

This background image will be sized to 100px and repeated.

+
+
+

Video. Multiple sources can be defined using a comma separated list. Video will loop when the data-background-video-loop attribute is provided.

+
+
+

Embeds a web page as a background. Note that the page won't be interactive.

+
+``` + +Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing ```backgroundTransition: 'slide'``` to the ```Reveal.initialize()``` call. Alternatively you can set ```data-background-transition``` on any section with a background to override that specific transition. + + +### Parallax Background + +If you want to use a parallax scrolling background, set the first two config properties below when initializing reveal.js (the other two are optional). + +```javascript +Reveal.initialize({ + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto) + + // Amount of pixels to move the parallax background per slide step, + // a value of 0 disables movement along the given axis + // These are optional, if they aren't specified they'll be calculated automatically + parallaxBackgroundHorizontal: 200, + parallaxBackgroundVertical: 50 + +}); +``` + +Make sure that the background size is much bigger than screen size to allow for some scrolling. [View example](http://lab.hakim.se/reveal-js/?parallaxBackgroundImage=https%3A%2F%2Fs3.amazonaws.com%2Fhakim-static%2Freveal-js%2Freveal-parallax-1.jpg¶llaxBackgroundSize=2100px%20900px). + + + +### Slide Transitions +The global presentation transition is set using the ```transition``` config value. You can override the global transition for a specific slide by using the ```data-transition``` attribute: + +```html +
+

This slide will override the presentation transition and zoom!

+
+ +
+

Choose from three transition speeds: default, fast or slow!

+
+``` + +You can also use different in and out transitions for the same slide: + +```html +
+ The train goes on … +
+
+ and on … +
+
+ and stops. +
+
+ (Passengers entering and leaving) +
+
+ And it starts again. +
+``` + + +Note that this does not work with the page and cube transitions. + + +### Internal links + +It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (```
```): + +```html +Link +Link +``` + +You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an ```enabled``` class when it's a valid navigation route based on the current slide. + +```html + + + + + + +``` + + +### Fragments +Fragments are used to highlight individual elements on a slide. Every element with the class ```fragment``` will be stepped through before moving on to the next slide. Here's an example: http://lab.hakim.se/reveal-js/#/fragments + +The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment: + +```html +
+

grow

+

shrink

+

fade-out

+

visible only once

+

blue only once

+

highlight-red

+

highlight-green

+

highlight-blue

+
+``` + +Multiple fragments can be applied to the same element sequentially by wrapping it, this will fade in the text on the first step and fade it back out on the second. + +```html +
+ + I'll fade in, then out + +
+``` + +The display order of fragments can be controlled using the ```data-fragment-index``` attribute. + +```html +
+

Appears last

+

Appears first

+

Appears second

+
+``` + +### Fragment events + +When a slide fragment is either shown or hidden reveal.js will dispatch an event. + +Some libraries, like MathJax (see #505), get confused by the initially hidden fragment elements. Often times this can be fixed by calling their update or render function from this callback. + +```javascript +Reveal.addEventListener( 'fragmentshown', function( event ) { + // event.fragment = the fragment DOM element +} ); +Reveal.addEventListener( 'fragmenthidden', function( event ) { + // event.fragment = the fragment DOM element +} ); +``` + +### Code syntax highlighting + +By default, Reveal is configured with [highlight.js](http://softwaremaniacs.org/soft/highlight/en/) for code syntax highlighting. Below is an example with clojure code that will be syntax highlighted. When the `data-trim` attribute is present surrounding whitespace is automatically removed. + +```html +
+

+(def lazy-fib
+  (concat
+   [0 1]
+   ((fn rfib [a b]
+        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
+	
+
+``` + +### Slide number +If you would like to display the page number of the current slide you can do so using the ```slideNumber``` configuration value. + +```javascript +// Shows the slide number using default formatting +Reveal.configure({ slideNumber: true }); + +// Slide number formatting can be configured using these variables: +// h: current slide's horizontal index +// v: current slide's vertical index +// c: current slide index (flattened) +// t: total number of slides (flattened) +Reveal.configure({ slideNumber: 'c / t' }); + +``` + + +### Overview mode + +Press "Esc" or "o" keys to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides, +as if you were at 1,000 feet above your presentation. The overview mode comes with a few API hooks: + +```javascript +Reveal.addEventListener( 'overviewshown', function( event ) { /* ... */ } ); +Reveal.addEventListener( 'overviewhidden', function( event ) { /* ... */ } ); + +// Toggle the overview mode programmatically +Reveal.toggleOverview(); +``` + +### Fullscreen mode +Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode. + + +### Embedded media +Embedded HTML5 `