From 71a7fc9be1ab364bdbf9ae93b00e2203dfe5d966 Mon Sep 17 00:00:00 2001 From: barry-jin Date: Thu, 23 Sep 2021 11:40:36 -0700 Subject: [PATCH 1/2] update examples --- LICENSE | 1 - example/adversary/adversary_generation.ipynb | 222 +- example/autoencoder/README.md | 37 - .../convolutional_autoencoder.ipynb | 538 ----- example/automatic-mixed-precision/README.md | 29 - .../amp_model_conversion.py | 201 -- example/bi-lstm-sort/bi-lstm-sort.ipynb | 301 ++- example/gluon/actor_critic/actor_critic.py | 28 +- example/gluon/audio/README.md | 115 - example/gluon/audio/transforms.py | 205 -- example/gluon/audio/urban_sounds/README.md | 117 - example/gluon/audio/urban_sounds/datasets.py | 179 -- example/gluon/audio/urban_sounds/model.py | 33 - example/gluon/audio/urban_sounds/predict.py | 92 - .../gluon/audio/urban_sounds/requirements.txt | 2 - example/gluon/audio/urban_sounds/train.py | 157 -- example/gluon/data.py | 10 +- example/gluon/dc_gan/README.md | 69 - example/gluon/dc_gan/__init__.py | 16 - example/gluon/dc_gan/dcgan.py | 355 --- example/gluon/dc_gan/inception_score.py | 110 - example/gluon/embedding_learning/README.md | 93 - example/gluon/embedding_learning/data.py | 158 -- .../embedding_learning/get_cub200_data.sh | 34 - example/gluon/embedding_learning/model.py | 230 -- example/gluon/embedding_learning/train.py | 255 --- .../kaggle_k_fold_cross_validation.py | 25 +- example/gluon/lipnet/.gitignore | 3 - example/gluon/lipnet/BeamSearch.py | 170 -- example/gluon/lipnet/README.md | 254 --- example/gluon/lipnet/asset/mouth_000.png | Bin 6372 -> 0 bytes example/gluon/lipnet/asset/mouth_001.png | Bin 6826 -> 0 bytes example/gluon/lipnet/asset/mouth_074.png | Bin 6864 -> 0 bytes .../gluon/lipnet/asset/network_structure.png | Bin 183728 -> 0 bytes example/gluon/lipnet/asset/s2_bbbf7p_000.png | Bin 35141 -> 0 bytes example/gluon/lipnet/asset/s2_bbbf7p_001.png | Bin 36768 -> 0 bytes example/gluon/lipnet/asset/s2_bbbf7p_074.png | Bin 38248 -> 0 bytes example/gluon/lipnet/checkpoint/__init__.py | 16 - example/gluon/lipnet/data_loader.py | 94 - example/gluon/lipnet/infer.py | 52 - example/gluon/lipnet/main.py | 47 - example/gluon/lipnet/models/__init__.py | 16 - example/gluon/lipnet/models/network.py | 73 - example/gluon/lipnet/requirements.txt | 7 - example/gluon/lipnet/tests/test_beamsearch.py | 42 - example/gluon/lipnet/trainer.py | 232 -- example/gluon/lipnet/utils/__init__.py | 16 - example/gluon/lipnet/utils/align.py | 83 - example/gluon/lipnet/utils/common.py | 80 - example/gluon/lipnet/utils/download_data.py | 112 - example/gluon/lipnet/utils/multi.py | 104 - example/gluon/lipnet/utils/preprocess_data.py | 262 --- .../gluon/lipnet/utils/run_preprocess.ipynb | 194 -- .../utils/run_preprocess_single_process.ipynb | 360 --- example/gluon/lstm_crf/README.md | 36 - example/gluon/lstm_crf/lstm_crf.py | 241 -- example/gluon/mnist/mnist.py | 8 +- example/gluon/sn_gan/README.md | 61 - example/gluon/sn_gan/data.py | 42 - example/gluon/sn_gan/model.py | 139 -- example/gluon/sn_gan/sn_gan_output.png | Bin 404415 -> 0 bytes example/gluon/sn_gan/train.py | 149 -- example/gluon/sn_gan/utils.py | 49 - example/gluon/style_transfer/README.md | 134 -- example/gluon/style_transfer/data.py | 125 -- .../dataset/download_dataset.py | 37 - .../gluon/style_transfer/download_images.py | 20 - example/gluon/style_transfer/main.py | 231 -- .../style_transfer/models/download_model.py | 31 - example/gluon/style_transfer/net.py | 296 --- example/gluon/style_transfer/option.py | 109 - example/gluon/style_transfer/utils.py | 229 -- .../super_resolution/super_resolution.py | 22 +- example/gluon/tree_lstm/LICENSE | 21 - example/gluon/tree_lstm/README.md | 46 - example/gluon/tree_lstm/dataset.cPickle | Bin 17896237 -> 0 bytes example/gluon/tree_lstm/dataset.py | 231 -- .../gluon/tree_lstm/fetch_and_preprocess.sh | 25 - .../lib/CollapseUnaryTransformer.java | 53 - .../tree_lstm/lib/ConstituencyParse.java | 253 --- .../gluon/tree_lstm/lib/DependencyParse.java | 159 -- example/gluon/tree_lstm/main.py | 191 -- example/gluon/tree_lstm/scripts/download.py | 106 - .../tree_lstm/scripts/preprocess-sick.py | 122 -- example/gluon/tree_lstm/tree_lstm.py | 154 -- example/gluon/word_language_model/README.md | 104 - .../gluon/word_language_model/model-graph.png | Bin 126048 -> 0 bytes example/gluon/word_language_model/model.py | 64 - example/gluon/word_language_model/train.py | 225 -- example/multi-task/multi-task-learning.ipynb | 287 ++- example/multi_threaded_inference/Makefile | 65 - example/multi_threaded_inference/README.md | 19 - .../multi_threaded_inference.cc | 356 --- .../quantization/imagenet_gen_qsym_onednn.py | 2 +- example/quantization/imagenet_inference.py | 4 +- example/recommenders/demo1-MF.ipynb | 1195 +++------- example/recommenders/demo2-dssm.ipynb | 1936 ++--------------- example/recommenders/matrix_fact.py | 2 +- example/recommenders/movielens_data.py | 6 +- .../restricted-boltzmann-machine/README.md | 82 - .../binary_rbm.py | 253 --- .../binary_rbm_gluon.py | 142 -- .../restricted-boltzmann-machine/samples.png | Bin 191570 -> 0 bytes example/rnn/README.md | 35 - .../bucket_R/aclImdb_lstm_classification.R | 92 - .../bucket_R/data_preprocessing_seq_to_one.R | 191 -- 106 files changed, 882 insertions(+), 13327 deletions(-) delete mode 100644 example/autoencoder/README.md delete mode 100644 example/autoencoder/convolutional_autoencoder.ipynb delete mode 100644 example/automatic-mixed-precision/README.md delete mode 100644 example/automatic-mixed-precision/amp_model_conversion.py delete mode 100644 example/gluon/audio/README.md delete mode 100644 example/gluon/audio/transforms.py delete mode 100644 example/gluon/audio/urban_sounds/README.md delete mode 100644 example/gluon/audio/urban_sounds/datasets.py delete mode 100644 example/gluon/audio/urban_sounds/model.py delete mode 100644 example/gluon/audio/urban_sounds/predict.py delete mode 100644 example/gluon/audio/urban_sounds/requirements.txt delete mode 100644 example/gluon/audio/urban_sounds/train.py delete mode 100644 example/gluon/dc_gan/README.md delete mode 100644 example/gluon/dc_gan/__init__.py delete mode 100644 example/gluon/dc_gan/dcgan.py delete mode 100644 example/gluon/dc_gan/inception_score.py delete mode 100644 example/gluon/embedding_learning/README.md delete mode 100644 example/gluon/embedding_learning/data.py delete mode 100755 example/gluon/embedding_learning/get_cub200_data.sh delete mode 100644 example/gluon/embedding_learning/model.py delete mode 100644 example/gluon/embedding_learning/train.py delete mode 100644 example/gluon/lipnet/.gitignore delete mode 100644 example/gluon/lipnet/BeamSearch.py delete mode 100644 example/gluon/lipnet/README.md delete mode 100644 example/gluon/lipnet/asset/mouth_000.png delete mode 100644 example/gluon/lipnet/asset/mouth_001.png delete mode 100644 example/gluon/lipnet/asset/mouth_074.png delete mode 100644 example/gluon/lipnet/asset/network_structure.png delete mode 100644 example/gluon/lipnet/asset/s2_bbbf7p_000.png delete mode 100644 example/gluon/lipnet/asset/s2_bbbf7p_001.png delete mode 100644 example/gluon/lipnet/asset/s2_bbbf7p_074.png delete mode 100644 example/gluon/lipnet/checkpoint/__init__.py delete mode 100644 example/gluon/lipnet/data_loader.py delete mode 100644 example/gluon/lipnet/infer.py delete mode 100644 example/gluon/lipnet/main.py delete mode 100644 example/gluon/lipnet/models/__init__.py delete mode 100644 example/gluon/lipnet/models/network.py delete mode 100644 example/gluon/lipnet/requirements.txt delete mode 100644 example/gluon/lipnet/tests/test_beamsearch.py delete mode 100644 example/gluon/lipnet/trainer.py delete mode 100644 example/gluon/lipnet/utils/__init__.py delete mode 100644 example/gluon/lipnet/utils/align.py delete mode 100644 example/gluon/lipnet/utils/common.py delete mode 100644 example/gluon/lipnet/utils/download_data.py delete mode 100644 example/gluon/lipnet/utils/multi.py delete mode 100644 example/gluon/lipnet/utils/preprocess_data.py delete mode 100644 example/gluon/lipnet/utils/run_preprocess.ipynb delete mode 100644 example/gluon/lipnet/utils/run_preprocess_single_process.ipynb delete mode 100644 example/gluon/lstm_crf/README.md delete mode 100644 example/gluon/lstm_crf/lstm_crf.py delete mode 100644 example/gluon/sn_gan/README.md delete mode 100644 example/gluon/sn_gan/data.py delete mode 100644 example/gluon/sn_gan/model.py delete mode 100644 example/gluon/sn_gan/sn_gan_output.png delete mode 100644 example/gluon/sn_gan/train.py delete mode 100644 example/gluon/sn_gan/utils.py delete mode 100644 example/gluon/style_transfer/README.md delete mode 100644 example/gluon/style_transfer/data.py delete mode 100644 example/gluon/style_transfer/dataset/download_dataset.py delete mode 100644 example/gluon/style_transfer/download_images.py delete mode 100644 example/gluon/style_transfer/main.py delete mode 100644 example/gluon/style_transfer/models/download_model.py delete mode 100644 example/gluon/style_transfer/net.py delete mode 100644 example/gluon/style_transfer/option.py delete mode 100644 example/gluon/style_transfer/utils.py delete mode 100644 example/gluon/tree_lstm/LICENSE delete mode 100644 example/gluon/tree_lstm/README.md delete mode 100644 example/gluon/tree_lstm/dataset.cPickle delete mode 100644 example/gluon/tree_lstm/dataset.py delete mode 100755 example/gluon/tree_lstm/fetch_and_preprocess.sh delete mode 100644 example/gluon/tree_lstm/lib/CollapseUnaryTransformer.java delete mode 100644 example/gluon/tree_lstm/lib/ConstituencyParse.java delete mode 100644 example/gluon/tree_lstm/lib/DependencyParse.java delete mode 100644 example/gluon/tree_lstm/main.py delete mode 100644 example/gluon/tree_lstm/scripts/download.py delete mode 100644 example/gluon/tree_lstm/scripts/preprocess-sick.py delete mode 100644 example/gluon/tree_lstm/tree_lstm.py delete mode 100644 example/gluon/word_language_model/README.md delete mode 100644 example/gluon/word_language_model/model-graph.png delete mode 100644 example/gluon/word_language_model/model.py delete mode 100644 example/gluon/word_language_model/train.py delete mode 100644 example/multi_threaded_inference/Makefile delete mode 100644 example/multi_threaded_inference/README.md delete mode 100644 example/multi_threaded_inference/multi_threaded_inference.cc delete mode 100644 example/restricted-boltzmann-machine/README.md delete mode 100644 example/restricted-boltzmann-machine/binary_rbm.py delete mode 100644 example/restricted-boltzmann-machine/binary_rbm_gluon.py delete mode 100644 example/restricted-boltzmann-machine/samples.png delete mode 100644 example/rnn/README.md delete mode 100644 example/rnn/bucket_R/aclImdb_lstm_classification.R delete mode 100644 example/rnn/bucket_R/data_preprocessing_seq_to_one.R diff --git a/LICENSE b/LICENSE index 1eca980dbf93..ded6a01562bb 100644 --- a/LICENSE +++ b/LICENSE @@ -242,7 +242,6 @@ 3rdparty/miniz/miniz.c 3rdparty/miniz/miniz.h - example/gluon/tree_lstm 3rdparty/tvm/3rdparty/cma 3rdparty/onnx-tensorrt 3rdparty/onnx-tensorrt/third_party/onnx diff --git a/example/adversary/adversary_generation.ipynb b/example/adversary/adversary_generation.ipynb index 0dda371a8f41..9f8cf993d446 100644 --- a/example/adversary/adversary_generation.ipynb +++ b/example/adversary/adversary_generation.ipynb @@ -2,7 +2,6 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, "source": [ "# Fast Sign Adversary Generation Example\n", "\n", @@ -10,15 +9,12 @@ "\n", "[1] Goodfellow, Ian J., Jonathon Shlens, and Christian Szegedy. \"Explaining and harnessing adversarial examples.\" arXiv preprint arXiv:1412.6572 (2014).\n", "https://arxiv.org/abs/1412.6572" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [], "source": [ "%matplotlib inline\n", "import mxnet as mx\n", @@ -28,39 +24,41 @@ "import matplotlib.cm as cm\n", "\n", "from mxnet import gluon" - ] + ], + "outputs": [], + "metadata": { + "collapsed": false + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Build simple CNN network for solving the MNIST dataset digit recognition task" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": true - }, - "outputs": [], "source": [ "ctx = mx.gpu() if mx.context.num_gpus() else mx.cpu()\n", "batch_size = 128" - ] + ], + "outputs": [], + "metadata": { + "collapsed": true + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Data Loading" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 3, - "metadata": {}, - "outputs": [], "source": [ "transform = lambda x,y: (x.transpose((2,0,1)).astype('float32')/255., y)\n", "\n", @@ -69,22 +67,20 @@ "\n", "train_data = gluon.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=5)\n", "test_data = gluon.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Create the network" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], "source": [ "net = gluon.nn.HybridSequential()\n", "with net.name_scope():\n", @@ -97,73 +93,63 @@ " gluon.nn.Dense(500, activation='tanh'),\n", " gluon.nn.Dense(10)\n", " )" - ] + ], + "outputs": [], + "metadata": { + "collapsed": true + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Initialize training" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], "source": [ "net.initialize(mx.initializer.Uniform(), ctx=ctx)\n", "net.hybridize()" - ] + ], + "outputs": [], + "metadata": { + "collapsed": true + } }, { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], "source": [ "loss = gluon.loss.SoftmaxCELoss()" - ] + ], + "outputs": [], + "metadata": { + "collapsed": true + } }, { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], "source": [ "trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.1, 'momentum':0.95})" - ] + ], + "outputs": [], + "metadata": { + "collapsed": true + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Training loop" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train Accuracy: 0.92\t Train Loss: 0.32142\n", - "Train Accuracy: 0.97\t Train Loss: 0.16773\n", - "Train Accuracy: 0.97\t Train Loss: 0.14660\n" - ] - } - ], "source": [ "epoch = 3\n", "for e in range(epoch):\n", @@ -180,35 +166,39 @@ " l.backward()\n", " trainer.update(data.shape[0])\n", " \n", - " train_loss += l.mean().asscalar()\n", + " train_loss += l.mean().item()\n", " acc.update(label, output)\n", " \n", " print(\"Train Accuracy: %.2f\\t Train Loss: %.5f\" % (acc.get()[1], train_loss/(i+1)))" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Train Accuracy: 0.92\t Train Loss: 0.32142\n", + "Train Accuracy: 0.97\t Train Loss: 0.16773\n", + "Train Accuracy: 0.97\t Train Loss: 0.14660\n" + ] + } + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Perturbation\n", "\n", "We first run a validation batch and measure the resulting accuracy.\n", "We then perturbate this batch by modifying the input in the opposite direction of the gradient." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Validation batch accuracy 0.96875\n" - ] - } - ], "source": [ "# Get a batch from the testing set\n", "for data, label in test_data:\n", @@ -227,32 +217,30 @@ "acc.update(label, output)\n", "\n", "print(\"Validation batch accuracy {}\".format(acc.get()[1]))" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Validation batch accuracy 0.96875\n" + ] + } + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Now we perturb the input" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Validation batch accuracy after perturbation 0.40625\n" - ] - } - ], "source": [ - "data_perturbated = data + 0.15 * mx.nd.sign(data.grad)\n", + "data_perturbated = data + 0.15 * mx.np.sign(data.grad)\n", "\n", "output = net(data_perturbated) \n", "\n", @@ -260,58 +248,70 @@ "acc.update(label, output)\n", "\n", "print(\"Validation batch accuracy after perturbation {}\".format(acc.get()[1]))" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Validation batch accuracy after perturbation 0.40625\n" + ] + } + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Visualization" - ] + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Let's visualize an example after pertubation.\n", "\n", "We can see that the prediction is often incorrect." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "source": [ + "from random import randint\n", + "idx = randint(0, batch_size-1)\n", + "\n", + "plt.imshow(data_perturbated[idx, :].asnumpy().reshape(28,28), cmap=cm.Greys_r)\n", + "print(\"true label: %d\" % label.asnumpy()[idx])\n", + "print(\"predicted: %d\" % np.argmax(output.asnumpy(), axis=1)[idx])" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "true label: 1\n", "predicted: 3\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", "text/plain": [ "
" - ] + ], + "image/png": "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" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], - "source": [ - "from random import randint\n", - "idx = randint(0, batch_size-1)\n", - "\n", - "plt.imshow(data_perturbated[idx, :].asnumpy().reshape(28,28), cmap=cm.Greys_r)\n", - "print(\"true label: %d\" % label.asnumpy()[idx])\n", - "print(\"predicted: %d\" % np.argmax(output.asnumpy(), axis=1)[idx])" - ] + "metadata": { + "collapsed": false + } } ], "metadata": { @@ -335,4 +335,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/example/autoencoder/README.md b/example/autoencoder/README.md deleted file mode 100644 index 9db075e680f0..000000000000 --- a/example/autoencoder/README.md +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - -# Example of a Convolutional Autoencoder - -Autoencoder architectures are often used for unsupervised feature learning. This [link](http://ufldl.stanford.edu/tutorial/unsupervised/Autoencoders/) contains an introduction tutorial to autoencoders. This example illustrates a simple autoencoder using a stack of convolutional layers for both the encoder and the decoder. - - -![](https://cdn-images-1.medium.com/max/800/1*LSYNW5m3TN7xRX61BZhoZA.png) - -([Diagram source](https://towardsdatascience.com/autoencoders-introduction-and-implementation-3f40483b0a85)) - - -The idea of an autoencoder is to learn to use bottleneck architecture to encode the input and then try to decode it to reproduce the original. By doing so, the network learns to effectively compress the information of the input, the resulting embedding representation can then be used in several domains. For example as featurized representation for visual search, or in anomaly detection. - -## Dataset - -The dataset used in this example is [FashionMNIST](https://github.com/zalandoresearch/fashion-mnist) dataset. - -## Variational Autoencoder - -You can check an example of variational autoencoder [here](https://gluon.mxnet.io/chapter13_unsupervised-learning/vae-gluon.html) - diff --git a/example/autoencoder/convolutional_autoencoder.ipynb b/example/autoencoder/convolutional_autoencoder.ipynb deleted file mode 100644 index a18ee558cdac..000000000000 --- a/example/autoencoder/convolutional_autoencoder.ipynb +++ /dev/null @@ -1,538 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Convolutional Autoencoder" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![](https://cdn-images-1.medium.com/max/800/1*LSYNW5m3TN7xRX61BZhoZA.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example we will demonstrate how you can create a convolutional autoencoder in Gluon" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import random\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import mxnet as mx\n", - "from mxnet import autograd, gluon" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data\n", - "\n", - "We will use the FashionMNIST dataset, which is of a similar format to MNIST but is richer and has more variance" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "batch_size = 512\n", - "ctx = mx.gpu() if mx.context.num_gpus() else mx.cpu()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "transform = lambda x,y: (x.transpose((2,0,1)).astype('float32')/255., y)\n", - "\n", - "train_dataset = gluon.data.vision.FashionMNIST(train=True)\n", - "test_dataset = gluon.data.vision.FashionMNIST(train=False)\n", - "\n", - "train_dataset_t = train_dataset.transform(transform)\n", - "test_dataset_t = test_dataset.transform(transform)\n", - "\n", - "train_data = gluon.data.DataLoader(train_dataset_t, batch_size=batch_size, last_batch='rollover', shuffle=True, num_workers=5)\n", - "test_data = gluon.data.DataLoader(test_dataset_t, batch_size=batch_size, last_batch='rollover', shuffle=True, num_workers=5)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABIEAAACBCAYAAABXearSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJztnXm4VmW5/2+q0+QQ5iwITkwOCKKghWLOSuZsNqk5HI+WiXoqT9ox09LqKr2wKK/UIjNLvRrMIU3AMENESHECkUkEHBFTGk51PH/8fjx9n297Pb1uNnu/77s+n7/utZ9nr7Xe9YxrXff3vnu9/vrrAQAAAAAAAAAA7c2bevoGAAAAAAAAAABg7cNHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGsBHIAAAAAAAAACAGvCW7rxYr169Xu/O68E/eP3113t1xXlow56jq9owYu2347/9278l+69//WtD/3P66adnx6+++mqy3/GOdyT7rW99a1bvL3/5S7L79++flX3+85/v8FpvetObKo//9re/ZWW9ev3jsb/++po/tu4ei3r/fvy///u/a3wfZ599drIPOOCArOzOO+9M9rRp05K9aNGirN7w4cOT3a9fv6xszJgxyda+dMEFF2T1nnnmmYbutyvas5XGYlcwdOjQZM+ePTvZG2+8cVZv5513Tvbdd9+99m9sDenusajz4v+/vp6j8v90nPrcpf+nc1dXjO0Seh9+7295yz+2ln//+98rz1H6zY2uG3Ubi9/73veSrW2wYsWKrN52222X7Hnz5mVll156abJfeOGFrr7FTsEetfVp5rH45je/OTvWubc0V44ePTrZP/3pT7Oyl156Kdnrr79+sv/nf/4nq/f2t7892ZdccklW9q1vfat02x2i82vEP+9Z15R2Hou+5lTtAb/+9a9nxzrvPvroo5Xn7Ip3hK6g0TbEEwgAAAAAAAAAoAbwEQgAAAAAAAAAoAb06k7XpWZ0DasL7ezeVxea2dW2s0yYMCHZhx56aFa2cuXKZM+ZMyfZG220UVZvp512Svaf/vSnrGz69OnJPvroozt1j60uB+vg//ReKuttttlmyf7hD3+YlS1f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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize=(20,10))\n", - "for i in range(10):\n", - " ax = plt.subplot(1, 10, i+1)\n", - " ax.imshow(train_dataset[i][0].squeeze().asnumpy(), cmap='gray')\n", - " ax.axis('off')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Network" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "net = gluon.nn.HybridSequential()\n", - "encoder = gluon.nn.HybridSequential()\n", - "encoder.add(\n", - " gluon.nn.Conv2D(channels=4, kernel_size=3, padding=1, strides=(2,2), activation='relu'),\n", - " gluon.nn.BatchNorm(),\n", - " gluon.nn.Conv2D(channels=8, kernel_size=3, padding=1, strides=(2,2), activation='relu'),\n", - " gluon.nn.BatchNorm(),\n", - " gluon.nn.Conv2D(channels=16, kernel_size=3, padding=1, strides=(2,2), activation='relu'),\n", - " gluon.nn.BatchNorm(),\n", - " gluon.nn.Conv2D(channels=32, kernel_size=3, padding=0, strides=(2,2),activation='relu'),\n", - " gluon.nn.BatchNorm()\n", - ")\n", - "decoder = gluon.nn.HybridSequential()\n", - "decoder.add(\n", - " gluon.nn.Conv2D(channels=32, kernel_size=3, padding=2, activation='relu'),\n", - " gluon.nn.HybridLambda(lambda F, x: F.UpSampling(x, scale=2, sample_type='nearest')),\n", - " gluon.nn.BatchNorm(),\n", - " gluon.nn.Conv2D(channels=16, kernel_size=3, padding=1, activation='relu'),\n", - " gluon.nn.HybridLambda(lambda F, x: F.UpSampling(x, scale=2, sample_type='nearest')),\n", - " gluon.nn.BatchNorm(),\n", - " gluon.nn.Conv2D(channels=8, kernel_size=3, padding=2, activation='relu'),\n", - " gluon.nn.HybridLambda(lambda F, x: F.UpSampling(x, scale=2, sample_type='nearest')),\n", - " gluon.nn.BatchNorm(),\n", - " gluon.nn.Conv2D(channels=4, kernel_size=3, padding=1, activation='relu'),\n", - " gluon.nn.Conv2D(channels=1, kernel_size=3, padding=1, activation='sigmoid')\n", - ")\n", - "net.add(\n", - " encoder,\n", - " decoder\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "net.initialize(ctx=ctx)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------------------------------------------------------------------------------\n", - " Layer (type) Output Shape Param #\n", - "================================================================================\n", - " Input (1, 1, 28, 28) 0\n", - " Activation-1 0\n", - " Activation-2 (1, 4, 14, 14) 0\n", - " Conv2D-3 (1, 4, 14, 14) 40\n", - " BatchNorm-4 (1, 4, 14, 14) 16\n", - " Activation-5 0\n", - " Activation-6 (1, 8, 7, 7) 0\n", - " Conv2D-7 (1, 8, 7, 7) 296\n", - " BatchNorm-8 (1, 8, 7, 7) 32\n", - " Activation-9 0\n", - " Activation-10 (1, 16, 4, 4) 0\n", - " Conv2D-11 (1, 16, 4, 4) 1168\n", - " BatchNorm-12 (1, 16, 4, 4) 64\n", - " Activation-13 0\n", - " Activation-14 (1, 32, 1, 1) 0\n", - " Conv2D-15 (1, 32, 1, 1) 4640\n", - " BatchNorm-16 (1, 32, 1, 1) 128\n", - " Activation-17 0\n", - " Activation-18 (1, 32, 3, 3) 0\n", - " Conv2D-19 (1, 32, 3, 3) 9248\n", - " HybridLambda-20 (1, 32, 6, 6) 0\n", - " BatchNorm-21 (1, 32, 6, 6) 128\n", - " Activation-22 0\n", - " Activation-23 (1, 16, 6, 6) 0\n", - " Conv2D-24 (1, 16, 6, 6) 4624\n", - " HybridLambda-25 (1, 16, 12, 12) 0\n", - " BatchNorm-26 (1, 16, 12, 12) 64\n", - " Activation-27 0\n", - " Activation-28 (1, 8, 14, 14) 0\n", - " Conv2D-29 (1, 8, 14, 14) 1160\n", - " HybridLambda-30 (1, 8, 28, 28) 0\n", - " BatchNorm-31 (1, 8, 28, 28) 32\n", - " Activation-32 0\n", - " Activation-33 (1, 4, 28, 28) 0\n", - " Conv2D-34 (1, 4, 28, 28) 292\n", - " Activation-35 0\n", - " Activation-36 (1, 1, 28, 28) 0\n", - " Conv2D-37 (1, 1, 28, 28) 37\n", - "================================================================================\n", - "Parameters in forward computation graph, duplicate included\n", - " Total params: 21969\n", - " Trainable params: 21737\n", - " Non-trainable params: 232\n", - "Shared params in forward computation graph: 0\n", - "Unique parameters in model: 21969\n", - "--------------------------------------------------------------------------------\n" - ] - } - ], - "source": [ - "net.summary(test_dataset_t[0][0].expand_dims(axis=0).as_in_context(ctx))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the original image goes from 28x28 = 784 pixels to a vector of length 32. That is a ~25x information compression rate.\n", - "Then the decoder brings back this compressed information to the original shape" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "l2_loss = gluon.loss.L2Loss()\n", - "l1_loss = gluon.loss.L1Loss()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "trainer = gluon.Trainer(net.collect_params(), 'adam', {'learning_rate': 0.001, 'wd':0.001})\n", - "net.hybridize(static_shape=True, static_alloc=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Training loop" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch [0], Loss 0.2246280246310764\n", - "Epoch [1], Loss 0.14493223337026742\n", - "Epoch [2], Loss 0.13147933666522688\n", - "Epoch [3], Loss 0.12138325943906084\n", - "Epoch [4], Loss 0.11291297684367906\n", - "Epoch [5], Loss 0.10611823453741559\n", - "Epoch [6], Loss 0.09942417470817892\n", - "Epoch [7], Loss 0.09408332955124032\n", - "Epoch [8], Loss 0.08883619716024807\n", - "Epoch [9], Loss 0.08491455795418502\n", - "Epoch [10], Loss 0.0809355994402352\n", - "Epoch [11], Loss 0.07784551636785524\n", - "Epoch [12], Loss 0.07570812029716296\n", - "Epoch [13], Loss 0.07417513366438384\n", - "Epoch [14], Loss 0.07218785571236895\n", - "Epoch [15], Loss 0.07093704352944584\n", - "Epoch [16], Loss 0.0700181406787318\n", - "Epoch [17], Loss 0.0689836893326197\n", - "Epoch [18], Loss 0.06782063459738708\n", - "Epoch [19], Loss 0.06713279088338216\n" - ] - } - ], - "source": [ - "epochs = 20\n", - "for e in range(epochs):\n", - " curr_loss = 0.\n", - " for i, (data, _) in enumerate(train_data):\n", - " data = data.as_in_context(ctx)\n", - " with autograd.record():\n", - " output = net(data)\n", - " # Compute the L2 and L1 losses between the original and the generated image\n", - " l2 = l2_loss(output.flatten(), data.flatten())\n", - " l1 = l1_loss(output.flatten(), data.flatten())\n", - " l = l2 + l1 \n", - " l.backward()\n", - " trainer.step(data.shape[0])\n", - " \n", - " curr_loss += l.mean()\n", - "\n", - " print(\"Epoch [{}], Loss {}\".format(e, curr_loss.asscalar()/(i+1)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Testing reconstruction" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We plot 10 images and their reconstruction by the autoencoder. The results are pretty good for a ~25x compression rate!" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABIEAAAD4CAYAAAB7VPbbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsvWe8XVXVvj1QsQKBkJCQQiqBhEQ6gRBaIIAoIE1BimAB8UcVBfUvIGIBFSygPHZ/IihFRVSU3psGQpASEtJIJw0CKPqIvB98mc8975w13Qmn7LPXdX0aO3Oetdeefa2Me4y1Xn311QAAAAAAAAAAgNbmDV19AwAAAAAAAAAA0PHwEggAAAAAAAAAoAbwEggAAAAAAAAAoAbwEggAAAAAAAAAoAbwEggAAAAAAAAAoAbwEggAAAAAAAAAoAbwEggAAAAAAAAAoAbwEggAAAAAAAAAoAbwEggAAAAAAAAAoAbwEggAAAAAAAAAoAa8qTO/bK211nq1M79POfLII5N92mmnJfuHP/xhVm/lypXJnj59erI33njjrF6fPn2SPWbMmKxsyy23TPZ5552X7DvuuCOr9+qrndccr7766lrtcZ2u7MO60159GNE8/divX79kjx8/Pit77LHHkv32t7892f/617+yeltssUWy586dm5XdddddDd3HWmv9X9N29LxkLnZ/WnEudgfe+MY3JvuVV15Zo2u84Q3/939fr7zySrebi7pWRVSvV/Pnz88+L1iwINl/+9vfkv2Pf/wjq6efn3vuuaxs3XXXTfbChQuTrWtwRMRJJ52U7EcffbTN+2svutNc1L5be+21szLd1/79738nW8d8RETv3r2TvWTJkjb/xv9u2LBhWdm0adOSrePnTW+qfiTwfbe990z2xe5Pd5qLjbLJJpsk+5lnnmn36x911FHJ/vnPf97u118TuuNcHDhwYPZZn8MnTpyY7P/93//N6ukzwwMPPJBs3xe1nq+1hx56aLL33XffZP/ud7/L6l133XXJ9r21vWm0D/EEAgAAAAAAAACoAWt1pjdKe78V3H333bPPxx57bLJHjx6dlen/mLzwwgvJ7tu3b1ZP/+6ll15Ktv9vzDrrrJPsp556KivT/4HTt8j+P3jLli1L9g9+8IOs7Kqrror2pDu+2YWcVvlflhNPPDHZu+yyS7KPOOKIrN7y5cuTvf766yfb59vIkSOTfeONN2Zl6n333e9+N9nq8dfZMBe7P60yFzsS9fKLyL1xf/Ob3yR71qxZWb019fBZE7rjXCx5Au22227Jvuyyy7J6zz77bLLVG+otb3lLVk/XXf8fz/XWWy/Z8+bNS3aPHj2yep/73OeS/fDDD7fxK9qPZpiLVV4x2s4Rq7ZnI3j/aB/sueeeyfb/We7fv3+y58yZk5XdfvvtyV7T+YYnEDjNMBfXBPdCv/TSS5OtHiVTpkzJ6v3yl79M9uOPP55sn/ejRo1K9sEHH5yVbbXVVslWT7xPf/rTWb0LL7yw+ge0M91lLg4dOjTZv/rVr7Iy9Xz91re+lexPfvKTWb0f//jHyX7zm9+cbH/m12eLW265JStTb1f1kN1uu+2yei+++GKy3/Wud0VHgicQAAAAAAAAAAAkeAkEAAAAAAAAAFADeAkEAAAAAAAAAFADul1MoBNOOCHZHhNINdEeAVx1z2qvWLEiq/fWt7412arZ00xFERFTp05N9qabbpqVaeYN1Ya+4x3vqLwnzfgQEXH99dcn2zOYrQndReMJ1TSz3lpjZEVEXHzxxcl+3/vel5Wp7lbj++iYj4g4//zzk62ZSTxTn8YC8zVBP2tcBM9Yc/TRRyf773//e3QkzMXuTzPPxY5G4xZ4xqDjjjsu2R77YJtttkm27s8DBgzI6l1++eXJvvbaa7Myjbf3la98JdkaFywiYubMmcn2+F8af+/3v/99S83Fn/70p8nWeAkRES+//HKy3/a2tyX7n//8Z1Zv8eLFye7Zs2dWpnU1pqGemyIiLrjggmR7HI32ptnmYqOxcnbeeefss8ZR0nH+kY98pPIahx12WLJ/8YtfZGUXXXRRss8666zKa+g+u/nmm2dlH//4x5OtcTWd9ogPxL7Y/Wm2uahnTc38FJHvO/78pei66etce9Do9TWWrcYfiojYaaed2vWeustcHDt2bLL9ueDpp59Otmbz/sIXvpDV0/g+9957b7JvvvnmrN4OO+zQ5t9ERPzxj39M9pNPPpnsrbfeOqune+tHP/rR6EiICQQAAAAAAAAAAAleAgEAAAAAAAAA1IBuIQdTl74vfvGLyVbZVUQuvXr7299eeQ2VYXkaOE3hpvKyDTbYIKunbtKe9lPd5fWe/H7/8Y9/VF5D7+vMM89s895Xh+7i3tfeaDt2Zurh1UFdqUeMGJGVqVyq2VxtlUWLFmWfdb752NY1Z+211062pxnW/jrwwAOT/bvf/S6rp27qer2IfC6qlMHT7qr7/T777JOVeXrd10td52Ir0cxzsaMpycG+/e1vJ/vwww/PylSi9dJLLyXbzyBbbLFFsktu+s8880yyXdKk87tXr15Z2de+9rVkn3feeS01F1WmPnfu3KxM21zlYN7+Kjvwc5TK+DSVvKYtj4i45pprkn3VVVc1dO9rSjPPxQ033DD7rFJETQ0dkfeP8r3vfS/7rOmrlTvvvDP7fPzxxydbzxERuYzsnHPOSbbLUfRs8oc//CErO/XUU9u8D/2biMblYeyL3Z9mm4sPPvhgslXOE5E/f/mY9f2k6t/X5PnZnzkVXV9Lc9HDL+ga8bGPfWy178npLnNxxx13TLaHZfnTn/6U7FKbf/nLX062yurmzZuX1dPnAD1DROQp6KdPn57sfv36ZfV0zH3gAx+ovKf2ADkYAAAAAAAAAAAkeAkEAAAAAAAAAFADeAkEAAAAAAAAAFAD3vTfq3Q9qvtTbZ/rOKvif0Tk8UX07zQ9n5dpWjm9dkRZT6pxEqriAzmlWCb6+zWFHfx3tF09JtChhx6abE0RHhFx3XXXJXvWrFnJ1rSDEfk487hRrsOvYrPNNku2pheMWHVsNROagtbHtsaVeMc73pGVVcXT8rmomuif/OQnyfY20ev5PNXr69rhaeAHDhyY7LvuuisrGzRoULTFmsY+AOjOeIwvRXX0ukdG5PFlnn/++WTfeuutWb3+/fsne/LkyVmZrjMah8bjiekerLH9InL9/nnnndfGr+he6Nqlsdn8DKTrqbajrtVOo+up4/EP68oNN9yQfdb4VMuWLcvK9Hyi/eMpjTVuyNe//vVkL126NKt39dVXJ9v3po022ijZOmZ8zuo80jhCXlfjVrIPQrOgcYA03mtEvj7edNNNWZnGlNPxXIr/qvV8bdT5rDEsI/LnTI1NqXE1IyIOPvjgZOsaEBHxwQ9+MNntEROou6B7+957752V/fWvf022xun5+Mc/ntXTNVnjFnqcu4ceeijZ/mx3wAEHtHm9TTbZJKvn12wG8AQCAAAAAAAAAKgBvAQCAAAAAAAAAKgB3UIOpjIblfe4hEpdzD2Fnko3qlz9InKXXHV3dTdZde/zdNPqxucpdKvuyd0M9bd5iltonJJr8pAhQ5I9cuTIrGz99ddPtqZtdzdMdQf1lI5nnHFGsseNG5fsYcOGZfXULfzEE0+svN9m44gjjki2j9/S/Pj5z3+ebHWXHD9+fFZPJVvqfukulXp9d+t94oknkq0pGX190LVD5WUREbvuumuyXSoGHc9nPvOZZKtk8De/+U1Wb/bs2Z11S1DB0KFDk+3zXl23VQLraVTVbd8ll5raXNNvuxxV57e75utcbwXUDb4kl9f9Sc8o3nZ61vE+1POMXt9lY88++2xD996K6P7kEnGdA94/VedBl4hrSneVpz/66KNZPT37TJw4MStT2UkpTIGOkxUrVmRlBx54YLJVDgYdg0tLVAJ0/vnnd+h3l8ZISR7cFey2227J9vO6omvln//856xMn7m23nrrZF9++eVZvcMPPzzZjzzySLI9bIfOv0mTJmVl+pzw1a9+Ndkf+tCHsnoaVsElvLrf6bz87W9/G63M4sWLk33ppZdmZdpGeqb3dfL2229P9sknn5xsl3zttddeyXaZr6KyXJf0Kc0STgJPIAAAAAAAAACAGsBLIAAAAAAAAACAGtAt5GAqzVEXvnXXXTert3Dhwjb/xlF3Z5dr6fU1erxnllI3L3eZVvdIdfF66aWXsnr6ecCAAVmZ/p1nPoEy6mbnMj7l3e9+d7I9m4n2jbpB+zgoZR97//vfn+xNN9002e72p9lwTj/99Mr7bQbU7VTbSDP/ROSuqytXrszKNGq/zjHNgheRSwx0XrqLpfbxtGnTsjKdi3ofvXv3zuqpW6mvK2eddVayVQ5GFpSO4bjjjss+a/YaHXPXXHNNVm/ChAnJLmU8gtdHadyrG73X0zXhlltuSbbLHIYPH55sX1d0vS1lY1FJzk9/+tPK+20FdNyX+kb3J5UlDR48OKtXksvpGlpq/zqj8nE/u2nbeoZK3e/0XOr73dSpU5OtMgfPYqnnYd1zI1bN2Pka3o863zzbnKJnLvbF1aPRttt4442zz7pOasbD+++/P6v3y1/+Mtl+ttH9tCTrajbJVwnNmKfj158FdI/41Kc+lZXpnjFjxoxka/aoiIjly5cne+7cucn254n77rsv2T5PVeKs8/mYY47J6un67eEMdN4ee+yxyW51OZj24VFHHZWV6TjQ9e6xxx7L6um6q5nVXOKqz+hz5szJyt73vvclW88s/l3av82yTuIJBAAAAAAAAABQA3gJBAAAAAAAAABQA3gJBAAAAAAAAABQA7pFTCDV/ak2daONNsrqaapt1WpG5LEKVNtcShGvWmyP96KfPf6Eagw1XpCmvo3If5frfVVz2Ldv34DG0XSW3m+K6oU9bo3qrRtNu+vxpVSDrKkqfbzouF2wYEHl/TYDmsZd9eWeilO15prKOSLXOuvfeRpS/axt69+l/fOe97wnK9M5p33q6W71+n4f++23X8DrR+eb9+HAgQOTrTE1IvKxpOlfL7zwwqyeplTVGAnQvpRiWJRipOk81b3b55uuxZMnT87KNOX26NGjk63rcEQ+vi655JI2fkXrMGzYsGRr23nMGV0LdW/y9Vnb1dOTax9qX3ssGY9/WCd22WWXyjId63369MnKtH+0PT3mpM45PQ/7HNA9bejQoVnZyy+/nGw9D/sZRmNpeEwVjW8xZsyYZHsKZihTig2y3XbbJfuggw7Kyn784x8n+9xzz032DjvskNXTuCQamzIijw2mMW38PKzPNF7mzzVdzUc+8pFkf//730/2yJEjs3q6j2macP+85ZZbJnv69OlZPW0/nX+bb755Vk/jeGk7+33pPNX4kxERu+66a7KfffbZrOywww6r/LtWZqeddkq2xwHWVO26p3mcNn3+0jJ/h/CNb3wj2d6/Dz74YLJnz56dbE9b/73vfS/Z/lyvsS87EzyBAAAAAAAAAABqAC+BAAAAAAAAAABqQLeQg6kLuOJuXdtss02yPTWepoRW98tGU6qWUqD6NdR9V91/3b1s//33ryxTKZqndYT2QV2plyxZkpWpq7u6Pbubu0r61P3QP6vLp48lTRHZLGkDq9h6662TrW3k7aJpEtXd0su0D/y3V7m9uyTPPyvqxqwu8GpH5K6Znt5Tv1vTe3qaSChTkmYeeOCByb7qqquyMk3futdeeyX7yiuvzOqpLOaiiy7Kym677bZkq1zB5/2pp56abHcv/sxnPlN5/3WilC5Y3aRdjqTrgK4djspOdH2NyNdRXZddqqJng1mzZlV+Vyug5yMdzy6z03VSx7amEo/IUyLrfPO6ekbxNbjZJCKdyTvf+c5k+zj31M6KngN0rfSxrfuiSlBcZqJ7nO/Pmqq+JM10iZmie6tKZuosB2s03XujqDxvwoQJWZk+72g/qQQqIg+F4Xua/p1Ksn0c6DPNvHnzsrI//OEP1T+gC5gyZUqyx44dm2x/jtSQAJ4O/Ac/+EGyf/Ob3yT7vPPOy+rpfFap+tlnn53V0/mx7777ZmU6ZjStuUq8/PrwH/QZS2VYEfna269fv2T78/Sdd96ZbJW/ujxL19cvf/nLWdndd9+d7FNOOSXZKueMiNhss82S/a53vSsr+9rXvhZdAZ5AAAAAAAAAAAA1gJdAAAAAAAAAAAA1gJdAAAAAAAAAAAA1oFvEBNK4AKqz9dgqmqbSU/5pfALVCnpKTNVnauwD/y797OmOVSuteKpPTc3qKauVko4cVqUqZoXqgyPy2DSeQlVjW6i23mMfaLp31ZNG5KliNX6Cj6XBgwcnW7XDERGPPPJINBMaE0jnomvIdQ54fAidz5qe1mPx6LjXtKQeW6YUQ0S1wDrHPM6C9qvfr17jve99b7JJQ/7f0XGh89JTbE6aNCnZqsePyOO76Ty64IILsnqaTtzn4vjx45OtcWW8nsZMqHNsizXlpz/9abJPPvnkrEzn0bXXXpvsHXfcMaune7KnNNY9dP78+cnWmH8R+drkc72747EQ/VxRhbaJ7jkamzAi4plnnkm2r8m6rpfitOk8rRul2CpVe1pEdcw0P0/qeVP3T1/LNN6Lx8HwM2tb14vIx4yfQ/Ucrevr5Zdf3ua160BVHCCfH1X1fC6edNJJyd5jjz2ysp/85CfJ1nOZxzLRuCkadyoi71Od66X5rPGkmpGquEylZyxfQx9//PFk6xzWlPAR+TlG4wV5nDV9FijFS7vnnnuSTSzY/46eD+64446srE+fPsnWFO6leIS61o4bNy4r0zHi19C1/P3vf3+yPR6hnoFOPPHErIyYQAAAAAAAAAAA0GHwEggAAAAAAAAAoAZ0OzmYutK59OOuu+5Ktkp9InIX81JqU6VRl2ZPo6nXVNvdfe+9995kjxgxovL6/jshx12u1U29f//+yX7Pe96T1dO0qe4GvWDBgmSrnEAlfP5dPubU1fbZZ59Nto8Ddb9vNvmXo+lv1aXc+6BqvkXk8jot87TtKs3R67ncT/vO3TTVdVkloX5P6gbq0hIt0zGEHOy/UyXNdEmk1vO1UFO7nnPOOcnWORWRy7w8Fa5LJV7DUyfrmPZ7rDNVsj7nmGOOSbaniNe1U6ViDz30UFavtMerZEHXW+8rd8dvJXRPi8h/u/aNS911Dqg04qmnnqr8Lu9DX+fbuoeIesvBNtlkk2S77ErlOL7f6T5WGtvaj/o3ngJ72bJlldfQs4neo0tVdC/0PtVzjMt7IafRdPHe/nvvvXey58yZk5VpKnQtO+SQQ7J6mgLb126ViulY8r7WMaJn4+6E/yb9vcuXL8/KtB9U3nn//fdn9aZOnZps3Ztcdqf7kaYJj8j3RZ2zLj1T/JxbJe9sdXQt9DOe7nHaXt52Oje13zS8QEQu89J549fUOfb0009n9bRM31d0JXgCAQAAAAAAAADUAF4CAQAAAAAAAADUgG4hB1M3PnXd6tu3b1bvyiuvTLZHgtco4uoG6O7N6tZVlSksInev9ewj6sKu1/AsD+pa6BIIjUTucjPIcfc+7Q918zzjjDOyeuqq52646l7bq1evZJdcYX2MeGaV1/Co/6Vo9c2GShFK2bbUNdMlBTqH9be7TE4/l2SVJalKVaYIl//pGuPXV1nFzjvvHHWkUffjkjRz2223TbZm34jIM594Fj8t23jjjZPtshhdd5988smsTNdQ/TuXd+q63sqSotWlSjbtLtgqC3nssceyMp1HDz/8cLJdfrnRRhsluyrTZkQu9fT7aGX3eJUnRORzTG2XP+h56eqrr27ou3xfrJK6l+SddUPPC74v6rnOx2xVe3pbar/quuZrtMr8VCrr19D7KJ1NfA3Q+azrMqwen//855OtWfsiInr27JlslXVF5JJn7Sc/o0yYMKHyu6syVc2ePTv7rH3vMhmVaDcDVdI7l8cqvs9o1l/NMrXFFltk9bbaaqtkX3XVVcn250+dY0cddVRWpmchPevouHCqZLl147bbbku2j3PNvnXRRRcl2zOHH3744cnWTKW33nprVk/nm0uo99xzz2R/97vfTbY/A+p3aYbUroSRBAAAAAAAAABQA3gJBAAAAAAAAABQA3gJBAAAAAAAAABQA7pdTCDF08eqLnbJkiVZmWo3NTWnxw7Qz/q9Xq8q1khErgPUtJ3+O2bMmJFs1f5G5BrVqvTG8B9cd68ccMAByX7ggQcq/87jS6nWXtvfv0tjy2gsgIg83WO/fv2S7fFKFI2HEbFqGuyuRttC55jHI1DNsmuxNd6B2h5zoCqe1urEm9C/03nqmmqdp752qD580KBBDX93K9FojJVS3yxatCjZH/nIR7IyHffjxo3LylSTr+nEPb27zpWtt946K9M4T43OKU/h3IpU7WNVMYAc7wPF98Wq+ez7osZT8FgNus5ommv/Lp2nnpK3lBK9O6BxZSLy9VXXtVK8w4svvrih7/JUx0pVbLeIiJUrVzZ0/VZE+8fXEI2PVzp76r7o8ev0DKJzwFOI61rs81nvQ/vRYzvpPWna+oj8nOtxvbqS0tm8q/A5q+ndd9hhh2T/8Ic/zOpdd911ydb9M2LVeHav4Wuyxv0p7c+6Xvg5VM+28+bNq7xGM+P7jM5NP6Pq/qHt4nPAU4W/hrez/t0RRxyRlelc1LKqmKIRq8atrCv6nOZr17Rp05KtMcu8D/V8r9cYM2ZMVk9jHGo8woj8+XHo0KHJHjJkSFavR48eyZ45c2Y0A3gCAQAAAAAAAADUAF4CAQAAAAAAAADUgKaUg3lKdHXjK6VyVtdYd7+skgy5u6i6g6krtLv1qpus32+j7tnqtunX0M96H/obI6pTPNYJdwMcP358si+44IJku/udurD7eNFxoS58mnI+Ipd5eepMdeecPn16sl2Oou7Am2yySVbW1XKwRtPY+tjWOeBtq591DpfSXuq8d9d2db31NUH/TvvbXfFVvuDuolX35VIJdeuF/+Ayyyp0nPsc0JSbe+21V7J9TR42bFjl986fPz/Z6v7raeBHjBiR7P322y8r85ShrUZJAlYlI9D+iIhYsGBBsp977rnKslGjRiV71qxZWT2dV7r2+mdN2eoSCB0bBx54YFb21a9+Nboz3k96ttG1yvtM28QlRlX4fqfrqc4jXzNdUtvq6FhUfO/Qc53vF9q22le+p1VJnF2Sp39XOt/o3PH9Xvd4l8zo+KraZyMalxK3FyUJmJ8VFf09JWlsoxKzgw46KNl+Tv/617+e7K985SvJVslJRC758mcY3dO033wuat/479ffrOPK91ad6/3794/uSGl/87ZVOfmvfvWrZLtU/d5770229pXL6QYMGJDsY489NivT/tJ21/0S2kZle4cddlhWdv/99ydbU7j7vnjllVcmW+ffqaeemtXTvtH+jMjXWpWA6XkyIuKb3/xmss8666ys7IMf/GB0BXgCAQAAAAAAAADUAF4CAQAAAAAAAADUgKaUg2k2GEddG92tS12Q11133aysKiNRyS1av6skVfEMJuouqq6w7jJcirKvbsPqxui/q5XlYO6+WeWafPfdd2f1tI3uuuuuZA8fPjyrp33qUf41mry6inof/vnPf062ZgPz79O+dpdSzbzgmWwmTZoUXYlHt1fU7dv7qiSD1PbUueP1qlyyfd7rNdzFXutqBjCXqpQyilTJvDxT2NSpU9us113w9l+dLGxVqCxLZZruJrvFFlsk+8wzz8zKbrnllmRfcsklyVZ3+Ig826JLM6uy/XmGFZ3DI0eOjFanKmNeo33/qU99qrLM93GVFt1+++3JHjx4cOXfuZRE70vnpY9dleLqWt4K+NxRV3Q9z7i0R93jG8VldrrWujxIKZW1IipFVVzKpX3iGdR0X9S/K8lYdNy7BFb3I58fVfup97euj6V9V8u8LZppX1yTrEol+ZdLl48++uhkT5w4Mdm6N0VEPPzww8nWM5aGF4jI79elsRoaoirzYkS+TpYyTulaq/Ivv4+BAwdmZd4GzUqpH32vUvmkPl/4XFRZ8w033JBsP1doKAqX/Kn0TPfCRiW7dead73xnsl2ipRm3n3nmmWTvvPPOWT2dfxo+RCWbERGf/OQnk+3riM4rHUt33HFHVk/X4T/96U/RDOAJBAAAAAAAAABQA3gJBAAAAAAAAABQA3gJBAAAAAAAAABQA5oyJpCnmFSNq2o1XXf++OOPJ9tjqyj6d6X0m3ofnnZR9ZquwdVrqlbQ9b5PPfVUsl0fXpX+1rWmnuK4K9GYPaW0miVtbkn/rv22+eabJ9vjImm6aY3LU0pjrvFiIvIYIto3rqnW8aga7YiI7bbbLtkaj8HvV+9rwoQJWdkVV1wRXYnHvVGqYvv4Z48lUNXHjcYh8XSeHvtC0bmo/V0aCx6HxPv1NZopJlApZlmj7Vqq5+ufzgNNGauxfSKqU8RrrK6IiFNOOSXZW221VVZ2zTXXJFtjOXm6W+3r9dZbr7Ks0ZTIugZERPTu3TtajTWJA6RxC/bee++sTGOkafrciIhddtkl2RojYdNNN83q6Vz0dUVjVWgf+z6unzU9bCvgsSKqYrP5+H3yySdX+7tmzZqVfdb4dVWxD72sDmhcFB17PqdK64vGtNT1ttHzUimmnl9D6+p9eEygUkxLPRfp9Zs5JpDGi9xtt92yMv19b3vb25KtsUEj8n1/9OjRWdmiRYuSrfPNx8GRRx6ZbO1Df6bRseRxep5//vlka7/5uNLf4veh/aZnYL+G/p3H1vQ1ulkpxSnz33TSSSclW5+xnnjiiayexpO5/vrrk63PJxH586ifffSZTvvYnxdnz56d7NJzUp3Qc8ScOXOyMn1O0P596KGHsnpjxoxJ9pe+9KU27YiIW2+9NdnHHntsVqYxvnSNP/3007N6Bx544Ko/oovBEwgAAAAAAAAAoAbwEggAAAAAAAAAoAY0pR+fSmwictdVdbVyF3B189K0e/53jboql9wH1SXbZQnqfqnyBU1Z53ja17/85S/J1hSP7qbZTKxJ+s015eyzz062u+tqKk1tO+8nHVc+JrTf1CXa01LvuOOOyb755puzsq997WvJHjp0aLLdlVPHkstpupqNNtqosqwkBys4YHNIAAAgAElEQVSldNf+atSdXWU7Jdd2v4aOSZVNrE469Kpx7e7xXUl7pHNXV/mI3MVcpY0ReVuqG7mn+9bxM2nSpDavHZG78n7+85/Pym666aZkq+zC71ddqX2drEq36muC/p2uARGrrjOtgM6l0t6q/O53v0v24sWLszJde7fffvusbPLkycmePn16sl1uqWugnwU0/ar2v6aAjcjHncvNujuXX3559llT1+r49bFdkshXsXz58uzzxhtvnGxdQ3Wfjcj3gzqkOva02a9ROmsuW7Ys+6x7YWkuapnac+fOzeq5RE/R/aIk49drlORrOherJMBdgUu2Tz311GS7xFnbRPc0fw7Q8fz0009nZdpXej7wNOorVqxI9ssvv9ymHZGfe3yd1OcMLfP5pmuyjyX9bfp3fg0dF6U0881M6XlOZXwR+bzVs46eRSJyOZjie47uWx7SQ89WjzzySLI95TlysFV53/vel2yXg6lcUsfzuHHjsnq//vWvk61nPj+/6LnHn9d1bF188cXJ9jAvKqceNWpUVvbHP/4xugI8gQAAAAAAAAAAagAvgQAAAAAAAAAAagAvgQAAAAAAAAAAakBTxgTydN2qY9W4DK5b1ZgQrvdVDaXartnWzxqPwL+rKk5RRK6H1/v1elX37tfQ+23mdIwaL8BjyUyZMqWha+jfud5W0zZqPY9HoG3pcUMU1YC7Pr8qFbGnftS4OEcccURWpmkDVb/t8St0zLnuvqv19aX20znmKbm1T0oxfEoxE7RtS2lOS/G5tG4pda9ew+eYj6/XUK14V+PxiVR37mnQta7a3nal9Ur/Tsesz6PHH3882RoHxtN2a7wY/y0610vxE7Q/fL2uGge+7moMjAULFmRl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iofoZ5jORmPleNwN/d16vojIY6LpOuPrU58+fZLdt2/frMzXq9copVzXmCR+ptZ29bO/pjjXPVJjAPnfef+WzqWK7ov+W6riSzUDpT1b2+Xwww/PyjT+0uWXX55sXTcj8vVws802S7amJI+ImDhxYrK33nrrrGz69OnJ1vN+1bmzLeoaE0ifLfxcq/GVnn766WRfc801WT09p+he6jGHNYabPy8OHz482Z/73OeSPWXKlKyexlD0awwaNCjZTz31VHQWeAIBAAAAAAAAANQAXgIBAAAAAAAAANSAppSDuQufuiKqq2lJDuYpiFWeom527uqp362usO4qqW6a7n5XlXaxhP+WAw88MNnqrlvlbtpZaF94G6t8RF31I/KUieoO6S582pYlWUhJIqdlJVdVreeprXWclSQZmvrT+0Z/m44DHy9a5ik8Nd1pV+AyIL3XUhrbu+66K9meRrpKguLtp+61+r3e3/p3jz76aFam/aXX8HGnY1elLxGrSsdeo6vlYDo/3M1b5TADBw7MyrQddE65bEw/l6QA+l0+XtYEl/aoW29JetsoVWl8I/I1zde3rkiFq2tUe0huXOqo+4y2y4QJE7J62q86L3/2s59l9W6//fZkb7nlllnZ97///WRr6vdNNtmkoXuPyPtE572PT+2rVnePV1f3KrlcRN4OmgK7hKbZjYjYfvvtk61joiukks2EniO1D3wN0ZTGKt2LiDjggAOSrdJJl3mpDEjH+Z///Oesnu5P3j9z5sxJtsoe/Pyh+6LPdR1fuo90tRxMJTV6DonIzyIuU9eU8SqD97ONziNvryrZVGnf0vOQn5VUFqhS24iISZMmtXmPO++8c1av9Dyic7iUIl5/s/+WZpaCltYllUtqW0bk81klf34W/OY3v5nsffbZJ9kq7YmIeN/73pfs8ePHZ2Ua+kPn23HHHZfVGzVqVLJVrhaR91cz90d7o/u+/25dk1Su5VK9H/3oR8nWsf3BD34wq6eyMZeYL1y4MNkqF917772zero3eB/uv//+yb7pppuis8ATCAAAAAAAAACgBvASCAAAAAAAAACgBvASCAAAAAAAAACgBjRlTCDXo6pOT+NDTJ06tfIarktW7WApno9qeqvSxUfkGlwv08+qm3YtrcY28ZhAVekaPV5GZ3PiiScm+2Mf+1hWphpK1a1H5HELtM09boHGNvEY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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize=(20,4))\n", - "for i in range(10):\n", - " idx = random.randint(0, len(test_dataset))\n", - " img, _ = test_dataset[idx]\n", - " x, _ = test_dataset_t[idx]\n", - "\n", - " data = x.as_in_context(ctx).expand_dims(axis=0)\n", - " output = net(data)\n", - " \n", - " ax = plt.subplot(2, 10, i+1)\n", - " ax.imshow(img.squeeze().asnumpy(), cmap='gray')\n", - " ax.axis('off')\n", - " ax = plt.subplot(2, 10, 10+i+1)\n", - " ax.imshow((output[0].asnumpy() * 255.).transpose((1,2,0)).squeeze(), cmap='gray')\n", - " _ = ax.axis('off')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Manipulating latent space" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now use separately the **encoder** that takes an image to a latent vector and the **decoder** that transform a latent vector into images" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We get two images from the testing set" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJIAAACPCAYAAAARM4LLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAACZRJREFUeJztnUtsVdcVhv+Feb8JD2Nsg4OwKjFAqhRVoFYC0SJoJmFUBUHEIBKTVmqlSCRph0zKpLNOkEDpoHJVqZWSQSSrRNSoUIE9iKgJAkwRD2Owzdvmadgd3Bv37D/xvde+y/eew/k/yeL851zfsxP93nudvddex0IIEKJaZtS7AeLNQEYSLshIwgUZSbggIwkXZCThgowkXJCRhAtVGcnMdpnZRTPrM7NPvBolsodNdWbbzBoAXAKwA8BNAN0A9oQQvinxO6mdRm9tbS15fWxsLNIzZsz43mMAGB0djfS8efMi/eLFi0i/fv060g0NDZEeGRmJ9JMnT0q21ZnhEMLKch+aWcUNfgSgL4TwXwAws78AeA/AhEZKMwcPHix5/e7du5GeP3/++PHs2bOjaz09PZHetGlTpK9fvx5pNt6iRYsiffr06ZLfP81cq+RD1QxtzQBuJPTN4rkIMztgZj1mVtP/elFbqumRKiKEcATAESDdQ5uojmqM1A8gGVi0FM9lkm3btkV6+fLlkX7w4EGkk0Pdhg0bomtbt26NdHIYBIDjx49H+vnz55HmmOvZs2eRrvHQVhHVDG3dANrN7G0zmw3gfQBf+DRLZI0p90ghhDEz+xWATgANAI6FEM67tUxkiqpipBDClwC+dGqLyDDTHmynldWrV0d61qxZke7s7Iz0nDlzIp2cG1qyZEl0bebM+H/rrVu3Iv348eNI8/QAx0SnTp1C2tESiXBBRhIuyEjChdzGSOvWrYs0L0usXbs20q9evYr03Llzx4+vXLkSXbt06VKkt2/fHuktW7ZE+uHDh5E+fz5++OW1uTSiHkm4ICMJF2Qk4UJuY6SdO3dGenBwMNKcA5SMiQDAzMaPFy9eHF1btmxZpDlNhOeROB9pwYIFkX706BHSjnok4YKMJFzI7dDW3Bzn4JVLf+VlkGRWJA+DTU1NkeahiofJCxculLxXFlCPJFyQkYQLMpJwIbcxUltbW8nrHPcMDQ1FesWKFePHLS0t0TVOreXf5S1gCxcujDTvSuG0lDSiHkm4ICMJF2Qk4UL6B99pgtNIrl69GulycUkyhuIt2cnlE+C7KSp37tyJNC/PlJvjSiPqkYQLMpJwQUYSLuQ2RuL1rHKpHJz6sXLl/yu9HD58OLrGKSr79u2LNFc2Sc5JAd+Nsa5dq6ggSF1RjyRckJGECzKScCE3MRJvuWa4tAxvEeLfb2xsHD/u6OiIrvHa2f79+yPNa228tsaaY6o0oh5JuFDWSGZ2zMwGzaw3ce4tM/uHmV0u/rus1HeIN59KeqTPAOyic58A+CqE0A7gq6IWOaZsjBRCOGlmbXT6PQDbisd/AvBPAB87tssdzj/icsdc2o+vc/nkM2fOTHivrq6uSHNMxPNE9+7dizTHWDyHlUamGiM1hhAGise3ATSW+rB486n6qS2EEEpVqzWzAwAOVHsfkW6m2iPdMbMmACj+OzjRB0MIR0II74QQ3pnivUQGmGqP9AWA/QB+X/z3c7cWTRPr16+PNM8bseZ8pOS8EQAcOnRowntxWRuGXxHB5ZA5PssClTz+dwD4N4AfmNlNM/sQBQPtMLPLAH5W1CLHVPLUtmeCSz91bovIMJrZFi7kZq1t6dKlkeZXVXHpGJ534vJ+PFdUCs7RZjge43mmLKAeSbggIwkXZCThQm5ipDVr1kSa543K1UPifW+T4fbt25HmfCNeiyv1ugoAePr06ZTbMl2oRxIuyEjChdwMbfxGSE7dePnyZcnfP3fu3JTvPTAwEGlebuG3CvAW7TQOZYx6JOGCjCRckJGEC7mJkTg1g+MSrtbPb5Q8ceLEhN/NSxr8OM/LK7xFm5dI+A2SWUA9knBBRhIuyEjChdzESJw2wjESlzTm10Dwax+ScIzDc1Ld3d2R5jdKcgmd+/fvT3ivtKIeSbggIwkXZCThQm5iJJ4X4jQR3rLNMRW/Cmsy8JZrfuMkx0hcTjkLqEcSLshIwgUZSbiQmxhpeHg40rw9abL5SUnKbR/i7+K0Xp7TyiLqkYQLMpJwQUYSLuQmRuItQTyXw1uAOH+Jty8l4ZiH4e3g/F2cC6W1NpFbKqmP1GpmJ8zsGzM7b2a/Lp5XiWQxTiU90hiAj0IIGwFsBvBLM9sIlUgWCSoptDUAYKB4/NjMLgBoRsZKJN+4cSPSnH/E5fjKvXIiyWTL0PC9OJ8pi/NKk4qRivW2fwjgDFQiWSSo+KnNzBYC+BuA34QQHiX/CkuVSFZ55HxQUY9kZrNQMNGfQwh/L56uqESyyiPng7I9khW6nqMALoQQ/pC4lKkSyb29vZHmksQct/DcD6/NJfOXysVI5fa98fVS+eFppZKh7ccAPgDwHzP7unjutygY6K/FcsnXAPxiepooskAlT23/AjDRn5xKJAsAmtkWTuRmrY3303NONud08/oZ79fnHO9S8LwQfzdrLg2YBdQjCRdkJOGCjCRcyE2MxHAON5cgHh0djXR7e3uk+/r6xo/LzSONjIxEmj/PmuewsoB6JOGCjCRcyO3Q1t/fH+lVq1ZFmt90XWobNS95MFzumKcDeOqBpxqygHok4YKMJFyQkYQLuY2R+JUQu3fvjjQvqZSKkcptR+LtRxwj8eM/l8HJAuqRhAsyknBBRhIu5DZGOnnyZKT37t0baV4i2bx5c6SPHj06flxu+xDHSBxv8TyTSv+J3CIjCRdkJOFCbmMk3p7U1dUV6aGhoUgn00aYcmttnLJy9uzZkterKcVcL9QjCRdkJOGCjCRcsHLju+vNzIZQ2JW7AsBwmY/Xi7S2rV7tWhdCWFnuQzU10vhNzXrSWlQirW1La7u+RUObcEFGEi7Uy0hH6nTfSkhr29LaLgB1ipHEm4eGNuFCTY1kZrvM7KKZ9ZlZXcspm9kxMxs0s97EuVTUDs9ibfOaGcnMGgD8EcDPAWwEsKdYr7tefAZgF51LS+3w7NU2DyHU5AfAFgCdCf0pgE9rdf8J2tQGoDehLwJoKh43AbhYz/Yl2vU5gB1pbV8IoaZDWzOAZNX0m8VzaSJ1tcOzUttcwfYEhMKffV0fabm2efJaGtqXpJZG6gfQmtAtxXNpoqLa4bWgmtrm9aCWRuoG0G5mb5vZbADvo1CrO018WzscqGPt8ApqmwNpq21e46DxXQCXAFwB8Ls6B7AdKLys5yUK8dqHAJaj8DR0GcBxAG/VqW0/QWHYOgfg6+LPu2lp3/f9aGZbuKBgW7ggIwkXZCThgowkXJCRhAsyknBBRhIuyEjChf8BBBgORVqd9YYAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "idx = random.randint(0, len(test_dataset))\n", - "img1, _ = test_dataset[idx]\n", - "x, _ = test_dataset_t[idx]\n", - "data1 = x.as_in_context(ctx).expand_dims(axis=0)\n", - "\n", - "idx = random.randint(0, len(test_dataset))\n", - "img2, _ = test_dataset[idx]\n", - "x, _ = test_dataset_t[idx]\n", - "data2 = x.as_in_context(ctx).expand_dims(axis=0)\n", - "\n", - "plt.figure(figsize=(2,2))\n", - "plt.imshow(img1.squeeze().asnumpy(), cmap='gray')\n", - "plt.show()\n", - "plt.figure(figsize=(2,2))\n", - "plt.imshow(img2.squeeze().asnumpy(), cmap='gray')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We get the latent representations of the images by passing them through the network" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "latent1 = encoder(data1)\n", - "latent2 = encoder(data2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We see that the latent vector is made of 32 components" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(1, 32, 1, 1)" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "latent1.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We interpolate the two latent representations, vectors of 32 values, to get a new intermediate latent representation, pass it through the decoder and plot the resulting decoded image" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "num = 10\n", - "plt.figure(figsize=(20, 5))\n", - "\n", - "for i in range(int(num)):\n", - " \n", - " new_latent = latent2*(i+1)/num + latent1*(num-i)/num\n", - " output = decoder(new_latent)\n", - " \n", - " #plot result\n", - " ax = plt.subplot(1, num, i+1)\n", - " ax.imshow((output[0].asnumpy() * 255.).transpose((1,2,0)).squeeze(), cmap='gray')\n", - " _ = ax.axis('off')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the latent space learnt by the autoencoder is fairly smooth, there is no sudden jump from one shape to another" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/example/automatic-mixed-precision/README.md b/example/automatic-mixed-precision/README.md deleted file mode 100644 index 334828ab1cce..000000000000 --- a/example/automatic-mixed-precision/README.md +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - -# Conversion of FP32 models to Mixed Precision Models - - -This folder contains examples for converting FP32 models to mixed precision models. The script allows for converting FP32 symbolic models or gluon models to mixed precision model. - -## Basic Usages - -AMP Model Conversion for a gluon model, casting the params wherever possible to FP16. The below script will convert the `resnet101_v1` model to Mixed Precision Model and cast params to FP16 wherever possible, load this converted model and run inference on it. - -```bash -python amp_model_conversion.py --model resnet101_v1 --run-dummy-inference --cast-optional-params -``` diff --git a/example/automatic-mixed-precision/amp_model_conversion.py b/example/automatic-mixed-precision/amp_model_conversion.py deleted file mode 100644 index 22af4f39b780..000000000000 --- a/example/automatic-mixed-precision/amp_model_conversion.py +++ /dev/null @@ -1,201 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -import os -import logging -import argparse -import mxnet as mx -from common import modelzoo -import gluoncv -from gluoncv.model_zoo import get_model -from mxnet import amp -import numpy as np - - -def save_symbol(fname, sym, logger=None): - if logger is not None: - logger.info('Saving symbol into file at {}'.format(fname)) - sym.save(fname, remove_amp_cast=False) - - -def save_params(fname, arg_params, aux_params, logger=None): - if logger is not None: - logger.info('Saving params into file at {}'.format(fname)) - save_dict = {('arg:%s' % k): v.as_in_context(mx.cpu()) for k, v in arg_params.items()} - save_dict.update({('aux:%s' % k): v.as_in_context(mx.cpu()) for k, v in aux_params.items()}) - mx.nd.save(fname, save_dict) - - -if __name__ == '__main__': - # Faster RCNN and Mask RCNN commented because of model loading issues - # https://github.com/dmlc/gluon-cv/issues/1034 - gluon_models = [#'faster_rcnn_fpn_resnet50_v1b_coco', - 'mobilenetv2_0.75', - 'cifar_resnet56_v1', - 'mobilenet0.25', - 'mobilenet1.0', - #'mask_rcnn_fpn_resnet50_v1b_coco', - 'simple_pose_resnet152_v1b', - 'ssd_512_resnet50_v1_voc', - #'faster_rcnn_resnet50_v1b_voc', - 'cifar_resnet20_v1', - 'yolo3_darknet53_voc', - 'resnet101_v1c', - 'simple_pose_resnet18_v1b', - #'mask_rcnn_resnet50_v1b_coco', - 'ssd_512_mobilenet1.0_coco', - 'vgg19_bn', - #'faster_rcnn_resnet50_v1b_coco', - 'cifar_resnet110_v1', - 'yolo3_mobilenet1.0_voc', - 'cifar_resnext29_16x64d', - 'resnet34_v1', - 'densenet121', - #'mask_rcnn_fpn_resnet101_v1d_coco', - 'vgg13_bn', - 'vgg19', - 'resnet152_v1d', - 'resnet152_v1s', - 'densenet201', - 'alexnet', - 'se_resnext50_32x4d', - 'resnet50_v1d_0.86', - 'resnet18_v1b_0.89', - 'yolo3_darknet53_coco', - 'resnet152_v1', - 'resnext101_64x4d', - 'vgg13', - 'resnet101_v1d_0.76', - 'simple_pose_resnet50_v1d', - 'senet_154', - 'resnet50_v1', - 'se_resnext101_32x4d', - 'fcn_resnet101_voc', - 'resnet152_v2', - #'mask_rcnn_resnet101_v1d_coco', - 'squeezenet1.1', - 'mobilenet0.5', - 'resnet34_v2', - 'resnet18_v1', - 'resnet152_v1b', - 'resnet101_v2', - 'cifar_resnet56_v2', - 'ssd_512_resnet101_v2_voc', - 'resnet50_v1d_0.37', - 'mobilenetv2_0.5', - #'faster_rcnn_fpn_bn_resnet50_v1b_coco', - 'resnet50_v1c', - 'densenet161', - 'simple_pose_resnet50_v1b', - 'resnet18_v1b', - 'darknet53', - 'fcn_resnet50_ade', - 'cifar_wideresnet28_10', - 'simple_pose_resnet101_v1d', - 'vgg16', - 'ssd_512_resnet50_v1_coco', - 'resnet101_v1d_0.73', - 'squeezenet1.0', - 'resnet50_v1b', - #'faster_rcnn_resnet101_v1d_coco', - 'ssd_512_mobilenet1.0_voc', - 'cifar_wideresnet40_8', - 'cifar_wideresnet16_10', - 'cifar_resnet110_v2', - 'resnet101_v1s', - 'mobilenetv2_0.25', - 'resnet152_v1c', - 'se_resnext101_64x4d', - #'faster_rcnn_fpn_resnet101_v1d_coco', - 'resnet50_v1d', - 'densenet169', - 'resnet34_v1b', - 'resnext50_32x4d', - 'resnet101_v1', - 'resnet101_v1b', - 'resnet50_v1s', - 'mobilenet0.75', - 'cifar_resnet20_v2', - 'resnet101_v1d', - 'vgg11_bn', - 'resnet18_v2', - 'vgg11', - 'simple_pose_resnet101_v1b', - 'resnext101_32x4d', - 'resnet50_v2', - 'vgg16_bn', - 'mobilenetv2_1.0', - 'resnet50_v1d_0.48', - 'resnet50_v1d_0.11', - 'fcn_resnet101_ade', - 'simple_pose_resnet152_v1d', - 'yolo3_mobilenet1.0_coco', - 'fcn_resnet101_coco'] - # TODO(anisub): add support for other models from gluoncv - # Not supported today mostly because of broken net.forward calls - segmentation_models = ['deeplab_resnet50_ade', - 'psp_resnet101_voc', - 'deeplab_resnet152_voc', - 'deeplab_resnet101_ade', - 'deeplab_resnet152_coco', - 'psp_resnet101_ade', - 'deeplab_resnet101_coco', - 'psp_resnet101_citys', - 'psp_resnet50_ade', - 'psp_resnet101_coco', - 'deeplab_resnet101_voc'] - calib_ssd_models = ["ssd_512_vgg16_atrous_voc", - "ssd_300_vgg16_atrous_voc", - "ssd_300_vgg16_atrous_coco"] - calib_inception_models = ["inceptionv3"] - gluon_models = gluon_models + segmentation_models + \ - calib_ssd_models + calib_inception_models - models = gluon_models - - parser = argparse.ArgumentParser(description='Convert a provided FP32 model to a mixed precision model') - parser.add_argument('--model', type=str, choices=models) - parser.add_argument('--run-dummy-inference', action='store_true', default=False, - help='Will generate random input of shape (1, 3, 224, 224) ' - 'and run a dummy inference forward pass') - parser.add_argument('--cast-optional-params', action='store_true', default=False, - help='If enabled, will try to cast params to target dtype wherever possible') - args = parser.parse_args() - logging.basicConfig() - logger = logging.getLogger('logger') - logger.setLevel(logging.INFO) - - assert args.model in gluon_models, "Please choose one of the available gluon models: {}".format(gluon_models) - shape = None - if args.model in segmentation_models: - shape = (1, 3, 480, 480) - elif args.model in calib_ssd_models: - shape = (1, 3, 512, 544) - elif args.model in calib_inception_models: - shape = (1, 3, 299, 299) - else: - shape = (1, 3, 224, 224) - net = gluoncv.model_zoo.get_model(args.model, pretrained=True) - net.hybridize() - result_before1 = net.forward(mx.nd.random.uniform(shape=shape)) - net.export("{}".format(args.model)) - net = amp.convert_hybrid_block(net, cast_optional_params=args.cast_optional_params) - net.export("{}-amp".format(args.model), remove_amp_cast=False) - if args.run_dummy_inference: - logger.info("Running inference on the mixed precision model with dummy inputs, batch size: 1") - result_after = net.forward(mx.nd.random.uniform(shape=shape, dtype=np.float32, ctx=mx.gpu(0))) - result_after = net.forward(mx.nd.random.uniform(shape=shape, dtype=np.float32, ctx=mx.gpu(0))) - logger.info("Inference run successfully") diff --git a/example/bi-lstm-sort/bi-lstm-sort.ipynb b/example/bi-lstm-sort/bi-lstm-sort.ipynb index 5d18be35e079..df9a9c597dfc 100644 --- a/example/bi-lstm-sort/bi-lstm-sort.ipynb +++ b/example/bi-lstm-sort/bi-lstm-sort.ipynb @@ -2,37 +2,35 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, "source": [ "# Using a bi-lstm to sort a sequence of integers" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, - "outputs": [], "source": [ "import random\n", "import string\n", "\n", "import mxnet as mx\n", - "from mxnet import gluon, nd\n", - "import numpy as np" - ] + "from mxnet import gluon, np\n", + "import numpy as onp" + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Data Preparation" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 2, - "metadata": {}, - "outputs": [], "source": [ "max_num = 999\n", "dataset_size = 60000\n", @@ -40,11 +38,12 @@ "split = 0.8\n", "batch_size = 512\n", "ctx = mx.gpu() if mx.context.num_gpus() > 0 else mx.cpu()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "We are getting a dataset of **dataset_size** sequences of integers of length **seq_len** between **0** and **max_num**. We use **split*100%** of them for training and the rest for testing.\n", "\n", @@ -56,68 +55,68 @@ "Should return\n", "\n", "10 30 50 200 999" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 3, - "metadata": {}, - "outputs": [], "source": [ - "X = mx.random.uniform(low=0, high=max_num, shape=(dataset_size, seq_len)).astype('int32').asnumpy()\n", + "X = mx.np.random.uniform(low=0, high=max_num, size=(dataset_size, seq_len)).astype('int32').asnumpy()\n", "Y = X.copy()\n", "Y.sort() #Let's sort X to get the target" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "source": [ + "print(\"Input {}\\nTarget {}\".format(X[0].tolist(), Y[0].tolist()))" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Input [548, 592, 714, 843, 602]\n", "Target [548, 592, 602, 714, 843]\n" ] } ], - "source": [ - "print(\"Input {}\\nTarget {}\".format(X[0].tolist(), Y[0].tolist()))" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "For the purpose of training, we encode the input as characters rather than numbers" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "source": [ + "vocab = string.digits + \" \"\n", + "print(vocab)\n", + "vocab_idx = { c:i for i,c in enumerate(vocab)}\n", + "print(vocab_idx)" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "0123456789 \n", "{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, ' ': 10}\n" ] } ], - "source": [ - "vocab = string.digits + \" \"\n", - "print(vocab)\n", - "vocab_idx = { c:i for i,c in enumerate(vocab)}\n", - "print(vocab_idx)" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "We write a transform that will convert our numbers into text of maximum length **max_len**, and one-hot encode the characters.\n", "For example:\n", @@ -125,31 +124,30 @@ "\"30 10\" corresponding indices are [3, 0, 10, 1, 0]\n", "\n", "We then one hot encode that and get a matrix representation of our input. We don't need to encode our target as the loss we are going to use support sparse labels" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "source": [ + "max_len = len(str(max_num))*seq_len+(seq_len-1)\n", + "print(\"Maximum length of the string: %s\" % max_len)" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Maximum length of the string: 19\n" ] } ], - "source": [ - "max_len = len(str(max_num))*seq_len+(seq_len-1)\n", - "print(\"Maximum length of the string: %s\" % max_len)" - ] + "metadata": {} }, { "cell_type": "code", "execution_count": 7, - "metadata": {}, - "outputs": [], "source": [ "def transform(x, y):\n", " x_string = ' '.join(map(str, x.tolist()))\n", @@ -158,28 +156,35 @@ " y_string = ' '.join(map(str, y.tolist()))\n", " y_string_padded = y_string + ' '*(max_len-len(y_string))\n", " y = [vocab_idx[c] for c in y_string_padded]\n", - " return mx.nd.one_hot(mx.nd.array(x), len(vocab)), mx.nd.array(y)" - ] + " return mx.npx.one_hot(mx.nd.array(x), len(vocab)), mx.np.array(y)" + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 8, - "metadata": {}, - "outputs": [], "source": [ "split_idx = int(split*len(X))\n", "train_dataset = gluon.data.ArrayDataset(X[:split_idx], Y[:split_idx]).transform(transform)\n", "test_dataset = gluon.data.ArrayDataset(X[split_idx:], Y[split_idx:]).transform(transform)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 9, - "metadata": {}, + "source": [ + "print(\"Input {}\".format(X[0]))\n", + "print(\"Transformed data Input {}\".format(train_dataset[0][0]))\n", + "print(\"Target {}\".format(Y[0]))\n", + "print(\"Transformed data Target {}\".format(train_dataset[0][1]))" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Input [548 592 714 843 602]\n", "Transformed data Input \n", @@ -211,103 +216,115 @@ ] } ], - "source": [ - "print(\"Input {}\".format(X[0]))\n", - "print(\"Transformed data Input {}\".format(train_dataset[0][0]))\n", - "print(\"Target {}\".format(Y[0]))\n", - "print(\"Transformed data Target {}\".format(train_dataset[0][1]))" - ] + "metadata": {} }, { "cell_type": "code", "execution_count": 10, - "metadata": {}, - "outputs": [], "source": [ "train_data = gluon.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=20, last_batch='rollover')\n", "test_data = gluon.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=5, last_batch='rollover')" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Creating the network" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 11, - "metadata": {}, - "outputs": [], "source": [ "net = gluon.nn.HybridSequential()\n", - "with net.name_scope():\n", - " net.add(\n", - " gluon.rnn.LSTM(hidden_size=128, num_layers=2, layout='NTC', bidirectional=True),\n", - " gluon.nn.Dense(len(vocab), flatten=False)\n", - " )" - ] + "net.add(\n", + " gluon.rnn.LSTM(hidden_size=128, num_layers=2, layout='NTC', bidirectional=True),\n", + " gluon.nn.Dense(len(vocab), flatten=False)\n", + ")" + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 12, - "metadata": {}, - "outputs": [], "source": [ "net.initialize(mx.init.Xavier(), ctx=ctx)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 13, - "metadata": {}, - "outputs": [], "source": [ "loss = gluon.loss.SoftmaxCELoss()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "We use a learning rate schedule to improve the convergence of the model" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 14, - "metadata": {}, - "outputs": [], "source": [ "schedule = mx.lr_scheduler.FactorScheduler(step=len(train_data)*10, factor=0.75)\n", "schedule.base_lr = 0.01" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 15, - "metadata": {}, - "outputs": [], "source": [ "trainer = gluon.Trainer(net.collect_params(), 'adam', {'learning_rate':0.01, 'lr_scheduler':schedule})" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Training loop" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "source": [ + "epochs = 100\n", + "for e in range(epochs):\n", + " epoch_loss = 0.\n", + " for i, (data, label) in enumerate(train_data):\n", + " data = data.as_in_context(ctx)\n", + " label = label.as_in_context(ctx)\n", + "\n", + " with mx.autograd.record():\n", + " output = net(data)\n", + " l = loss(output, label)\n", + "\n", + " l.backward()\n", + " trainer.step(data.shape[0])\n", + " \n", + " epoch_loss += l.mean()\n", + " \n", + " print(\"Epoch [{}] Loss: {}, LR {}\".format(e, epoch_loss.item()/(i+1), trainer.learning_rate))" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Epoch [0] Loss: 1.6627886372227823, LR 0.01\n", "Epoch [1] Loss: 1.210370733382854, LR 0.01\n", @@ -412,82 +429,68 @@ ] } ], - "source": [ - "epochs = 100\n", - "for e in range(epochs):\n", - " epoch_loss = 0.\n", - " for i, (data, label) in enumerate(train_data):\n", - " data = data.as_in_context(ctx)\n", - " label = label.as_in_context(ctx)\n", - "\n", - " with mx.autograd.record():\n", - " output = net(data)\n", - " l = loss(output, label)\n", - "\n", - " l.backward()\n", - " trainer.step(data.shape[0])\n", - " \n", - " epoch_loss += l.mean()\n", - " \n", - " print(\"Epoch [{}] Loss: {}, LR {}\".format(e, epoch_loss.asscalar()/(i+1), trainer.learning_rate))" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Testing" - ] + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "We get a random element from the testing set" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 17, - "metadata": {}, - "outputs": [], "source": [ "n = random.randint(0, len(test_data)-1)\n", "\n", "x_orig = X[split_idx+n]\n", "y_orig = Y[split_idx+n]" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 41, - "metadata": {}, - "outputs": [], "source": [ "def get_pred(x):\n", " x, _ = transform(x, x)\n", - " output = net(x.as_in_context(ctx).expand_dims(axis=0))\n", + " output = net(mx.np.expand_dims(x.as_in_ctx(ctx), axis=0))\n", "\n", " # Convert output back to string\n", " pred = ''.join([vocab[int(o)] for o in output[0].argmax(axis=1).asnumpy().tolist()])\n", " return pred" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Printing the result" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 43, - "metadata": {}, + "source": [ + "x_ = ' '.join(map(str,x_orig))\n", + "label = ' '.join(map(str,y_orig))\n", + "print(\"X {}\\nPredicted {}\\nLabel {}\".format(x_, get_pred(x_orig), label))" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "X 611 671 275 871 944\n", "Predicted 275 611 671 871 944\n", @@ -495,92 +498,88 @@ ] } ], - "source": [ - "x_ = ' '.join(map(str,x_orig))\n", - "label = ' '.join(map(str,y_orig))\n", - "print(\"X {}\\nPredicted {}\\nLabel {}\".format(x_, get_pred(x_orig), label))" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "We can also pick our own example, and the network manages to sort it without problem:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 66, - "metadata": {}, + "source": [ + "print(get_pred(onp.array([500, 30, 999, 10, 130])))" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "10 30 130 500 999 \n" ] } ], - "source": [ - "print(get_pred(np.array([500, 30, 999, 10, 130])))" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "The model has even learned to generalize to examples not on the training set" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 64, - "metadata": {}, + "source": [ + "print(\"Only four numbers:\", get_pred(onp.array([105, 302, 501, 202])))" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Only four numbers: 105 202 302 501 \n" ] } ], - "source": [ - "print(\"Only four numbers:\", get_pred(np.array([105, 302, 501, 202])))" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "However we can see it has trouble with other edge cases:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 63, - "metadata": {}, + "source": [ + "print(\"Small digits:\", get_pred(onp.array([10, 3, 5, 2, 8])))\n", + "print(\"Small digits, 6 numbers:\", get_pred(onp.array([10, 33, 52, 21, 82, 10])))" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Small digits: 8 0 42 28 \n", "Small digits, 6 numbers: 10 0 20 82 71 115 \n" ] } ], - "source": [ - "print(\"Small digits:\", get_pred(np.array([10, 3, 5, 2, 8])))\n", - "print(\"Small digits, 6 numbers:\", get_pred(np.array([10, 33, 52, 21, 82, 10])))" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "This could be improved by adjusting the training dataset accordingly" - ] + ], + "metadata": {} } ], "metadata": { @@ -604,4 +603,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/example/gluon/actor_critic/actor_critic.py b/example/gluon/actor_critic/actor_critic.py index 6d4474b4f239..8a043f3f04d6 100644 --- a/example/gluon/actor_critic/actor_critic.py +++ b/example/gluon/actor_critic/actor_critic.py @@ -20,13 +20,12 @@ import argparse import gym from itertools import count -import numpy as np +import numpy as onp import mxnet as mx -import mxnet.ndarray as F from mxnet import gluon from mxnet.gluon import nn -from mxnet import autograd +from mxnet import autograd, npx parser = argparse.ArgumentParser(description='MXNet actor-critic example') @@ -48,16 +47,15 @@ class Policy(gluon.Block): def __init__(self, **kwargs): super(Policy, self).__init__(**kwargs) - with self.name_scope(): - self.dense = nn.Dense(16, in_units=4, activation='relu') - self.action_pred = nn.Dense(2, in_units=16) - self.value_pred = nn.Dense(1, in_units=16) + self.dense = nn.Dense(16, in_units=4, activation='relu') + self.action_pred = nn.Dense(2, in_units=16) + self.value_pred = nn.Dense(1, in_units=16) def forward(self, x): x = self.dense(x) probs = self.action_pred(x) values = self.value_pred(x) - return F.softmax(probs), values + return npx.softmax(probs), values net = Policy() net.initialize(mx.init.Uniform(0.02)) @@ -74,14 +72,14 @@ def forward(self, x): with autograd.record(): # Sample a sequence of actions for t in range(10000): - state = mx.nd.array(np.expand_dims(state, 0)) - prob, value = net(state) - action, logp = mx.nd.sample_multinomial(prob, get_prob=True) + state = mx.nd.array(onp.expand_dims(state, 0)) + prob, value = net(state.as_np_ndarray()) + action, logp = mx.nd.sample_multinomial(prob.as_nd_ndarray(), get_prob=True) state, reward, done, _ = env.step(action.asnumpy()[0]) if args.render: env.render() rewards.append(reward) - values.append(value) + values.append(value.as_np_ndarray()) actions.append(action.asnumpy()[0]) heads.append(logp) if done: @@ -93,12 +91,12 @@ def forward(self, x): for i in range(len(rewards)-1, -1, -1): R = rewards[i] + args.gamma * R rewards[i] = R - rewards = np.array(rewards) + rewards = onp.array(rewards) rewards -= rewards.mean() - rewards /= rewards.std() + np.finfo(rewards.dtype).eps + rewards /= rewards.std() + onp.finfo(rewards.dtype).eps # compute loss and gradient - L = sum([loss(value, mx.nd.array([r])) for r, value in zip(rewards, values)]) + L = sum([loss(value, mx.np.array([r])) for r, value in zip(rewards, values)]) final_nodes = [L] for logp, r, v in zip(heads, rewards, values): reward = r - v.asnumpy()[0,0] diff --git a/example/gluon/audio/README.md b/example/gluon/audio/README.md deleted file mode 100644 index 39006e301722..000000000000 --- a/example/gluon/audio/README.md +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - -# Urban Sounds Classification in MXNet Gluon - -This example provides an end-to-end pipeline for a common datahack competition - [Urban Sounds Classification Example](https://datahack.analyticsvidhya.com/contest/practice-problem-urban-sound-classification/). - -After logging in, the data set can be downloaded. -The details of the dataset and the link to download it are given below: - - -## Urban Sounds Dataset: -### Description - The dataset contains 8732 wav files which are audio samples(<= 4s)) of street sounds like engine_idling, car_horn, children_playing, dog_barking and so on. - The task is to classify these audio samples into one of the following 10 labels: - ``` - siren, - street_music, - drilling, - dog_bark, - children_playing, - gun_shot, - engine_idling, - air_conditioner, - jackhammer, - car_horn - ``` - -To be able to run this example: - -1. `pip install -r requirements.txt` - - If you are in the directory where the requirements.txt file lies, - this step installs the required libraries to run the example. - The main dependency that is required is: Librosa. - The version used to test the example is: `0.6.2` - For more details, refer here: -https://librosa.github.io/librosa/install.html - -2. Download the dataset(train.zip, test.zip) required for this example from the location: -https://drive.google.com/drive/folders/0By0bAi7hOBAFUHVXd1JCN3MwTEU - -3. Extract both the zip archives into the **current directory** - after unzipping you would get 2 new folders namely, - **Train** and **Test** and two csv files - **train.csv**, **test.csv** - - Assuming you are in a directory *"UrbanSounds"*, after downloading and extracting train.zip, the folder structure should be: - - ``` - UrbanSounds - - Train - - 0.wav, 1.wav ... - - train.csv - - train.py - - predict.py ... - ``` - -4. Apache MXNet is installed on the machine. For instructions, go to the link: https://mxnet.apache.org/install/ - - - -For information on the current design of how the AudioFolderDataset is implemented, refer below: -https://cwiki.apache.org/confluence/display/MXNET/Gluon+-+Audio - -### Usage - -For training: - -- Arguments - - train : The folder/directory that contains the audio(wav) files locally. Default = "./Train" - - csv: The file name of the csv file that contains audio file name to label mapping. Default = "train.csv" - - epochs : Number of epochs to train the model. Default = 30 - - batch_size : The batch size for training. Default = 32 - - -###### To use the default arguments, use: -``` -python train.py -``` -or - -###### To pass command-line arguments for training data directory, epochs, batch_size, csv file name, use : -``` -python train.py --train ./Train --csv train.csv --batch_size 32 --epochs 30 -``` - -For prediction: - -- Arguments - - pred : The folder/directory that contains the audio(wav) files which are to be classified. Default = "./Test" - - -###### To use the default arguments, use: -``` -python predict.py -``` -or - -###### To pass command-line arguments for test data directory, use : -``` -python predict.py --pred ./Test -``` diff --git a/example/gluon/audio/transforms.py b/example/gluon/audio/transforms.py deleted file mode 100644 index 8b76d131cdb1..000000000000 --- a/example/gluon/audio/transforms.py +++ /dev/null @@ -1,205 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# coding: utf-8 -# pylint: disable= arguments-differ -"""Audio transforms.""" - -import warnings -import numpy as np -try: - import librosa -except ImportError as e: - warnings.warn("librosa dependency could not be resolved or \ - imported, could not provide some/all transform.") - -from mxnet import ndarray as nd -from mxnet.gluon.block import Block - -class MFCC(Block): - """Extracts Mel frequency cepstrum coefficients from the audio data file - More details : https://librosa.github.io/librosa/generated/librosa.feature.mfcc.html - - Attributes - ---------- - sampling_rate: int, default 22050 - sampling rate of the input audio signal - num_mfcc: int, default 20 - number of mfccs to return - - - Inputs: - - **x**: input tensor (samples, ) shape. - - Outputs: - - **out**: output array is a scaled NDArray with (samples, ) shape. - - """ - - def __init__(self, sampling_rate=22050, num_mfcc=20): - self._sampling_rate = sampling_rate - self._num_fcc = num_mfcc - super(MFCC, self).__init__() - - def forward(self, x): - if isinstance(x, np.ndarray): - y = x - elif isinstance(x, nd.NDArray): - y = x.asnumpy() - else: - warnings.warn("MFCC - allowed datatypes mx.nd.NDArray and numpy.ndarray") - return x - - audio_tmp = np.mean(librosa.feature.mfcc(y=y, sr=self._sampling_rate, n_mfcc=self._num_fcc).T, axis=0) - return nd.array(audio_tmp) - - -class Scale(Block): - """Scale audio numpy.ndarray from a 16-bit integer to a floating point number between - -1.0 and 1.0. The 16-bit integer is the sample resolution or bit depth. - - Attributes - ---------- - scale_factor : float - The factor to scale the input tensor by. - - - Inputs: - - **x**: input tensor (samples, ) shape. - - Outputs: - - **out**: output array is a scaled NDArray with (samples, ) shape. - - Examples - -------- - >>> scale = audio.transforms.Scale(scale_factor=2) - >>> audio_samples = mx.nd.array([2,3,4]) - >>> scale(audio_samples) - [1. 1.5 2. ] - - - """ - - def __init__(self, scale_factor=2**31): - self.scale_factor = scale_factor - super(Scale, self).__init__() - - def forward(self, x): - if self.scale_factor == 0: - warnings.warn("Scale factor cannot be 0.") - return x - if isinstance(x, np.ndarray): - return nd.array(x/self.scale_factor) - return x / self.scale_factor - - -class PadTrim(Block): - """Pad/Trim a 1d-NDArray of NPArray (Signal or Labels) - - Attributes - ---------- - max_len : int - Length to which the array will be padded or trimmed to. - fill_value: int or float - If there is a need of padding, what value to pad at the end of the input array. - - - Inputs: - - **x**: input tensor (samples, ) shape. - - Outputs: - - **out**: output array is a scaled NDArray with (max_len, ) shape. - - Examples - -------- - >>> padtrim = audio.transforms.PadTrim(max_len=9, fill_value=0) - >>> audio_samples = mx.nd.array([1,2,3,4,5]) - >>> padtrim(audio_samples) - [1. 2. 3. 4. 5. 0. 0. 0. 0.] - - - """ - - def __init__(self, max_len, fill_value=0): - self._max_len = max_len - self._fill_value = fill_value - super(PadTrim, self).__init__() - - def forward(self, x): - if isinstance(x, np.ndarray): - x = nd.array(x) - if self._max_len > x.size: - pad = nd.ones((self._max_len - x.size,)) * self._fill_value - x = nd.concat(x, pad, dim=0) - elif self._max_len < x.size: - x = x[:self._max_len] - return x - - -class MEL(Block): - """Create MEL Spectrograms from a raw audio signal. Relatively pretty slow. - - Attributes - ---------- - sampling_rate: int, default 22050 - sampling rate of the input audio signal - num_fft: int, default 2048 - length of the Fast Fourier transform window - num_mels: int, default 20 - number of mel bands to generate - hop_length: int, default 512 - total samples between successive frames - - - Inputs: - - **x**: input tensor (samples, ) shape. - - Outputs: - - **out**: output array which consists of mel spectograms, shape = (n_mels, 1) - - Usage (see librosa.feature.melspectrogram docs): - MEL(sr=16000, n_fft=1600, hop_length=800, n_mels=64) - - Examples - -------- - >>> mel = audio.transforms.MEL() - >>> audio_samples = mx.nd.array([1,2,3,4,5]) - >>> mel(audio_samples) - [[3.81801406e+04] - [9.86858240e-29] - [1.87405472e-29] - [2.38637225e-29] - [3.94043010e-29] - [3.67071565e-29] - [7.29390295e-29] - [8.84324438e-30]... - - - """ - - def __init__(self, sampling_rate=22050, num_fft=2048, num_mels=20, hop_length=512): - self._sampling_rate = sampling_rate - self._num_fft = num_fft - self._num_mels = num_mels - self._hop_length = hop_length - super(MEL, self).__init__() - - def forward(self, x): - if isinstance(x, nd.NDArray): - x = x.asnumpy() - specs = librosa.feature.melspectrogram(x, sr=self._sampling_rate,\ - n_fft=self._num_fft, n_mels=self._num_mels, hop_length=self._hop_length) - return nd.array(specs) diff --git a/example/gluon/audio/urban_sounds/README.md b/example/gluon/audio/urban_sounds/README.md deleted file mode 100644 index 4ad76ff114a8..000000000000 --- a/example/gluon/audio/urban_sounds/README.md +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - -# Urban Sounds Classification in MXNet Gluon - -This example provides an end-to-end pipeline for a common datahack competition - Urban Sounds Classification Example. -Below is the link to the competition: -https://datahack.analyticsvidhya.com/contest/practice-problem-urban-sound-classification/ - -After logging in, the data set can be downloaded. -The details of the dataset and the link to download it are given below: - - -## Urban Sounds Dataset: -### Description - The dataset contains 8732 wav files which are audio samples(<= 4s)) of street sounds like engine_idling, car_horn, children_playing, dog_barking and so on. - The task is to classify these audio samples into one of the following 10 labels: - ``` - siren, - street_music, - drilling, - dog_bark, - children_playing, - gun_shot, - engine_idling, - air_conditioner, - jackhammer, - car_horn - ``` - -To be able to run this example: - -1. `pip install -r requirements.txt` - - If you are in the directory where the requirements.txt file lies, - this step installs the required libraries to run the example. - The main dependency that is required is: Librosa. - The version used to test the example is: `0.6.2` - For more details, refer here: -https://librosa.github.io/librosa/install.html - -2. Download the dataset(train.zip, test.zip) required for this example from the location: -https://drive.google.com/drive/folders/0By0bAi7hOBAFUHVXd1JCN3MwTEU - -3. Extract both the zip archives into the **current directory** - after unzipping you would get 2 new folders namely, - **Train** and **Test** and two csv files - **train.csv**, **test.csv** - - Assuming you are in a directory *"UrbanSounds"*, after downloading and extracting train.zip, the folder structure should be: - - ``` - UrbanSounds - - Train - - 0.wav, 1.wav ... - - train.csv - - train.py - - predict.py ... - ``` - -4. Apache MXNet is installed on the machine. For instructions, go to the link: https://mxnet.apache.org/install/ - - - -For information on the current design of how the AudioFolderDataset is implemented, refer below: -https://cwiki.apache.org/confluence/display/MXNET/Gluon+-+Audio - -### Usage - -For training: - -- Arguments - - train : The folder/directory that contains the audio(wav) files locally. Default = "./Train" - - csv: The file name of the csv file that contains audio file name to label mapping. Default = "train.csv" - - epochs : Number of epochs to train the model. Default = 30 - - batch_size : The batch size for training. Default = 32 - - -###### To use the default arguments, use: -``` -python train.py -``` -or - -###### To pass command-line arguments for training data directory, epochs, batch_size, csv file name, use : -``` -python train.py --train ./Train --csv train.csv --batch_size 32 --epochs 30 -``` - -For prediction: - -- Arguments - - pred : The folder/directory that contains the audio(wav) files which are to be classified. Default = "./Test" - - -###### To use the default arguments, use: -``` -python predict.py -``` -or - -###### To pass command-line arguments for test data directory, use : -``` -python predict.py --pred ./Test -``` \ No newline at end of file diff --git a/example/gluon/audio/urban_sounds/datasets.py b/example/gluon/audio/urban_sounds/datasets.py deleted file mode 100644 index 51c040c8f162..000000000000 --- a/example/gluon/audio/urban_sounds/datasets.py +++ /dev/null @@ -1,179 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# coding: utf-8 -# pylint: disable= -""" Audio Dataset container.""" -from __future__ import print_function -__all__ = ['AudioFolderDataset'] - -import os -import warnings -from itertools import islice -import csv -from mxnet.gluon.data import Dataset -from mxnet import ndarray as nd -try: - import librosa -except ImportError as e: - raise ImportError("librosa dependency could not be resolved or \ - imported, could not load audio onto the numpy array. pip install librosa") - - - -class AudioFolderDataset(Dataset): - """A dataset for loading Audio files stored in a folder structure like:: - - root/children_playing/0.wav - root/siren/23.wav - root/drilling/26.wav - root/dog_barking/42.wav - OR - Files(wav) and a csv file that has file name and associated label - - Parameters - ---------- - root : str - Path to root directory. - transform : callable, default None - A function that takes data and label and transforms them - train_csv: str, default None - train_csv should be populated by the training csv filename - file_format: str, default '.wav' - The format of the audio files(.wav) - skip_header: boolean, default False - While reading from csv file, whether to skip at the start of the file to avoid reading in header - - - Attributes - ---------- - synsets : list - List of class names. `synsets[i]` is the name for the `i`th label - items : list of tuples - List of all audio in (filename, label) pairs. - - """ - def __init__(self, root, train_csv=None, file_format='.wav', skip_header=False): - if not librosa: - warnings.warn("pip install librosa to continue.") - raise RuntimeError("Librosa not installed. Run pip install librosa and retry this step.") - self._root = os.path.expanduser(root) - self._exts = ['.wav'] - self._format = file_format - self._train_csv = train_csv - if file_format.lower() not in self._exts: - raise RuntimeError("Format {} not supported currently.".format(file_format)) - skip_rows = 0 - if skip_header: - skip_rows = 1 - self._list_audio_files(self._root, skip_rows=skip_rows) - - - def _list_audio_files(self, root, skip_rows=0): - """Populates synsets - a map of index to label for the data items. - Populates the data in the dataset, making tuples of (data, label) - """ - self.synsets = [] - self.items = [] - if not self._train_csv: - # The audio files are organized in folder structure with - # directory name as label and audios in them - self._folder_structure(root) - else: - # train_csv contains mapping between filename and label - self._csv_labelled_dataset(root, skip_rows=skip_rows) - - # Generating the synset.txt file now - if not os.path.exists("./synset.txt"): - with open("./synset.txt", "w") as synsets_file: - for item in self.synsets: - synsets_file.write(item+os.linesep) - print("Synsets is generated as synset.txt") - else: - warnings.warn("Synset file already exists in the current directory! Not generating synset.txt.") - - - def _folder_structure(self, root): - for folder in sorted(os.listdir(root)): - path = os.path.join(root, folder) - if not os.path.isdir(path): - warnings.warn('Ignoring {}, which is not a directory.'.format(path)) - continue - label = len(self.synsets) - self.synsets.append(folder) - for filename in sorted(os.listdir(path)): - file_name = os.path.join(path, filename) - ext = os.path.splitext(file_name)[1] - if ext.lower() not in self._exts: - warnings.warn('Ignoring {} of type {}. Only support {}'\ - .format(filename, ext, ', '.join(self._exts))) - continue - self.items.append((file_name, label)) - - - def _csv_labelled_dataset(self, root, skip_rows=0): - with open(self._train_csv, "r") as traincsv: - for line in islice(csv.reader(traincsv), skip_rows, None): - filename = os.path.join(root, line[0]) - label = line[1].strip() - if label not in self.synsets: - self.synsets.append(label) - if self._format not in filename: - filename = filename+self._format - self.items.append((filename, nd.array([self.synsets.index(label)]).reshape((1,)))) - - - def __getitem__(self, idx): - """Retrieve the item (data, label) stored at idx in items""" - filename, label = self.items[idx] - # resampling_type is passed as kaiser_fast for a better performance - X1, _ = librosa.load(filename, res_type='kaiser_fast') - return nd.array(X1), label - - - def __len__(self): - """Retrieves the number of items in the dataset""" - return len(self.items) - - - def transform_first(self, fn, lazy=False): - """Returns a new dataset with the first element of each sample - transformed by the transformer function `fn`. - - This is useful, for example, when you only want to transform data - while keeping label as is. - lazy=False is passed to transform_first for dataset so that all tramsforms could be performed in - one shot and not during training. This is a performance consideration. - - Parameters - ---------- - fn : callable - A transformer function that takes the first element of a sample - as input and returns the transformed element. - lazy : bool, default False - If False, transforms all samples at once. Otherwise, - transforms each sample on demand. Note that if `fn` - is stochastic, you must set lazy to True or you will - get the same result on all epochs. - - Returns - ------- - Dataset - The transformed dataset. - - """ - return super(AudioFolderDataset, self).transform_first(fn, lazy=lazy) diff --git a/example/gluon/audio/urban_sounds/model.py b/example/gluon/audio/urban_sounds/model.py deleted file mode 100644 index af23cb946e2e..000000000000 --- a/example/gluon/audio/urban_sounds/model.py +++ /dev/null @@ -1,33 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -"""This module builds a model an MLP with a configurable output layer( number of units in the last layer). -Users can pass any number of units in the last layer. SInce this dataset has 10 labels, -the default value of num_labels = 10 -""" -import mxnet as mx -from mxnet import gluon - -# Defining a neural network with number of labels -def get_net(num_labels=10): - net = gluon.nn.Sequential() - with net.name_scope(): - net.add(gluon.nn.Dense(256, activation="relu")) # 1st layer (256 nodes) - net.add(gluon.nn.Dense(256, activation="relu")) # 2nd hidden layer ( 256 nodes ) - net.add(gluon.nn.Dense(num_labels)) - net.collect_params().initialize(mx.init.Xavier()) - return net diff --git a/example/gluon/audio/urban_sounds/predict.py b/example/gluon/audio/urban_sounds/predict.py deleted file mode 100644 index 0c3631173667..000000000000 --- a/example/gluon/audio/urban_sounds/predict.py +++ /dev/null @@ -1,92 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -""" Prediction module for Urban Sounds Classification""" -from __future__ import print_function -import os -import sys -import warnings -import mxnet as mx -from mxnet import nd -from model import get_net -try: - import librosa -except ImportError: - raise ImportError("Librosa is not installed! please run the following command:\ - `pip install librosa`") -sys.path.append('../') - -def predict(prediction_dir='./Test'): - """The function is used to run predictions on the audio files in the directory `pred_directory`. - - Parameters - ---------- - net: - The model that has been trained. - prediction_dir: string, default ./Test - The directory that contains the audio files on which predictions are to be made - - """ - - if not os.path.exists(prediction_dir): - warnings.warn("The directory on which predictions are to be made is not found!") - return - - if len(os.listdir(prediction_dir)) == 0: - warnings.warn("The directory on which predictions are to be made is empty! Exiting...") - return - - # Loading synsets - if not os.path.exists('./synset.txt'): - warnings.warn("The synset or labels for the dataset do not exist. Please run the training script first.") - return - - with open("./synset.txt", "r") as f: - synset = [l.rstrip() for l in f] - net = get_net(len(synset)) - print("Trying to load the model with the saved parameters...") - if not os.path.exists("./net.params"): - warnings.warn("The model does not have any saved parameters... Cannot proceed! Train the model first") - return - - net.load_parameters("./net.params") - file_names = os.listdir(prediction_dir) - full_file_names = [os.path.join(prediction_dir, item) for item in file_names] - from transforms import MFCC - mfcc = MFCC() - print("\nStarting predictions for audio files in ", prediction_dir, " ....\n") - for filename in full_file_names: - # Argument kaiser_fast to res_type is faster than 'kaiser_best'. To reduce the load time, passing kaiser_fast. - X1, _ = librosa.load(filename, res_type='kaiser_fast') - transformed_test_data = mfcc(mx.nd.array(X1)) - output = net(transformed_test_data.reshape((1, -1))) - prediction = nd.argmax(output, axis=1) - print(filename, " -> ", synset[(int)(prediction.asscalar())]) - - -if __name__ == '__main__': - try: - import argparse - parser = argparse.ArgumentParser(description="Urban Sounds clsssification example - MXNet") - parser.add_argument('--pred', '-p', help="Enter the folder path that contains your audio files", type=str) - args = parser.parse_args() - pred_dir = args.pred - - except ImportError: - warnings.warn("Argparse module not installed! passing default arguments.") - pred_dir = './Test' - predict(prediction_dir=pred_dir) - print("Urban sounds classification Prediction DONE!") diff --git a/example/gluon/audio/urban_sounds/requirements.txt b/example/gluon/audio/urban_sounds/requirements.txt deleted file mode 100644 index d885e0beec7e..000000000000 --- a/example/gluon/audio/urban_sounds/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -librosa>=0.6.2 # librosa is a library that is used to load the audio(wav) files and provides capabilities of feature extraction. -argparse # used for parsing arguments \ No newline at end of file diff --git a/example/gluon/audio/urban_sounds/train.py b/example/gluon/audio/urban_sounds/train.py deleted file mode 100644 index 8a55c5b5bc67..000000000000 --- a/example/gluon/audio/urban_sounds/train.py +++ /dev/null @@ -1,157 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -"""The module to run training on the Urban sounds dataset""" -from __future__ import print_function -import sys -import os -import time -import warnings -import mxnet as mx -from mxnet import gluon, nd, autograd -from datasets import AudioFolderDataset -import model -sys.path.append('../') - -def evaluate_accuracy(data_iterator, net): - """Function to evaluate accuracy of any data iterator passed to it as an argument""" - acc = mx.gluon.metric.Accuracy() - for data, label in data_iterator: - output = net(data) - predictions = nd.argmax(output, axis=1) - predictions = predictions.reshape((-1, 1)) - acc.update(preds=predictions, labels=label) - return acc.get()[1] - - -def train(train_dir=None, train_csv=None, epochs=30, batch_size=32): - """Function responsible for running the training the model.""" - - if not train_dir or not os.path.exists(train_dir) or not train_csv: - warnings.warn("No train directory could be found ") - return - # Make a dataset from the local folder containing Audio data - print("\nMaking an Audio Dataset...\n") - tick = time.time() - aud_dataset = AudioFolderDataset(train_dir, train_csv=train_csv, file_format='.wav', skip_header=True) - tock = time.time() - - print("Loading the dataset took ", (tock-tick), " seconds.") - print("\n=======================================\n") - print("Number of output classes = ", len(aud_dataset.synsets)) - print("\nThe labels are : \n") - print(aud_dataset.synsets) - # Get the model to train - net = model.get_net(len(aud_dataset.synsets)) - print("\nNeural Network = \n") - print(net) - print("\nModel - Neural Network Generated!\n") - print("=======================================\n") - - #Define the loss - Softmax CE Loss - softmax_loss = gluon.loss.SoftmaxCELoss(from_logits=False, sparse_label=True) - print("Loss function initialized!\n") - print("=======================================\n") - - #Define the trainer with the optimizer - trainer = gluon.Trainer(net.collect_params(), 'adadelta') - print("Optimizer - Trainer function initialized!\n") - print("=======================================\n") - print("Loading the dataset to the Gluon's OOTB Dataloader...") - - #Getting the data loader out of the AudioDataset and passing the transform - from transforms import MFCC - aud_transform = MFCC() - tick = time.time() - - audio_train_loader = gluon.data.DataLoader(aud_dataset.transform_first(aud_transform), batch_size=32, shuffle=True) - tock = time.time() - print("Time taken to load data and apply transform here is ", (tock-tick), " seconds.") - print("=======================================\n") - - - print("Starting the training....\n") - # Training loop - tick = time.time() - batch_size = batch_size - num_examples = len(aud_dataset) - - for epoch in range(epochs): - cumulative_loss = 0 - for data, label in audio_train_loader: - with autograd.record(): - output = net(data) - loss = softmax_loss(output, label) - loss.backward() - - trainer.step(batch_size) - cumulative_loss += mx.nd.sum(loss).asscalar() - - if epoch%5 == 0: - train_accuracy = evaluate_accuracy(audio_train_loader, net) - print("Epoch {}. Loss: {} Train accuracy : {} ".format(epoch, cumulative_loss/num_examples, train_accuracy)) - print("\n------------------------------\n") - - train_accuracy = evaluate_accuracy(audio_train_loader, net) - tock = time.time() - print("\nFinal training accuracy: ", train_accuracy) - - print("Training the sound classification for ", epochs, " epochs, MLP model took ", (tock-tick), " seconds") - print("====================== END ======================\n") - - print("Trying to save the model parameters here...") - net.save_parameters("./net.params") - print("Saved the model parameters in current directory.") - - -if __name__ == '__main__': - training_dir = './Train' - training_csv = './train.csv' - epochs = 30 - batch_size = 32 - - try: - import argparse - parser = argparse.ArgumentParser(description="Urban Sounds classification example - MXNet Gluon") - parser.add_argument('--train', '-t', help="Enter the folder path that contains your audio files", type=str) - parser.add_argument('--csv', '-c', help="Enter the filename of the csv that contains filename\ - to label mapping", type=str) - parser.add_argument('--epochs', '-e', help="Enter the number of epochs \ - you would want to run the training for.", type=int) - parser.add_argument('--batch_size', '-b', help="Enter the batch_size of data", type=int) - args = parser.parse_args() - - if args: - if args.train: - training_dir = args.train - - if args.csv: - training_csv = args.csv - - if args.epochs: - epochs = args.epochs - - if args.batch_size: - batch_size = args.batch_size - - - except ImportError as er: - warnings.warn("Argument parsing module could not be imported \ - Passing default arguments.") - - - train(train_dir=training_dir, train_csv=training_csv, epochs=epochs, batch_size=batch_size) - print("Urban sounds classification Training DONE!") diff --git a/example/gluon/data.py b/example/gluon/data.py index 7d0f882eec7a..7769f605cc47 100644 --- a/example/gluon/data.py +++ b/example/gluon/data.py @@ -174,7 +174,7 @@ def next(self): image = Image.open(fn).convert('YCbCr').split()[0] if image.size[0] > image.size[1]: image = image.transpose(Image.TRANSPOSE) - image = mx.nd.expand_dims(mx.nd.array(image), axis=2) + image = mx.np.expand_dims(mx.np.array(image), axis=2) target = image.copy() for aug in self.input_aug: image = aug(image) @@ -183,10 +183,10 @@ def next(self): data.append(image) label.append(target) - data = mx.nd.concat(*[mx.nd.expand_dims(d, axis=0) for d in data], dim=0) - label = mx.nd.concat(*[mx.nd.expand_dims(d, axis=0) for d in label], dim=0) - data = [mx.nd.transpose(data, axes=(0, 3, 1, 2)).astype('float32')/255] - label = [mx.nd.transpose(label, axes=(0, 3, 1, 2)).astype('float32')/255] + data = mx.np.concatenate([mx.np.expand_dims(d, axis=0) for d in data], axis=0) + label = mx.np.concatenate([mx.np.expand_dims(d, axis=0) for d in label], axis=0) + data = [mx.np.transpose(data, axes=(0, 3, 1, 2)).astype('float32')/255] + label = [mx.np.transpose(label, axes=(0, 3, 1, 2)).astype('float32')/255] return mx.io.DataBatch(data=data, label=label) else: diff --git a/example/gluon/dc_gan/README.md b/example/gluon/dc_gan/README.md deleted file mode 100644 index fd41d198a69d..000000000000 --- a/example/gluon/dc_gan/README.md +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - -# DCGAN in MXNet - -[Deep Convolutional Generative Adversarial Networks(DCGAN)](https://arxiv.org/abs/1511.06434) implementation with Apache MXNet GLUON. -This implementation uses [inception_score](https://github.com/openai/improved-gan) to evaluate the model. - -You can use this reference implementation on the MNIST and CIFAR-10 datasets. - - -#### Generated image output examples from the CIFAR-10 dataset -![Generated image output examples from the CIFAR-10 dataset](https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/example/gluon/DCGAN/fake_img_iter_13900.png) - -#### Generated image output examples from the MNIST dataset -![Generated image output examples from the MNIST dataset](https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/example/gluon/DCGAN/fake_img_iter_21700.png) - -#### inception_score in cpu and gpu (the real image`s score is around 3.3) -CPU & GPU - -![inception score with CPU](https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/example/gluon/DCGAN/inception_score_cifar10_cpu.png) -![inception score with GPU](https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/example/gluon/DCGAN/inception_score_cifar10.png) - -## Quick start -Use the following code to see the configurations you can set: -```bash -python dcgan.py -h -``` - - - optional arguments: - -h, --help show this help message and exit - --dataset DATASET dataset to use. options are cifar10 and mnist. - --batch-size BATCH_SIZE input batch size, default is 64 - --nz NZ size of the latent z vector, default is 100 - --ngf NGF the channel of each generator filter layer, default is 64. - --ndf NDF the channel of each descriminator filter layer, default is 64. - --nepoch NEPOCH number of epochs to train for, default is 25. - --niter NITER save generated images and inception_score per niter iters, default is 100. - --lr LR learning rate, default=0.0002 - --beta1 BETA1 beta1 for adam. default=0.5 - --cuda enables cuda - --netG NETG path to netG (to continue training) - --netD NETD path to netD (to continue training) - --outf OUTF folder to output images and model checkpoints - --check-point CHECK_POINT - save results at each epoch or not - --inception_score INCEPTION_SCORE - To record the inception_score, default is True. - - -Use the following Python script to train a DCGAN model with default configurations using the CIFAR-10 dataset and record metrics with `inception_score`: -```bash -python dcgan.py -``` diff --git a/example/gluon/dc_gan/__init__.py b/example/gluon/dc_gan/__init__.py deleted file mode 100644 index 26fa2cec6dd9..000000000000 --- a/example/gluon/dc_gan/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. diff --git a/example/gluon/dc_gan/dcgan.py b/example/gluon/dc_gan/dcgan.py deleted file mode 100644 index d7c36a0a3a67..000000000000 --- a/example/gluon/dc_gan/dcgan.py +++ /dev/null @@ -1,355 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -"""Generate MXNet implementation of Deep Convolutional Generative Adversarial Networks""" - -import logging -from datetime import datetime -import argparse -import os -import time -import numpy as np -from matplotlib import pyplot as plt -import matplotlib as mpl -import mxnet as mx -from mxnet import gluon -from mxnet.gluon import nn -from mxnet import autograd -from inception_score import get_inception_score - -mpl.use('Agg') - - -def fill_buf(buf, i, img, shape): - """Reposition the images generated by the generator so that it can be saved as picture matrix. - :param buf: the images metric - :param i: index of each image - :param img: images generated by generator once - :param shape: each image`s shape - :return: Adjust images for output - """ - n = buf.shape[0]//shape[1] - m = buf.shape[1]//shape[0] - - sx = (i%m)*shape[0] - sy = (i//m)*shape[1] - buf[sy:sy+shape[1], sx:sx+shape[0], :] = img - - -def visual(title, X, name): - """Image visualization and preservation - :param title: title - :param X: images to visualized - :param name: saved picture`s name - :return: - """ - assert len(X.shape) == 4 - X = X.transpose((0, 2, 3, 1)) - X = np.clip((X - np.min(X))*(255.0/(np.max(X) - np.min(X))), 0, 255).astype(np.uint8) - n = np.ceil(np.sqrt(X.shape[0])) - buff = np.zeros((int(n*X.shape[1]), int(n*X.shape[2]), int(X.shape[3])), dtype=np.uint8) - for i, img in enumerate(X): - fill_buf(buff, i, img, X.shape[1:3]) - buff = buff[:, :, ::-1] - plt.imshow(buff) - plt.title(title) - plt.savefig(name) - - -parser = argparse.ArgumentParser() -parser = argparse.ArgumentParser(description='Train a DCgan model for image generation ' - 'and then use inception_score to metric the result.') -parser.add_argument('--dataset', type=str, default='cifar10', help='dataset to use. options are cifar10 and mnist.') -parser.add_argument('--batch-size', type=int, default=64, help='input batch size, default is 64') -parser.add_argument('--nz', type=int, default=100, help='size of the latent z vector, default is 100') -parser.add_argument('--ngf', type=int, default=64, help='the channel of each generator filter layer, default is 64.') -parser.add_argument('--ndf', type=int, default=64, help='the channel of each descriminator filter layer, ' - 'default is 64.') -parser.add_argument('--nepoch', type=int, default=25, help='number of epochs to train for, default is 25.') -parser.add_argument('--niter', type=int, default=10, help='save generated images and inception_score per niter iters, ' - 'default is 100.') -parser.add_argument('--lr', type=float, default=0.0002, help='learning rate, default=0.0002') -parser.add_argument('--beta1', type=float, default=0.5, help='beta1 for adam. default=0.5') -parser.add_argument('--cuda', action='store_true', help='enables cuda') -parser.add_argument('--netG', default='', help="path to netG (to continue training)") -parser.add_argument('--netD', default='', help="path to netD (to continue training)") -parser.add_argument('--outf', default='./results', help='folder to output images and model checkpoints') -parser.add_argument('--check-point', default=True, help="save results at each epoch or not") -parser.add_argument('--inception_score', type=bool, default=True, help='To record the inception_score, ' - 'default is True.') - -opt = parser.parse_args() -print(opt) - -logging.basicConfig(level=logging.DEBUG) - -nz = int(opt.nz) -ngf = int(opt.ngf) -ndf = int(opt.ndf) -niter = opt.niter -nc = 3 -if opt.cuda: - ctx = mx.gpu(0) -else: - ctx = mx.cpu() -batch_size = opt.batch_size -check_point = bool(opt.check_point) -outf = opt.outf -dataset = opt.dataset - -if not os.path.exists(outf): - os.makedirs(outf) - - -def transformer(data, label): - """Get the translation of images""" - # resize to 64x64 - data = mx.image.imresize(data, 64, 64) - # transpose from (64, 64, 3) to (3, 64, 64) - data = mx.nd.transpose(data, (2, 0, 1)) - # normalize to [-1, 1] - data = data.astype(np.float32)/128 - 1 - # if image is greyscale, repeat 3 times to get RGB image. - if data.shape[0] == 1: - data = mx.nd.tile(data, (3, 1, 1)) - return data, label - - -# get dataset with the batch_size num each time -def get_dataset(dataset_name): - """Load the dataset and split it to train/valid data - - :param dataset_name: string - - Returns: - train_data: int array - training dataset - val_data: int array - valid dataset - """ - # mnist - if dataset == "mnist": - train_data = gluon.data.DataLoader( - gluon.data.vision.MNIST('./data', train=True).transform(transformer), - batch_size, shuffle=True, last_batch='discard') - - val_data = gluon.data.DataLoader( - gluon.data.vision.MNIST('./data', train=False).transform(transformer), - batch_size, shuffle=False) - # cifar10 - elif dataset == "cifar10": - train_data = gluon.data.DataLoader( - gluon.data.vision.CIFAR10('./data', train=True).transform(transformer), - batch_size, shuffle=True, last_batch='discard') - - val_data = gluon.data.DataLoader( - gluon.data.vision.CIFAR10('./data', train=False).transform(transformer), - batch_size, shuffle=False) - - return train_data, val_data - - -def get_netG(): - """Get net G""" - # build the generator - netG = nn.Sequential() - with netG.name_scope(): - # input is Z, going into a convolution - netG.add(nn.Conv2DTranspose(ngf * 8, 4, 1, 0, use_bias=False)) - netG.add(nn.BatchNorm()) - netG.add(nn.Activation('relu')) - # state size. (ngf*8) x 4 x 4 - netG.add(nn.Conv2DTranspose(ngf * 4, 4, 2, 1, use_bias=False)) - netG.add(nn.BatchNorm()) - netG.add(nn.Activation('relu')) - # state size. (ngf*4) x 8 x 8 - netG.add(nn.Conv2DTranspose(ngf * 2, 4, 2, 1, use_bias=False)) - netG.add(nn.BatchNorm()) - netG.add(nn.Activation('relu')) - # state size. (ngf*2) x 16 x 16 - netG.add(nn.Conv2DTranspose(ngf, 4, 2, 1, use_bias=False)) - netG.add(nn.BatchNorm()) - netG.add(nn.Activation('relu')) - # state size. (ngf) x 32 x 32 - netG.add(nn.Conv2DTranspose(nc, 4, 2, 1, use_bias=False)) - netG.add(nn.Activation('tanh')) - # state size. (nc) x 64 x 64 - - return netG - - -def get_netD(): - """Get the netD""" - # build the discriminator - netD = nn.Sequential() - with netD.name_scope(): - # input is (nc) x 64 x 64 - netD.add(nn.Conv2D(ndf, 4, 2, 1, use_bias=False)) - netD.add(nn.LeakyReLU(0.2)) - # state size. (ndf) x 32 x 32 - netD.add(nn.Conv2D(ndf * 2, 4, 2, 1, use_bias=False)) - netD.add(nn.BatchNorm()) - netD.add(nn.LeakyReLU(0.2)) - # state size. (ndf*2) x 16 x 16 - netD.add(nn.Conv2D(ndf * 4, 4, 2, 1, use_bias=False)) - netD.add(nn.BatchNorm()) - netD.add(nn.LeakyReLU(0.2)) - # state size. (ndf*4) x 8 x 8 - netD.add(nn.Conv2D(ndf * 8, 4, 2, 1, use_bias=False)) - netD.add(nn.BatchNorm()) - netD.add(nn.LeakyReLU(0.2)) - # state size. (ndf*8) x 4 x 4 - netD.add(nn.Conv2D(2, 4, 1, 0, use_bias=False)) - # state size. 2 x 1 x 1 - - return netD - - -def get_configurations(netG, netD): - """Get configurations for net""" - # loss - loss = gluon.loss.SoftmaxCrossEntropyLoss() - - # initialize the generator and the discriminator - netG.initialize(mx.init.Normal(0.02), ctx=ctx) - netD.initialize(mx.init.Normal(0.02), ctx=ctx) - - # trainer for the generator and the discriminator - trainerG = gluon.Trainer(netG.collect_params(), 'adam', {'learning_rate': opt.lr, 'beta1': opt.beta1}) - trainerD = gluon.Trainer(netD.collect_params(), 'adam', {'learning_rate': opt.lr, 'beta1': opt.beta1}) - - return loss, trainerG, trainerD - - -def ins_save(inception_score): - # draw the inception_score curve - length = len(inception_score) - x = np.arange(0, length) - plt.figure(figsize=(8.0, 6.0)) - plt.plot(x, inception_score) - plt.xlabel("iter/100") - plt.ylabel("inception_score") - plt.savefig("inception_score.png") - - -# main function -def main(): - """Entry point to dcgan""" - print("|------- new changes!!!!!!!!!") - # to get the dataset and net configuration - train_data, val_data = get_dataset(dataset) - netG = get_netG() - netD = get_netD() - loss, trainerG, trainerD = get_configurations(netG, netD) - - # set labels - real_label = mx.nd.ones((opt.batch_size,), ctx=ctx) - fake_label = mx.nd.zeros((opt.batch_size,), ctx=ctx) - - metric = mx.gluon.metric.Accuracy() - print('Training... ') - stamp = datetime.now().strftime('%Y_%m_%d-%H_%M') - - iter = 0 - - # to metric the network - loss_d = [] - loss_g = [] - inception_score = [] - - for epoch in range(opt.nepoch): - tic = time.time() - btic = time.time() - for data, _ in train_data: - ############################ - # (1) Update D network: maximize log(D(x)) + log(1 - D(G(z))) - ########################### - # train with real_t - data = data.as_in_context(ctx) - noise = mx.nd.random.normal(0, 1, shape=(opt.batch_size, nz, 1, 1), ctx=ctx) - - with autograd.record(): - output = netD(data) - # reshape output from (opt.batch_size, 2, 1, 1) to (opt.batch_size, 2) - output = output.reshape((opt.batch_size, 2)) - errD_real = loss(output, real_label) - - metric.update([real_label, ], [output, ]) - - with autograd.record(): - fake = netG(noise) - output = netD(fake.detach()) - output = output.reshape((opt.batch_size, 2)) - errD_fake = loss(output, fake_label) - errD = errD_real + errD_fake - - errD.backward() - metric.update([fake_label,], [output,]) - - trainerD.step(opt.batch_size) - - ############################ - # (2) Update G network: maximize log(D(G(z))) - ########################### - with autograd.record(): - output = netD(fake) - output = output.reshape((-1, 2)) - errG = loss(output, real_label) - - errG.backward() - - trainerG.step(opt.batch_size) - - name, acc = metric.get() - logging.info('discriminator loss = %f, generator loss = %f, binary training acc = %f at iter %d epoch %d' - , mx.nd.mean(errD).asscalar(), mx.nd.mean(errG).asscalar(), acc, iter, epoch) - if iter % niter == 0: - visual('gout', fake.asnumpy(), name=os.path.join(outf, 'fake_img_iter_%d.png' % iter)) - visual('data', data.asnumpy(), name=os.path.join(outf, 'real_img_iter_%d.png' % iter)) - # record the metric data - loss_d.append(errD) - loss_g.append(errG) - if opt.inception_score: - score, _ = get_inception_score(fake) - inception_score.append(score) - - iter = iter + 1 - btic = time.time() - - name, acc = metric.get() - metric.reset() - logging.info('\nbinary training acc at epoch %d: %s=%f', epoch, name, acc) - logging.info('time: %f', time.time() - tic) - - # save check_point - if check_point: - netG.save_parameters(os.path.join(outf, 'generator_epoch_%d.params' %epoch)) - netD.save_parameters(os.path.join(outf, 'discriminator_epoch_%d.params' % epoch)) - - # save parameter - netG.save_parameters(os.path.join(outf, 'generator.params')) - netD.save_parameters(os.path.join(outf, 'discriminator.params')) - - # visualization the inception_score as a picture - if opt.inception_score: - ins_save(inception_score) - - -if __name__ == '__main__': - if opt.inception_score: - print("Use inception_score to metric this DCgan model, the reusult is save as a picture " - "named \"inception_score.png\"!") - main() diff --git a/example/gluon/dc_gan/inception_score.py b/example/gluon/dc_gan/inception_score.py deleted file mode 100644 index e23513f5055e..000000000000 --- a/example/gluon/dc_gan/inception_score.py +++ /dev/null @@ -1,110 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -from mxnet.gluon.model_zoo import vision as models -import mxnet as mx -from mxnet import nd -import numpy as np -import math -import sys - -import cv2 - - -inception_model = None - - -def get_inception_score(images, splits=10): - """ - Inception_score function. - The images will be divided into 'splits' parts, and calculate each inception_score separately, - then return the mean and std of inception_scores of these parts. - :param images: Images(num x c x w x h) that needs to calculate inception_score. - :param splits: - :return: mean and std of inception_score - """ - assert (images.shape[1] == 3) - - # load inception model - if inception_model is None: - _init_inception() - - # resize images to adapt inception model(inceptionV3) - if images.shape[2] != 299: - images = resize(images, 299, 299) - - preds = [] - bs = 4 - n_batches = int(math.ceil(float(images.shape[0])/float(bs))) - - # to get the predictions/picture of inception model - for i in range(n_batches): - sys.stdout.write(".") - sys.stdout.flush() - inps = images[(i * bs):min((i + 1) * bs, len(images))] - # inps size. bs x 3 x 299 x 299 - pred = nd.softmax(inception_model(inps)) - # pred size. bs x 1000 - preds.append(pred.asnumpy()) - - # list to array - preds = np.concatenate(preds, 0) - scores = [] - - # to calculate the inception_score each split. - for i in range(splits): - # extract per split image pred - part = preds[(i * preds.shape[0] // splits):((i + 1) * preds.shape[0] // splits), :] - kl = part * (np.log(part) - np.log(np.expand_dims(np.mean(part, 0), 0))) - kl = np.mean(np.sum(kl, 1)) - scores.append(np.exp(kl)) - - return np.mean(scores), np.std(scores) - - -def _init_inception(): - global inception_model - inception_model = models.inception_v3(pretrained=True) - print("success import inception model, and the model is inception_v3!") - - -def resize(images, w, h): - nums = images.shape[0] - res = nd.random.uniform(0, 255, (nums, 3, w, h)) - for i in range(nums): - img = images[i, :, :, :] - img = mx.nd.transpose(img, (1, 2, 0)) - # Replace 'mx.image.imresize()' with 'cv2.resize()' because : Operator _cvimresize is not implemented for GPU. - # img = mx.image.imresize(img, w, h) - img = cv2.resize(img.asnumpy(), (299, 299)) - img = nd.array(img) - img = mx.nd.transpose(img, (2, 0, 1)) - res[i, :, :, :] = img - - return res - - -if __name__ == '__main__': - if inception_model is None: - _init_inception() - # dummy data - images = nd.random.uniform(0, 255, (64, 3, 64, 64)) - print(images.shape[0]) - # resize(images,299,299) - - score = get_inception_score(images) - print(score) diff --git a/example/gluon/embedding_learning/README.md b/example/gluon/embedding_learning/README.md deleted file mode 100644 index ee3a0eae5c39..000000000000 --- a/example/gluon/embedding_learning/README.md +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - -# Image Embedding Learning - -This example implements embedding learning based on a Margin-based Loss with distance weighted sampling [(Wu et al, 2017)](http://www.philkr.net/papers/2017-10-01-iccv/2017-10-01-iccv.pdf). The model obtains a validation Recall@1 of ~64% on the [Caltech-UCSD Birds-200-2011](http://www.vision.caltech.edu/visipedia/CUB-200-2011.html) dataset. - - -## Usage -Download the data - -Note: the dataset is from [Caltech-UCSD Birds 200](http://www.vision.caltech.edu/visipedia/CUB-200.html). -These datasets are copyright Caltech Computational Vision Group and licensed CC BY 4.0 Attribution. -See [original dataset source](http://www.vision.caltech.edu/archive.html) for details -```bash -./get_cub200_data.sh -``` - -Example runs and the results: -``` -python3 train.py --data-path=data/CUB_200_2011 --gpus=0,1 --use-pretrained -``` - -
- -`python train.py --help` gives the following arguments: -``` -optional arguments: - -h, --help show this help message and exit - --data-path DATA_PATH - path of data. - --embed-dim EMBED_DIM - dimensionality of image embedding. default is 128. - --batch-size BATCH_SIZE - training batch size per device (CPU/GPU). default is - 70. - --batch-k BATCH_K number of images per class in a batch. default is 5. - --gpus GPUS list of gpus to use, e.g. 0 or 0,2,5. empty means - using cpu. - --epochs EPOCHS number of training epochs. default is 20. - --optimizer OPTIMIZER - optimizer. default is adam. - --lr LR learning rate. default is 0.0001. - --lr-beta LR_BETA learning rate for the beta in margin based loss. - default is 0.1. - --margin MARGIN margin for the margin based loss. default is 0.2. - --beta BETA initial value for beta. default is 1.2. - --nu NU regularization parameter for beta. default is 0.0. - --factor FACTOR learning rate schedule factor. default is 0.5. - --steps STEPS epochs to update learning rate. default is - 12,14,16,18. - --wd WD weight decay rate. default is 0.0001. - --seed SEED random seed to use. default=123. - --model MODEL type of model to use. see vision_model for options. - --save-model-prefix SAVE_MODEL_PREFIX - prefix of models to be saved. - --use-pretrained enable using pretrained model from gluon. - --kvstore KVSTORE kvstore to use for trainer. - --log-interval LOG_INTERVAL - number of batches to wait before logging. -``` - -## Learned embeddings -The following visualizes the learned embeddings with t-SNE. - -![alt text](https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/example/embedding_learning/cub200_embedding.png) - - -## Citation -Sampling Matters in Deep Embedding Learning [paper] [project]
- Chao-Yuan Wu, R. Manmatha, Alexander J. Smola and Philipp Krähenbühl -
-@inproceedings{wu2017sampling,
-  title={Sampling Matters in Deep Embedding Learning},
-  author={Wu, Chao-Yuan and Manmatha, R and Smola, Alexander J and Kr{\"a}henb{\"u}hl, Philipp},
-  booktitle={ICCV},
-  year={2017}
-}
-
diff --git a/example/gluon/embedding_learning/data.py b/example/gluon/embedding_learning/data.py deleted file mode 100644 index e3b96d6c7dd8..000000000000 --- a/example/gluon/embedding_learning/data.py +++ /dev/null @@ -1,158 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -import os -import random - -import numpy as np - -import mxnet as mx -from mxnet import nd - -def transform(data, target_wd, target_ht, is_train, box): - """Crop and normnalize an image nd array.""" - if box is not None: - x, y, w, h = box - data = data[y:min(y+h, data.shape[0]), x:min(x+w, data.shape[1])] - - # Resize to target_wd * target_ht. - data = mx.image.imresize(data, target_wd, target_ht) - - # Normalize in the same way as the pre-trained model. - data = data.astype(np.float32) / 255.0 - data = (data - mx.nd.array([0.485, 0.456, 0.406])) / mx.nd.array([0.229, 0.224, 0.225]) - - if is_train: - if random.random() < 0.5: - data = nd.flip(data, axis=1) - data, _ = mx.image.random_crop(data, (224, 224)) - else: - data, _ = mx.image.center_crop(data, (224, 224)) - - # Transpose from (target_wd, target_ht, 3) - # to (3, target_wd, target_ht). - data = nd.transpose(data, (2, 0, 1)) - - # If image is greyscale, repeat 3 times to get RGB image. - if data.shape[0] == 1: - data = nd.tile(data, (3, 1, 1)) - return data.reshape((1,) + data.shape) - - -class CUB200Iter(mx.io.DataIter): - """Iterator for the CUB200-2011 dataset. - Parameters - ---------- - data_path : str, - The path to dataset directory. - batch_k : int, - Number of images per class in a batch. - batch_size : int, - Batch size. - batch_size : tupple, - Data shape. E.g. (3, 224, 224). - is_train : bool, - Training data or testig data. Training batches are randomly sampled. - Testing batches are loaded sequentially until reaching the end. - """ - def __init__(self, data_path, batch_k, batch_size, data_shape, is_train): - super(CUB200Iter, self).__init__(batch_size) - self.data_shape = (batch_size,) + data_shape - self.batch_size = batch_size - self.provide_data = [('data', self.data_shape)] - self.batch_k = batch_k - self.is_train = is_train - - self.train_image_files = [[] for _ in range(100)] - self.test_image_files = [] - self.test_labels = [] - self.boxes = {} - self.test_count = 0 - - with open(os.path.join(data_path, 'images.txt'), 'r') as f_img, \ - open(os.path.join(data_path, 'image_class_labels.txt'), 'r') as f_label, \ - open(os.path.join(data_path, 'bounding_boxes.txt'), 'r') as f_box: - for line_img, line_label, line_box in zip(f_img, f_label, f_box): - fname = os.path.join(data_path, 'images', line_img.strip().split()[-1]) - label = int(line_label.strip().split()[-1]) - 1 - box = [int(float(v)) for v in line_box.split()[-4:]] - self.boxes[fname] = box - - # Following "Deep Metric Learning via Lifted Structured Feature Embedding" paper, - # we use the first 100 classes for training, and the remaining for testing. - if label < 100: - self.train_image_files[label].append(fname) - else: - self.test_labels.append(label) - self.test_image_files.append(fname) - - self.n_test = len(self.test_image_files) - - def get_image(self, img, is_train): - """Load and transform an image.""" - img_arr = mx.image.imread(img) - img_arr = transform(img_arr, 256, 256, is_train, self.boxes[img]) - return img_arr - - def sample_train_batch(self): - """Sample a training batch (data and label).""" - batch = [] - labels = [] - num_groups = self.batch_size // self.batch_k - - # For CUB200, we use the first 100 classes for training. - sampled_classes = np.random.choice(100, num_groups, replace=False) - for i in range(num_groups): - img_fnames = np.random.choice(self.train_image_files[sampled_classes[i]], - self.batch_k, replace=False) - batch += [self.get_image(img_fname, is_train=True) for img_fname in img_fnames] - labels += [sampled_classes[i] for _ in range(self.batch_k)] - - return nd.concatenate(batch, axis=0), labels - - def get_test_batch(self): - """Sample a testing batch (data and label).""" - - batch_size = self.batch_size - batch = [self.get_image(self.test_image_files[(self.test_count*batch_size + i) - % len(self.test_image_files)], - is_train=False) for i in range(batch_size)] - labels = [self.test_labels[(self.test_count*batch_size + i) - % len(self.test_image_files)] for i in range(batch_size)] - return nd.concatenate(batch, axis=0), labels - - def reset(self): - """Reset an iterator.""" - self.test_count = 0 - - def next(self): - """Return a batch.""" - if self.is_train: - data, labels = self.sample_train_batch() - else: - if self.test_count * self.batch_size < len(self.test_image_files): - data, labels = self.get_test_batch() - self.test_count += 1 - else: - self.test_count = 0 - raise StopIteration - return mx.io.DataBatch(data=[data], label=[labels]) - -def cub200_iterator(data_path, batch_k, batch_size, data_shape): - """Return training and testing iterator for the CUB200-2011 dataset.""" - return (CUB200Iter(data_path, batch_k, batch_size, data_shape, is_train=True), - CUB200Iter(data_path, batch_k, batch_size, data_shape, is_train=False)) diff --git a/example/gluon/embedding_learning/get_cub200_data.sh b/example/gluon/embedding_learning/get_cub200_data.sh deleted file mode 100755 index 4cf83e757dea..000000000000 --- a/example/gluon/embedding_learning/get_cub200_data.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - - -EMB_DIR=$(cd `dirname $0`; pwd) -DATA_DIR="${EMB_DIR}/data/" - -if [[ ! -d "${DATA_DIR}" ]]; then - echo "${DATA_DIR} doesn't exist, will create one."; - mkdir -p ${DATA_DIR} -fi - -# the dataset is from Caltech-UCSD Birds 200 -# http://www.vision.caltech.edu/visipedia/CUB-200.html -# These datasets are copyright Caltech Computational Vision Group and licensed CC BY 4.0 Attribution. -# See http://www.vision.caltech.edu/archive.html for details -wget -P ${DATA_DIR} http://www.vision.caltech.edu/visipedia-data/CUB-200-2011/CUB_200_2011.tgz -cd ${DATA_DIR}; tar -xf CUB_200_2011.tgz diff --git a/example/gluon/embedding_learning/model.py b/example/gluon/embedding_learning/model.py deleted file mode 100644 index f82240e2cd56..000000000000 --- a/example/gluon/embedding_learning/model.py +++ /dev/null @@ -1,230 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - - -from mxnet import gluon -from mxnet.gluon import nn, Block, HybridBlock -import numpy as np - -class L2Normalization(HybridBlock): - r"""Applies L2 Normalization to input. - - Parameters - ---------- - mode : str - Mode of normalization. - See :func:`~mxnet.ndarray.L2Normalization` for available choices. - - Inputs: - - **data**: input tensor with arbitrary shape. - - Outputs: - - **out**: output tensor with the same shape as `data`. - """ - def __init__(self, mode, **kwargs): - self._mode = mode - super(L2Normalization, self).__init__(**kwargs) - - def hybrid_forward(self, F, x): - return F.L2Normalization(x, mode=self._mode, name='l2_norm') - - def __repr__(self): - s = '{name}({_mode})' - return s.format(name=self.__class__.__name__, - **self.__dict__) - - -def get_distance(F, x): - """Helper function for margin-based loss. Return a distance matrix given a matrix.""" - n = x.shape[0] - - square = F.sum(x ** 2.0, axis=1, keepdims=True) - distance_square = square + square.transpose() - (2.0 * F.dot(x, x.transpose())) - - # Adding identity to make sqrt work. - return F.sqrt(distance_square + F.array(np.identity(n))) - -class DistanceWeightedSampling(HybridBlock): - r"""Distance weighted sampling. See "sampling matters in deep embedding learning" - paper for details. - - Parameters - ---------- - batch_k : int - Number of images per class. - - Inputs: - - **data**: input tensor with shape (batch_size, embed_dim). - Here we assume the consecutive batch_k examples are of the same class. - For example, if batch_k = 5, the first 5 examples belong to the same class, - 6th-10th examples belong to another class, etc. - - Outputs: - - a_indices: indices of anchors. - - x[a_indices]: sampled anchor embeddings. - - x[p_indices]: sampled positive embeddings. - - x[n_indices]: sampled negative embeddings. - - x: embeddings of the input batch. - """ - def __init__(self, batch_k, cutoff=0.5, nonzero_loss_cutoff=1.4, **kwargs): - self.batch_k = batch_k - self.cutoff = cutoff - - # We sample only from negatives that induce a non-zero loss. - # These are negatives with a distance < nonzero_loss_cutoff. - # With a margin-based loss, nonzero_loss_cutoff == margin + beta. - self.nonzero_loss_cutoff = nonzero_loss_cutoff - super(DistanceWeightedSampling, self).__init__(**kwargs) - - def hybrid_forward(self, F, x): - k = self.batch_k - n, d = x.shape - - distance = get_distance(F, x) - # Cut off to avoid high variance. - distance = F.maximum(distance, self.cutoff) - - # Subtract max(log(distance)) for stability. - log_weights = ((2.0 - float(d)) * F.log(distance) - - (float(d - 3) / 2) * F.log(1.0 - 0.25 * (distance ** 2.0))) - weights = F.exp(log_weights - F.max(log_weights)) - - # Sample only negative examples by setting weights of - # the same-class examples to 0. - mask = np.ones(weights.shape) - for i in range(0, n, k): - mask[i:i+k, i:i+k] = 0 - mask_uniform_probs = mask * (1.0/(n-k)) - - weights = weights * F.array(mask) * (distance < self.nonzero_loss_cutoff) - weights_sum = F.sum(weights, axis=1, keepdims=True) - weights = weights / weights_sum - - a_indices = [] - p_indices = [] - n_indices = [] - - np_weights = weights.asnumpy() - for i in range(n): - block_idx = i // k - - if weights_sum[i] != 0: - n_indices += np.random.choice(n, k-1, p=np_weights[i]).tolist() - else: - # all samples are above the cutoff so we sample uniformly - n_indices += np.random.choice(n, k-1, p=mask_uniform_probs[i]).tolist() - for j in range(block_idx * k, (block_idx + 1) * k): - if j != i: - a_indices.append(i) - p_indices.append(j) - - return a_indices, x[a_indices], x[p_indices], x[n_indices], x - - def __repr__(self): - s = '{name}({batch_k})' - return s.format(name=self.__class__.__name__, - **self.__dict__) - - -class MarginNet(Block): - r"""Embedding network with distance weighted sampling. - It takes a base CNN and adds an embedding layer and a - sampling layer at the end. - - Parameters - ---------- - base_net : Block - Base network. - emb_dim : int - Dimensionality of the embedding. - batch_k : int - Number of images per class in a batch. Used in sampling. - - Inputs: - - **data**: input tensor with shape (batch_size, channels, width, height). - Here we assume the consecutive batch_k images are of the same class. - For example, if batch_k = 5, the first 5 images belong to the same class, - 6th-10th images belong to another class, etc. - - Outputs: - - The output of DistanceWeightedSampling. - """ - def __init__(self, base_net, emb_dim, batch_k, **kwargs): - super(MarginNet, self).__init__(**kwargs) - with self.name_scope(): - self.base_net = base_net - self.dense = nn.Dense(emb_dim) - self.normalize = L2Normalization(mode='instance') - self.sampled = DistanceWeightedSampling(batch_k=batch_k) - - def forward(self, x): - z = self.base_net(x) - z = self.dense(z) - z = self.normalize(z) - z = self.sampled(z) - return z - - -class MarginLoss(gluon.loss.Loss): - r"""Margin based loss. - - Parameters - ---------- - margin : float - Margin between positive and negative pairs. - nu : float - Regularization parameter for beta. - - Inputs: - - anchors: sampled anchor embeddings. - - positives: sampled positive embeddings. - - negatives: sampled negative embeddings. - - beta_in: class-specific betas. - - a_indices: indices of anchors. Used to get class-specific beta. - - Outputs: - - Loss. - """ - def __init__(self, margin=0.2, nu=0.0, weight=None, batch_axis=0, **kwargs): - super(MarginLoss, self).__init__(weight, batch_axis, **kwargs) - self._margin = margin - self._nu = nu - - def hybrid_forward(self, F, anchors, positives, negatives, beta_in, a_indices=None): - if a_indices is not None: - # Jointly train class-specific beta. - beta = beta_in.data()[a_indices] - beta_reg_loss = F.sum(beta) * self._nu - else: - # Use a constant beta. - beta = beta_in - beta_reg_loss = 0.0 - - d_ap = F.sqrt(F.sum(F.square(positives - anchors), axis=1) + 1e-8) - d_an = F.sqrt(F.sum(F.square(negatives - anchors), axis=1) + 1e-8) - - pos_loss = F.maximum(d_ap - beta + self._margin, 0.0) - neg_loss = F.maximum(beta - d_an + self._margin, 0.0) - - pair_cnt = F.sum((pos_loss > 0.0) + (neg_loss > 0.0)) - if pair_cnt == 0.0: - # When poss_loss and neg_loss is zero then total loss is zero as well - loss = F.sum(pos_loss + neg_loss) - else: - # Normalize based on the number of pairs. - loss = (F.sum(pos_loss + neg_loss) + beta_reg_loss) / pair_cnt - return gluon.loss._apply_weighting(F, loss, self._weight, None) diff --git a/example/gluon/embedding_learning/train.py b/example/gluon/embedding_learning/train.py deleted file mode 100644 index b8a5bf2716c1..000000000000 --- a/example/gluon/embedding_learning/train.py +++ /dev/null @@ -1,255 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -from __future__ import division - -import argparse -import logging -import time - -import numpy as np -from bottleneck import argpartition - -import mxnet as mx -from data import cub200_iterator -from mxnet import gluon -from mxnet.gluon.model_zoo import vision as models -from mxnet import autograd as ag, nd -from model import MarginNet, MarginLoss - -logging.basicConfig(level=logging.INFO) - -# CLI -parser = argparse.ArgumentParser(description='train a model for image classification.') -parser.add_argument('--data-path', type=str, default='data/CUB_200_2011', - help='path of data.') -parser.add_argument('--embed-dim', type=int, default=128, - help='dimensionality of image embedding. default is 128.') -parser.add_argument('--batch-size', type=int, default=70, - help='training batch size per device (CPU/GPU). default is 70.') -parser.add_argument('--batch-k', type=int, default=5, - help='number of images per class in a batch. default is 5.') -parser.add_argument('--gpus', type=str, default='', - help='list of gpus to use, e.g. 0 or 0,2,5. empty means using cpu.') -parser.add_argument('--epochs', type=int, default=20, - help='number of training epochs. default is 20.') -parser.add_argument('--optimizer', type=str, default='adam', - help='optimizer. default is adam.') -parser.add_argument('--lr', type=float, default=0.0001, - help='learning rate. default is 0.0001.') -parser.add_argument('--lr-beta', type=float, default=0.1, - help='learning rate for the beta in margin based loss. default is 0.1.') -parser.add_argument('--margin', type=float, default=0.2, - help='margin for the margin based loss. default is 0.2.') -parser.add_argument('--beta', type=float, default=1.2, - help='initial value for beta. default is 1.2.') -parser.add_argument('--nu', type=float, default=0.0, - help='regularization parameter for beta. default is 0.0.') -parser.add_argument('--factor', type=float, default=0.5, - help='learning rate schedule factor. default is 0.5.') -parser.add_argument('--steps', type=str, default='12,14,16,18', - help='epochs to update learning rate. default is 12,14,16,18.') -parser.add_argument('--wd', type=float, default=0.0001, - help='weight decay rate. default is 0.0001.') -parser.add_argument('--seed', type=int, default=123, - help='random seed to use. default=123.') -parser.add_argument('--model', type=str, default='resnet50_v2', - help='type of model to use. see vision_model for options.') -parser.add_argument('--save-model-prefix', type=str, default='margin_loss_model', - help='prefix of models to be saved.') -parser.add_argument('--use-pretrained', action='store_true', - help='enable using pretrained model from gluon.') -parser.add_argument('--kvstore', type=str, default='device', - help='kvstore to use for trainer.') -parser.add_argument('--log-interval', type=int, default=20, - help='number of batches to wait before logging.') -opt = parser.parse_args() - -logging.info(opt) - -# Settings. -mx.random.seed(opt.seed) -np.random.seed(opt.seed) - -batch_size = opt.batch_size - -gpus = [] if opt.gpus is None or opt.gpus is '' else [ - int(gpu) for gpu in opt.gpus.split(',')] -num_gpus = len(gpus) - -batch_size *= max(1, num_gpus) -context = [mx.gpu(i) for i in gpus] if num_gpus > 0 else [mx.cpu()] -steps = [int(step) for step in opt.steps.split(',')] - -# Construct model. -kwargs = {'ctx': context, 'pretrained': opt.use_pretrained} -net = models.get_model(opt.model, **kwargs) - -if opt.use_pretrained: - # Use a smaller learning rate for pre-trained convolutional layers. - for v in net.collect_params().values(): - if 'conv' in v.name: - setattr(v, 'lr_mult', 0.01) - -net.hybridize() -net = MarginNet(net.features, opt.embed_dim, opt.batch_k) -beta = mx.gluon.Parameter('beta', shape=(100,)) - -# Get iterators. -train_data, val_data = cub200_iterator(opt.data_path, opt.batch_k, batch_size, (3, 224, 224)) - - -def get_distance_matrix(x): - """Get distance matrix given a matrix. Used in testing.""" - square = nd.sum(x ** 2.0, axis=1, keepdims=True) - distance_square = square + square.transpose() - (2.0 * nd.dot(x, x.transpose())) - return nd.sqrt(distance_square) - - -def evaluate_emb(emb, labels): - """Evaluate embeddings based on Recall@k.""" - d_mat = get_distance_matrix(emb) - d_mat = d_mat.asnumpy() - labels = labels.asnumpy() - - names = [] - accs = [] - for k in [1, 2, 4, 8, 16]: - names.append('Recall@%d' % k) - correct, cnt = 0.0, 0.0 - for i in range(emb.shape[0]): - d_mat[i, i] = 1e10 - nns = argpartition(d_mat[i], k)[:k] - if any(labels[i] == labels[nn] for nn in nns): - correct += 1 - cnt += 1 - accs.append(correct/cnt) - return names, accs - - -def test(ctx): - """Test a model.""" - val_data.reset() - outputs = [] - labels = [] - for batch in val_data: - data = gluon.utils.split_and_load(batch.data[0], ctx_list=ctx, batch_axis=0) - label = gluon.utils.split_and_load(batch.label[0], ctx_list=ctx, batch_axis=0) - for x in data: - outputs.append(net(x)[-1]) - labels += label - - outputs = nd.concatenate(outputs, axis=0)[:val_data.n_test] - labels = nd.concatenate(labels, axis=0)[:val_data.n_test] - return evaluate_emb(outputs, labels) - - -def get_lr(lr, epoch, steps, factor): - """Get learning rate based on schedule.""" - for s in steps: - if epoch >= s: - lr *= factor - return lr - - -def train(epochs, ctx): - """Training function.""" - if isinstance(ctx, mx.Context): - ctx = [ctx] - net.initialize(mx.init.Xavier(magnitude=2), ctx=ctx) - - opt_options = {'learning_rate': opt.lr, 'wd': opt.wd} - if opt.optimizer == 'sgd': - opt_options['momentum'] = 0.9 - if opt.optimizer == 'adam': - opt_options['epsilon'] = 1e-7 - trainer = gluon.Trainer(net.collect_params(), opt.optimizer, - opt_options, - kvstore=opt.kvstore) - if opt.lr_beta > 0.0: - # Jointly train class-specific beta. - # See "sampling matters in deep embedding learning" paper for details. - beta.initialize(mx.init.Constant(opt.beta), ctx=ctx) - trainer_beta = gluon.Trainer([beta], 'sgd', - {'learning_rate': opt.lr_beta, 'momentum': 0.9}, - kvstore=opt.kvstore) - - loss = MarginLoss(margin=opt.margin, nu=opt.nu) - - best_val = 0.0 - for epoch in range(epochs): - tic = time.time() - prev_loss, cumulative_loss = 0.0, 0.0 - - # Learning rate schedule. - trainer.set_learning_rate(get_lr(opt.lr, epoch, steps, opt.factor)) - logging.info('Epoch %d learning rate=%f', epoch, trainer.learning_rate) - if opt.lr_beta > 0.0: - trainer_beta.set_learning_rate(get_lr(opt.lr_beta, epoch, steps, opt.factor)) - logging.info('Epoch %d beta learning rate=%f', epoch, trainer_beta.learning_rate) - - # Inner training loop. - for i in range(200): - batch = train_data.next() - data = gluon.utils.split_and_load(batch.data[0], ctx_list=ctx, batch_axis=0) - label = gluon.utils.split_and_load(batch.label[0], ctx_list=ctx, batch_axis=0) - - Ls = [] - with ag.record(): - for x, y in zip(data, label): - a_indices, anchors, positives, negatives, _ = net(x) - - if opt.lr_beta > 0.0: - L = loss(anchors, positives, negatives, beta, y[a_indices]) - else: - L = loss(anchors, positives, negatives, opt.beta, None) - - # Store the loss and do backward after we have done forward - # on all GPUs for better speed on multiple GPUs. - Ls.append(L) - cumulative_loss += nd.mean(L).asscalar() - - for L in Ls: - L.backward() - - # Update. - trainer.step(batch.data[0].shape[0]) - if opt.lr_beta > 0.0: - trainer_beta.step(batch.data[0].shape[0]) - - if (i+1) % opt.log_interval == 0: - logging.info('[Epoch %d, Iter %d] training loss=%f' % ( - epoch, i+1, cumulative_loss - prev_loss)) - prev_loss = cumulative_loss - - logging.info('[Epoch %d] training loss=%f'%(epoch, cumulative_loss)) - logging.info('[Epoch %d] time cost: %f'%(epoch, time.time()-tic)) - - names, val_accs = test(ctx) - for name, val_acc in zip(names, val_accs): - logging.info('[Epoch %d] validation: %s=%f'%(epoch, name, val_acc)) - - if val_accs[0] > best_val: - best_val = val_accs[0] - logging.info('Saving %s.' % opt.save_model_prefix) - net.save_parameters('%s.params' % opt.save_model_prefix) - return best_val - - -if __name__ == '__main__': - best_val_recall = train(opt.epochs, context) - print('Best validation Recall@1: %.2f.' % best_val_recall) diff --git a/example/gluon/house_prices/kaggle_k_fold_cross_validation.py b/example/gluon/house_prices/kaggle_k_fold_cross_validation.py index 420e6fc53c8a..52ddf0e28048 100644 --- a/example/gluon/house_prices/kaggle_k_fold_cross_validation.py +++ b/example/gluon/house_prices/kaggle_k_fold_cross_validation.py @@ -26,11 +26,11 @@ # The link to the problem on Kaggle: # https://www.kaggle.com/c/house-prices-advanced-regression-techniques -import numpy as np +import numpy as onp import pandas as pd from mxnet import autograd from mxnet import gluon -from mxnet import ndarray as nd +from mxnet import np # After logging in www.kaggle.com, the training and testing data sets can be downloaded at: # https://www.kaggle.com/c/house-prices-advanced-regression-techniques/download/train.csv @@ -56,26 +56,25 @@ X_test = all_X[num_train:].as_matrix() y_train = train.SalePrice.as_matrix() -X_train = nd.array(X_train) -y_train = nd.array(y_train) +X_train = np.array(X_train) +y_train = np.array(y_train) y_train.reshape((num_train, 1)) -X_test = nd.array(X_test) +X_test = np.array(X_test) square_loss = gluon.loss.L2Loss() def get_rmse_log(net, X_train, y_train): """Gets root mse between the logarithms of the prediction and the truth.""" num_train = X_train.shape[0] - clipped_preds = nd.clip(net(X_train), 1, float('inf')) - return np.sqrt(2 * nd.sum(square_loss( - nd.log(clipped_preds), nd.log(y_train))).asscalar() / num_train) + clipped_preds = np.clip(net(X_train), 1, float('inf')) + return np.sqrt(2 * np.sum(square_loss( + np.log(clipped_preds), np.log(y_train))).item() / num_train) def get_net(): """Gets a neural network. Better results are obtained with modifications.""" net = gluon.nn.Sequential() - with net.name_scope(): - net.add(gluon.nn.Dense(50, activation="relu")) - net.add(gluon.nn.Dense(1)) + net.add(gluon.nn.Dense(50, activation="relu")) + net.add(gluon.nn.Dense(1)) net.initialize() return net @@ -123,8 +122,8 @@ def k_fold_cross_valid(k, epochs, verbose_epoch, X_train, y_train, y_val_train = y_cur_fold val_train_defined = True else: - X_val_train = nd.concat(X_val_train, X_cur_fold, dim=0) - y_val_train = nd.concat(y_val_train, y_cur_fold, dim=0) + X_val_train = np.concatenate([X_val_train, X_cur_fold], axis=0) + y_val_train = np.concatenate([y_val_train, y_cur_fold], axis=0) net = get_net() train_loss = train(net, X_val_train, y_val_train, epochs, verbose_epoch, learning_rate, weight_decay, batch_size) diff --git a/example/gluon/lipnet/.gitignore b/example/gluon/lipnet/.gitignore deleted file mode 100644 index 9a6ee993b157..000000000000 --- a/example/gluon/lipnet/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -__pycache__/ -utils/*.dat - diff --git a/example/gluon/lipnet/BeamSearch.py b/example/gluon/lipnet/BeamSearch.py deleted file mode 100644 index 1b41bc0020d1..000000000000 --- a/example/gluon/lipnet/BeamSearch.py +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env python3 - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" -Module : this module to decode using beam search -https://github.com/ThomasDelteil/HandwrittenTextRecognition_MXNet/blob/master/utils/CTCDecoder/BeamSearch.py -""" - -from __future__ import division -from __future__ import print_function -import numpy as np - -class BeamEntry: - """ - information about one single beam at specific time-step - """ - def __init__(self): - self.prTotal = 0 # blank and non-blank - self.prNonBlank = 0 # non-blank - self.prBlank = 0 # blank - self.prText = 1 # LM score - self.lmApplied = False # flag if LM was already applied to this beam - self.labeling = () # beam-labeling - -class BeamState: - """ - information about the beams at specific time-step - """ - def __init__(self): - self.entries = {} - - def norm(self): - """ - length-normalise LM score - """ - for (k, _) in self.entries.items(): - labelingLen = len(self.entries[k].labeling) - self.entries[k].prText = self.entries[k].prText ** (1.0 / (labelingLen if labelingLen else 1.0)) - - def sort(self): - """ - return beam-labelings, sorted by probability - """ - beams = [v for (_, v) in self.entries.items()] - sortedBeams = sorted(beams, reverse=True, key=lambda x: x.prTotal*x.prText) - return [x.labeling for x in sortedBeams] - -def applyLM(parentBeam, childBeam, classes, lm): - """ - calculate LM score of child beam by taking score from parent beam and bigram probability of last two chars - """ - if lm and not childBeam.lmApplied: - c1 = classes[parentBeam.labeling[-1] if parentBeam.labeling else classes.index(' ')] # first char - c2 = classes[childBeam.labeling[-1]] # second char - lmFactor = 0.01 # influence of language model - bigramProb = lm.getCharBigram(c1, c2) ** lmFactor # probability of seeing first and second char next to each other - childBeam.prText = parentBeam.prText * bigramProb # probability of char sequence - childBeam.lmApplied = True # only apply LM once per beam entry - -def addBeam(beamState, labeling): - """ - add beam if it does not yet exist - """ - if labeling not in beamState.entries: - beamState.entries[labeling] = BeamEntry() - -def ctcBeamSearch(mat, classes, lm, k, beamWidth): - """ - beam search as described by the paper of Hwang et al. and the paper of Graves et al. - """ - - blankIdx = len(classes) - maxT, maxC = mat.shape - - # initialise beam state - last = BeamState() - labeling = () - last.entries[labeling] = BeamEntry() - last.entries[labeling].prBlank = 1 - last.entries[labeling].prTotal = 1 - - # go over all time-steps - for t in range(maxT): - curr = BeamState() - - # get beam-labelings of best beams - bestLabelings = last.sort()[0:beamWidth] - - # go over best beams - for labeling in bestLabelings: - - # probability of paths ending with a non-blank - prNonBlank = 0 - # in case of non-empty beam - if labeling: - # probability of paths with repeated last char at the end - try: - prNonBlank = last.entries[labeling].prNonBlank * mat[t, labeling[-1]] - except FloatingPointError: - prNonBlank = 0 - - # probability of paths ending with a blank - prBlank = (last.entries[labeling].prTotal) * mat[t, blankIdx] - - # add beam at current time-step if needed - addBeam(curr, labeling) - - # fill in data - curr.entries[labeling].labeling = labeling - curr.entries[labeling].prNonBlank += prNonBlank - curr.entries[labeling].prBlank += prBlank - curr.entries[labeling].prTotal += prBlank + prNonBlank - curr.entries[labeling].prText = last.entries[labeling].prText # beam-labeling not changed, therefore also LM score unchanged from - curr.entries[labeling].lmApplied = True # LM already applied at previous time-step for this beam-labeling - - # extend current beam-labeling - for c in range(maxC - 1): - # add new char to current beam-labeling - newLabeling = labeling + (c,) - - # if new labeling contains duplicate char at the end, only consider paths ending with a blank - if labeling and labeling[-1] == c: - prNonBlank = mat[t, c] * last.entries[labeling].prBlank - else: - prNonBlank = mat[t, c] * last.entries[labeling].prTotal - - # add beam at current time-step if needed - addBeam(curr, newLabeling) - - # fill in data - curr.entries[newLabeling].labeling = newLabeling - curr.entries[newLabeling].prNonBlank += prNonBlank - curr.entries[newLabeling].prTotal += prNonBlank - - # apply LM - applyLM(curr.entries[labeling], curr.entries[newLabeling], classes, lm) - - # set new beam state - last = curr - - # normalise LM scores according to beam-labeling-length - last.norm() - - # sort by probability - bestLabelings = last.sort()[:k] # get most probable labeling - - output = [] - for bestLabeling in bestLabelings: - # map labels to chars - res = '' - for l in bestLabeling: - res += classes[l] - output.append(res) - return output \ No newline at end of file diff --git a/example/gluon/lipnet/README.md b/example/gluon/lipnet/README.md deleted file mode 100644 index 89c27a11330f..000000000000 --- a/example/gluon/lipnet/README.md +++ /dev/null @@ -1,254 +0,0 @@ - - -# LipNet: End-to-End Sentence-level Lipreading - ---- - -This is a Gluon implementation of [LipNet: End-to-End Sentence-level Lipreading](https://arxiv.org/abs/1611.01599) - -![net_structure](asset/network_structure.png) - -![sample output](https://user-images.githubusercontent.com/11376047/52533982-d7227680-2d7e-11e9-9f18-c15b952faf0e.png) - -## Requirements -- Python 3.6.4 -- MXNet 1.3.0 -- Required disk space: 35 GB -``` -pip install -r requirements.txt -``` - ---- - -## The Data -- The GRID audiovisual sentence corpus (http://spandh.dcs.shef.ac.uk/gridcorpus/) - - GRID is a large multi-talker audiovisual sentence corpus to support joint computational-behavioral studies in speech perception. In brief, the corpus consists of high-quality audio and video (facial) recordings of 1000 sentences spoken by each of 34 talkers (18 male, 16 female). Sentences are of the form "put red at G9 now". The corpus, together with transcriptions, is freely available for research use. -- Video: (normal)(480 M each) - - Each movie has one sentence consist of 6 words. -- Align: word alignments (190 K each) - - One align has 6 words. Each word has start time and end time. But this tutorial needs just sentence because of using ctc-loss. - ---- - -## Pretrained model -You can train the model yourself in the following sections, you can test a pretrained model's inference, or resume training from the model checkpoint. To work with the provided pretrained model, first download it, then run one of the provided Python scripts for inference (infer.py) or training (main.py). - -* Download the [pretrained model](https://github.com/soeque1/temp_files/files/2848870/epoches_81_loss_15.7157.zip) -* Try inference with the following: - -``` -python infer.py model_path='checkpoint/epoches_81_loss_15.7157' -``` - -* Resume training with the following: - -``` -python main.py model_path='checkpoint/epoches_81_loss_15.7157' -``` - -## Prepare the Data - -You can prepare the data yourself, or you can download preprocessed data. - -### Option 1 - Download the preprocessed data - -There are two download routes provided for the preprocessed data. - -#### Download and untar the data -To download tar zipped files by link, download the following files and extract in a folder called `data` in the root of this example folder. You should have the following structure: -``` -/lipnet/data/align -/lipnet/data/datasets -``` - -* [align files](https://mxnet-public.s3.amazonaws.com/lipnet/data-archives/align.tgz) -* [datasets files](https://mxnet-public.s3.amazonaws.com/lipnet/data-archives/datasets.tgz) - -#### Use AWS CLI to sync the data -To get the folders and files all unzipped with AWS CLI, can use the following command. This will provide the folder structure for you. Run this command from `/lipnet/`: - -``` - aws s3 sync s3://mxnet-public/lipnet/data . -``` - -### Option 2 (part 1)- Download the raw dataset -- Outputs - - The Total Movies(mp4): 16GB - - The Total Aligns(text): 134MB -- Arguments - - src_path : Path for videos (default='./data/mp4s/') - - align_path : Path for aligns (default='./data/') - - n_process : num of process (default=1) - -``` -cd ./utils && python download_data.py --n_process=$(nproc) -``` - -### Option 2 (part 2) Preprocess the raw dataset: Extracting the mouth images from a video and save it - -* Using Face Landmark Detection(http://dlib.net/) - -#### Preprocess (preprocess_data.py) -* If there is no landmark, it download automatically. -* Using Face Landmark Detection, It extract the mouth from a video. - -- example: - - video: ./data/mp4s/s2/bbbf7p.mpg - - align(target): ./data/align/s2/bbbf7p.align - : 'sil bin blue by f seven please sil' - - -- Video to the images (75 Frames) - -Frame 0 | Frame 1 | ... | Frame 74 | -:-------------------------:|:-------------------------:|:-------------------------:|:-------------------------: -![](asset/s2_bbbf7p_000.png) | ![](asset/s2_bbbf7p_001.png) | ... | ![](asset/s2_bbbf7p_074.png) - - - Extract the mouth from images - -Frame 0 | Frame 1 | ... | Frame 74 | -:-------------------------:|:-------------------------:|:-------------------------:|:-------------------------: -![](asset/mouth_000.png) | ![](asset/mouth_001.png) | ... | ![](asset/mouth_074.png) - -* Save the result images into tgt_path. - ----- - -#### How to run the preprocess script - -- Arguments - - src_path : Path for videos (default='./data/mp4s/') - - tgt_path : Path for preprocessed images (default='./data/datasets/') - - n_process : num of process (default=1) - -- Outputs - - The Total Images(png): 19GB -- Elapsed time - - About 54 Hours using 1 process - - If you use the multi-processes, you can finish the number of processes faster. - - e.g) 9 hours using 6 processes - -You can run the preprocessing with just one processor, but this will take a long time (>48 hours). To use all of the available processors, use the following command: - -``` -cd ./utils && python preprocess_data.py --n_process=$(nproc) -``` - -#### Output: Data structure of the preprocessed data - -``` -The training data folder should look like : - - |--datasets - |--s1 - |--bbir7s - |--mouth_000.png - |--mouth_001.png - ... - |--bgaa8p - |--mouth_000.png - |--mouth_001.png - ... - |--s2 - ... - |--align - |--bw1d8a.align - |--bggzzs.align - ... - -``` - ---- - -## Training -After you have acquired the preprocessed data you are ready to train the lipnet model. - -- According to [LipNet: End-to-End Sentence-level Lipreading](https://arxiv.org/abs/1611.01599), four (S1, S2, S20, S22) of the 34 subjects are used for evaluation. - The other subjects are used for training. - -- To use the multi-gpu, it is recommended to make the batch size $(num_gpus) times larger. - - - e.g) 1-gpu and 128 batch_size > 2-gpus 256 batch_size - - -- arguments - - batch_size : Define batch size (default=64) - - epochs : Define total epochs (default=100) - - image_path : Path for lip image files (default='./data/datasets/') - - align_path : Path for align files (default='./data/align/') - - dr_rate : Dropout rate(default=0.5) - - num_gpus : Num of gpus (if num_gpus is 0, then use cpu) (default=1) - - num_workers : Num of workers when generating data (default=0) - - model_path : Path of pretrained model (default=None) - -``` -python main.py -``` - ---- - -## Test Environment -- 72 CPU cores -- 1 GPU (NVIDIA Tesla V100 SXM2 32 GB) -- 128 Batch Size - - - It takes over 24 hours (60 epochs) to get some good results. - ---- - -## Inference - -- arguments - - batch_size : Define batch size (default=64) - - image_path : Path for lip image files (default='./data/datasets/') - - align_path : Path for align files (default='./data/align/') - - num_gpus : Num of gpus (if num_gpus is 0, then use cpu) (default=1) - - num_workers : Num of workers when generating data (default=0) - - data_type : 'train' or 'valid' (defalut='valid') - - model_path : Path of pretrained model (default=None) - -``` -python infer.py --model_path=$(model_path) -``` - - -``` -[Target] -['lay green with a zero again', - 'bin blue with r nine please', - 'set blue with e five again', - 'bin green by t seven soon', - 'lay red at d five now', - 'bin green in x eight now', - 'bin blue with e one now', - 'lay red at j nine now'] - ``` - - ``` -[Pred] -['lay green with s zero again', - 'bin blue with r nine please', - 'set blue with e five again', - 'bin green by t seven soon', - 'lay red at c five now', - 'bin green in x eight now', - 'bin blue with m one now', - 'lay red at j nine now'] - ``` diff --git a/example/gluon/lipnet/asset/mouth_000.png b/example/gluon/lipnet/asset/mouth_000.png deleted file mode 100644 index b318e56dfd2188f1fff9d1594e39f4e530ce00bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6372 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 diff --git a/example/gluon/lipnet/asset/s2_bbbf7p_000.png b/example/gluon/lipnet/asset/s2_bbbf7p_000.png deleted file mode 100644 index 6495d2fa5b838b46bb4748e391453bbc34e21e04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35141 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≥KPY?Ri-~N+(~C{zy|MS zJKD3R2*tv}{DUX*QSGZME`NT8PZ_q08^Kgu0v}>o(|zZ^BO5z-LDd&XYW2J`^I*ff00s0C%1zJ!fuk>;EBq}K~$jnAK? z6t?zldKxX{q=Nm_6mv032?f5vs9D|Q*Kr^Ry7%@F=ITN*#3 z1?><-J)5iQlq<9W?%uR8C-afU=``}(<7EXDA3+w+{tC^>LoMo+IKY_3+eP+#qX0nk z*-AvYR@VGd76FJ^H@;_<6Jzt+GdeK%7&`>fW_!X=DDHS@t*K)FIj;Eu275T z*o4*=i5G2{M7%ek^r0O$7^pX2yCIrz$cRUdXSLT$v#9MSvi3w3Fwc#%3OLwqb80@S z`xDRU?NW|{6h|(Eqf{vyLPdgtXob}$zP0ZHooDhh4-+M2yZg<&l26hILlNJyYs7@+ zI@6z0G6bzkr<9!Ru;`~lb35d>a(lPMk`0WQxx?W&*~CbSa!J%4mXz6G%rk^-7$vTf z7CSL%WkyeLcukmE@Q(BIuIUiXm(OTK%FsuoxuAL`Z*!DbqGtupaBI-z8}I3Hr&LV< zDm@ATR=+fZ1xUedMf8W<#3TYyI7ozqgr}+?T}H|;^&72h8uCOSHBHK8grGC4eFxw7 zYF=DKQx5-`vV+->COiEE!_61DR!OM+UiX~Gb`EqMXt-M0>_wIK5*Z3-g2CqM_ijp0 z>4=BEdbA3Wy0$cdwKV=Jjcc?>#(jajw@<8vHf3=g$Pf@wi)Mcp=ujF;; zY^$fw(WW{*a}|if7?_0{xhRRW$t?94LRl0BCgi{sGwV)^%Wg{NV^7abf;z8H3D=#F z<`IAt%6Q-#LV;U`$!uS^Bu*UB0YJl=a`~z@(gF%X6*d0_@Q2ISq~#8U`g~ufdySmW z5|YT=sbpysAv!P}`_zaSLJZ(T0;J7|YUtDMC5{=QBDs$W11=mPtVw z;NNfep@5_|2Tp0K&|(8|m$tdU*C*}g4f|hT&o6HS7}-FAra5YLf^qtDD$l;2ICWwFh|fTx%g3L z%Jr+~G2<*pcJ`hh$W*!~*6WPe;X;9&B9K}3dSs?J+wuvFos|CpAz_T1j~IQ;00000 LNkvXXu0mjfgWQ@b diff --git a/example/gluon/lipnet/asset/s2_bbbf7p_001.png b/example/gluon/lipnet/asset/s2_bbbf7p_001.png deleted file mode 100644 index 2a7e269f14ded255242233e9fd9153220a8be2c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36768 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 0: - ctx = [mx.gpu(i) for i in range(num_gpus)] - else: - ctx = [mx.cpu()] - return ctx - - -ALPHABET = '' -for i in range(27): - ALPHABET += int2char(i) - -def char_beam_search(out): - """ - Description : apply beam search for prediction result - """ - out_conv = list() - for idx in range(out.shape[0]): - probs = out[idx] - prob = probs.softmax().asnumpy() - line_string_proposals = ctcBeamSearch(prob, ALPHABET, None, k=4, beamWidth=25) - out_conv.append(line_string_proposals[0]) - return out_conv - -# pylint: disable=too-many-instance-attributes, too-many-locals -class Train: - """ - Description : Train class for training network - """ - def __init__(self, config): - ##setting hyper-parameters - self.batch_size = config.batch_size - self.image_path = config.image_path - self.align_path = config.align_path - self.num_gpus = config.num_gpus - self.ctx = setting_ctx(self.num_gpus) - self.num_workers = config.num_workers - self.seq_len = 75 - - def build_model(self, dr_rate=0, path=None): - """ - Description : build network - """ - #set network - self.net = LipNet(dr_rate) - self.net.hybridize() - self.net.initialize(ctx=self.ctx) - - if path is not None: - self.load_model(path) - - #set optimizer - self.loss_fn = gluon.loss.CTCLoss() - self.trainer = gluon.Trainer(self.net.collect_params(), \ - optimizer='SGD') - - def save_model(self, epoch, loss): - """ - Description : save parameter of network weight - """ - prefix = 'checkpoint/epoches' - file_name = "{prefix}_{epoch}_loss_{l:.4f}".format(prefix=prefix, - epoch=str(epoch), - l=loss) - self.net.save_parameters(file_name) - - def load_model(self, path=''): - """ - Description : load parameter of network weight - """ - self.net.load_parameters(path) - - def load_dataloader(self): - """ - Description : Setup the dataloader - """ - - input_transform = transforms.Compose([transforms.ToTensor(), \ - transforms.Normalize((0.7136, 0.4906, 0.3283), \ - (0.1138, 0.1078, 0.0917))]) - training_dataset = LipsDataset(self.image_path, - self.align_path, - mode='train', - transform=input_transform, - seq_len=self.seq_len) - - self.train_dataloader = mx.gluon.data.DataLoader(training_dataset, - batch_size=self.batch_size, - shuffle=True, - num_workers=self.num_workers) - - valid_dataset = LipsDataset(self.image_path, - self.align_path, - mode='valid', - transform=input_transform, - seq_len=self.seq_len) - - self.valid_dataloader = mx.gluon.data.DataLoader(valid_dataset, - batch_size=self.batch_size, - shuffle=True, - num_workers=self.num_workers) - - def train(self, data, label, batch_size): - """ - Description : training for LipNet - """ - # pylint: disable=no-member - sum_losses = 0 - len_losses = 0 - with autograd.record(): - losses = [self.loss_fn(self.net(X), Y) for X, Y in zip(data, label)] - for loss in losses: - sum_losses += mx.nd.array(loss).sum().asscalar() - len_losses += len(loss) - loss.backward() - self.trainer.step(batch_size) - return sum_losses, len_losses - - def infer(self, input_data, input_label): - """ - Description : Print sentence for prediction result - """ - sum_losses = 0 - len_losses = 0 - for data, label in zip(input_data, input_label): - pred = self.net(data) - sum_losses += mx.nd.array(self.loss_fn(pred, label)).sum().asscalar() - len_losses += len(data) - pred_convert = char_beam_search(pred) - label_convert = char_conv(label.asnumpy()) - for target, pred in zip(label_convert, pred_convert): - print("target:{t} pred:{p}".format(t=target, p=pred)) - return sum_losses, len_losses - - def train_batch(self, dataloader): - """ - Description : training for LipNet - """ - sum_losses = 0 - len_losses = 0 - for input_data, input_label in tqdm(dataloader): - data = gluon.utils.split_and_load(input_data, self.ctx, even_split=False) - label = gluon.utils.split_and_load(input_label, self.ctx, even_split=False) - batch_size = input_data.shape[0] - sum_losses, len_losses = self.train(data, label, batch_size) - sum_losses += sum_losses - len_losses += len_losses - - return sum_losses, len_losses - - def infer_batch(self, dataloader): - """ - Description : inference for LipNet - """ - sum_losses = 0 - len_losses = 0 - for input_data, input_label in dataloader: - data = gluon.utils.split_and_load(input_data, self.ctx, even_split=False) - label = gluon.utils.split_and_load(input_label, self.ctx, even_split=False) - sum_losses, len_losses = self.infer(data, label) - sum_losses += sum_losses - len_losses += len_losses - - return sum_losses, len_losses - - def run(self, epochs): - """ - Description : Run training for LipNet - """ - best_loss = sys.maxsize - for epoch in trange(epochs): - iter_no = 0 - - ## train - sum_losses, len_losses = self.train_batch(self.train_dataloader) - - if iter_no % 20 == 0: - current_loss = sum_losses / len_losses - print("[Train] epoch:{e} iter:{i} loss:{l:.4f}".format(e=epoch, - i=iter_no, - l=current_loss)) - - ## validating - sum_val_losses, len_val_losses = self.infer_batch(self.valid_dataloader) - - current_val_loss = sum_val_losses / len_val_losses - print("[Vaild] epoch:{e} iter:{i} loss:{l:.4f}".format(e=epoch, - i=iter_no, - l=current_val_loss)) - - if best_loss > current_val_loss: - self.save_model(epoch, current_val_loss) - best_loss = current_val_loss - - iter_no += 1 diff --git a/example/gluon/lipnet/utils/__init__.py b/example/gluon/lipnet/utils/__init__.py deleted file mode 100644 index 13a83393a912..000000000000 --- a/example/gluon/lipnet/utils/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. diff --git a/example/gluon/lipnet/utils/align.py b/example/gluon/lipnet/utils/align.py deleted file mode 100644 index 48d0716aaedd..000000000000 --- a/example/gluon/lipnet/utils/align.py +++ /dev/null @@ -1,83 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" -Module: align -This is used when the data is genrated by LipsDataset -""" - -import numpy as np -from .common import word_to_vector - - -class Align(object): - """ - Preprocess for Align - """ - skip_list = ['sil', 'sp'] - - def __init__(self, align_path): - self.build(align_path) - - def build(self, align_path): - """ - Build the align array - """ - file = open(align_path, 'r') - lines = file.readlines() - file.close() - # words: list([op, ed, word]) - words = [] - for line in lines: - _op, _ed, word = line.strip().split(' ') - if word not in Align.skip_list: - words.append((int(_op), int(_ed), word)) - self.words = words - self.n_words = len(words) - self.sentence_str = " ".join([w[2] for w in self.words]) - self.sentence_length = len(self.sentence_str) - - def sentence(self, padding=75): - """ - Get sentence - """ - vec = word_to_vector(self.sentence_str) - vec += [-1] * (padding - self.sentence_length) - return np.array(vec, dtype=np.int32) - - def word(self, _id, padding=75): - """ - Get words - """ - word = self.words[_id][2] - vec = word_to_vector(word) - vec += [-1] * (padding - len(vec)) - return np.array(vec, dtype=np.int32) - - def word_length(self, _id): - """ - Get the length of words - """ - return len(self.words[_id][2]) - - def word_frame_pos(self, _id): - """ - Get the position of words - """ - left = int(self.words[_id][0]/1000) - right = max(left+1, int(self.words[_id][1]/1000)) - return (left, right) diff --git a/example/gluon/lipnet/utils/common.py b/example/gluon/lipnet/utils/common.py deleted file mode 100644 index ec96b6879653..000000000000 --- a/example/gluon/lipnet/utils/common.py +++ /dev/null @@ -1,80 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" -Module: This module contains common conversion functions - -""" - - -def char2int(char): - """ - Convert character to integer. - """ - if char >= 'a' and char <= 'z': - return ord(char) - ord('a') - elif char == ' ': - return 26 - return None - - -def int2char(num): - """ - Convert integer to character. - """ - if num >= 0 and num < 26: - return chr(num + ord('a')) - elif num == 26: - return ' ' - return None - - -def word_to_vector(word): - """ - Convert character vectors to integer vectors. - """ - vector = [] - for char in list(word): - vector.append(char2int(char)) - return vector - - -def vector_to_word(vector): - """ - Convert integer vectors to character vectors. - """ - word = "" - for vec in vector: - word = word + int2char(vec) - return word - - -def char_conv(out): - """ - Convert integer vectors to character vectors for batch. - """ - out_conv = list() - for i in range(out.shape[0]): - tmp_str = '' - for j in range(out.shape[1]): - if int(out[i][j]) >= 0: - tmp_char = int2char(int(out[i][j])) - if int(out[i][j]) == 27: - tmp_char = '' - tmp_str = tmp_str + tmp_char - out_conv.append(tmp_str) - return out_conv diff --git a/example/gluon/lipnet/utils/download_data.py b/example/gluon/lipnet/utils/download_data.py deleted file mode 100644 index 3051eb2a9e27..000000000000 --- a/example/gluon/lipnet/utils/download_data.py +++ /dev/null @@ -1,112 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" -Module: download_data -This module provides utilities for downloading the datasets for training LipNet -""" - -import os -from os.path import exists -from multi import multi_p_run, put_worker - - -def download_mp4(from_idx, to_idx, _params): - """ - download mp4s - """ - succ = set() - fail = set() - for idx in range(from_idx, to_idx): - name = 's' + str(idx) - save_folder = '{src_path}/{nm}'.format(src_path=_params['src_path'], nm=name) - if idx == 0 or os.path.isdir(save_folder): - continue - script = "http://spandh.dcs.shef.ac.uk/gridcorpus/{nm}/video/{nm}.mpg_vcd.zip".format( \ - nm=name) - down_sc = 'cd {src_path} && curl {script} --output {nm}.mpg_vcd.zip && \ - unzip {nm}.mpg_vcd.zip'.format(script=script, - nm=name, - src_path=_params['src_path']) - try: - print(down_sc) - os.system(down_sc) - succ.add(idx) - except OSError as error: - print(error) - fail.add(idx) - return (succ, fail) - - -def download_align(from_idx, to_idx, _params): - """ - download aligns - """ - succ = set() - fail = set() - for idx in range(from_idx, to_idx): - name = 's' + str(idx) - if idx == 0: - continue - script = "http://spandh.dcs.shef.ac.uk/gridcorpus/{nm}/align/{nm}.tar".format(nm=name) - down_sc = 'cd {align_path} && wget {script} && \ - tar -xvf {nm}.tar'.format(script=script, - nm=name, - align_path=_params['align_path']) - try: - print(down_sc) - os.system(down_sc) - succ.add(idx) - except OSError as error: - print(error) - fail.add(idx) - return (succ, fail) - - -if __name__ == '__main__': - import argparse - PARSER = argparse.ArgumentParser() - PARSER.add_argument('--src_path', type=str, default='../data/mp4s') - PARSER.add_argument('--align_path', type=str, default='../data') - PARSER.add_argument('--n_process', type=int, default=1) - CONFIG = PARSER.parse_args() - PARAMS = {'src_path': CONFIG.src_path, 'align_path': CONFIG.align_path} - N_PROCESS = CONFIG.n_process - - if exists('./shape_predictor_68_face_landmarks.dat') is False: - os.system('wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 && \ - bzip2 -d shape_predictor_68_face_landmarks.dat.bz2') - - os.makedirs('{src_path}'.format(src_path=PARAMS['src_path']), exist_ok=True) - os.makedirs('{align_path}'.format(align_path=PARAMS['align_path']), exist_ok=True) - - if N_PROCESS == 1: - RES = download_mp4(0, 35, PARAMS) - RES = download_align(0, 35, PARAMS) - else: - # download movie files - RES = multi_p_run(tot_num=35, _func=put_worker, worker=download_mp4, \ - params=PARAMS, n_process=N_PROCESS) - - # download align files - RES = multi_p_run(tot_num=35, _func=put_worker, worker=download_align, \ - params=PARAMS, n_process=N_PROCESS) - - os.system('rm -f {src_path}/*.zip && rm -f {src_path}/*/Thumbs.db'.format( \ - src_path=PARAMS['src_path'])) - os.system('rm -f {align_path}/*.tar && rm -f {align_path}/Thumbs.db'.format( \ - align_path=PARAMS['align_path'])) diff --git a/example/gluon/lipnet/utils/multi.py b/example/gluon/lipnet/utils/multi.py deleted file mode 100644 index ce545b572de6..000000000000 --- a/example/gluon/lipnet/utils/multi.py +++ /dev/null @@ -1,104 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" -Module: preprocess with multi-process -""" - - -def multi_p_run(tot_num, _func, worker, params, n_process): - """ - Run _func with multi-process using params. - """ - from multiprocessing import Process, Queue - out_q = Queue() - procs = [] - - split_num = split_seq(list(range(0, tot_num)), n_process) - - print(tot_num, ">>", split_num) - - split_len = len(split_num) - if n_process > split_len: - n_process = split_len - - for i in range(n_process): - _p = Process(target=_func, - args=(worker, split_num[i][0], split_num[i][1], - params, out_q)) - _p.daemon = True - procs.append(_p) - _p.start() - - try: - result = [] - for i in range(n_process): - result.append(out_q.get()) - for i in procs: - i.join() - except KeyboardInterrupt: - print('Killing all the children in the pool.') - for i in procs: - i.terminate() - i.join() - return -1 - - while not out_q.empty(): - print(out_q.get(block=False)) - - return result - - -def split_seq(sam_num, n_tile): - """ - Split the number(sam_num) into numbers by n_tile - """ - import math - print(sam_num) - print(n_tile) - start_num = sam_num[0::int(math.ceil(len(sam_num) / (n_tile)))] - end_num = start_num[1::] - end_num.append(len(sam_num)) - return [[i, j] for i, j in zip(start_num, end_num)] - - -def put_worker(func, from_idx, to_idx, params, out_q): - """ - put worker - """ - succ, fail = func(from_idx, to_idx, params) - return out_q.put({'succ': succ, 'fail': fail}) - - -def test_worker(from_idx, to_idx, params): - """ - the worker to test multi-process - """ - params = params - succ = set() - fail = set() - for idx in range(from_idx, to_idx): - try: - succ.add(idx) - except ValueError: - fail.add(idx) - return (succ, fail) - - -if __name__ == '__main__': - RES = multi_p_run(35, put_worker, test_worker, params={}, n_process=5) - print(RES) diff --git a/example/gluon/lipnet/utils/preprocess_data.py b/example/gluon/lipnet/utils/preprocess_data.py deleted file mode 100644 index a13fad88af7a..000000000000 --- a/example/gluon/lipnet/utils/preprocess_data.py +++ /dev/null @@ -1,262 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" -Module: preprocess_data -Reference: https://github.com/rizkiarm/LipNet -""" - -# pylint: disable=too-many-locals, no-self-use, c-extension-no-member - -import os -import fnmatch -import errno -import numpy as np -from scipy import ndimage -from scipy.misc import imresize -from skimage import io -import skvideo.io -import dlib - -def mkdir_p(path): - """ - Make a directory - """ - try: - os.makedirs(path) - except OSError as exc: # Python >2.5 - if exc.errno == errno.EEXIST and os.path.isdir(path): - pass - else: - raise - -def find_files(directory, pattern): - """ - Find files - """ - for root, _, files in os.walk(directory): - for basename in files: - if fnmatch.fnmatch(basename, pattern): - filename = os.path.join(root, basename) - yield filename - -class Video(object): - """ - Preprocess for Video - """ - def __init__(self, vtype='mouth', face_predictor_path=None): - if vtype == 'face' and face_predictor_path is None: - raise AttributeError('Face video need to be accompanied with face predictor') - self.face_predictor_path = face_predictor_path - self.vtype = vtype - self.face = None - self.mouth = None - self.data = None - self.length = None - - def from_frames(self, path): - """ - Read from frames - """ - frames_path = sorted([os.path.join(path, x) for x in os.listdir(path)]) - frames = [ndimage.imread(frame_path) for frame_path in frames_path] - self.handle_type(frames) - return self - - def from_video(self, path): - """ - Read from videos - """ - frames = self.get_video_frames(path) - self.handle_type(frames) - return self - - def from_array(self, frames): - """ - Read from array - """ - self.handle_type(frames) - return self - - def handle_type(self, frames): - """ - Config video types - """ - if self.vtype == 'mouth': - self.process_frames_mouth(frames) - elif self.vtype == 'face': - self.process_frames_face(frames) - else: - raise Exception('Video type not found') - - def process_frames_face(self, frames): - """ - Preprocess from frames using face detector - """ - detector = dlib.get_frontal_face_detector() - predictor = dlib.shape_predictor(self.face_predictor_path) - mouth_frames = self.get_frames_mouth(detector, predictor, frames) - self.face = np.array(frames) - self.mouth = np.array(mouth_frames) - if mouth_frames[0] is not None: - self.set_data(mouth_frames) - - def process_frames_mouth(self, frames): - """ - Preprocess from frames using mouth detector - """ - self.face = np.array(frames) - self.mouth = np.array(frames) - self.set_data(frames) - - def get_frames_mouth(self, detector, predictor, frames): - """ - Get frames using mouth crop - """ - mouth_width = 100 - mouth_height = 50 - horizontal_pad = 0.19 - normalize_ratio = None - mouth_frames = [] - for frame in frames: - dets = detector(frame, 1) - shape = None - for det in dets: - shape = predictor(frame, det) - i = -1 - if shape is None: # Detector doesn't detect face, just return None - return [None] - mouth_points = [] - for part in shape.parts(): - i += 1 - if i < 48: # Only take mouth region - continue - mouth_points.append((part.x, part.y)) - np_mouth_points = np.array(mouth_points) - - mouth_centroid = np.mean(np_mouth_points[:, -2:], axis=0) - - if normalize_ratio is None: - mouth_left = np.min(np_mouth_points[:, :-1]) * (1.0 - horizontal_pad) - mouth_right = np.max(np_mouth_points[:, :-1]) * (1.0 + horizontal_pad) - - normalize_ratio = mouth_width / float(mouth_right - mouth_left) - - new_img_shape = (int(frame.shape[0] * normalize_ratio), - int(frame.shape[1] * normalize_ratio)) - resized_img = imresize(frame, new_img_shape) - - mouth_centroid_norm = mouth_centroid * normalize_ratio - - mouth_l = int(mouth_centroid_norm[0] - mouth_width / 2) - mouth_r = int(mouth_centroid_norm[0] + mouth_width / 2) - mouth_t = int(mouth_centroid_norm[1] - mouth_height / 2) - mouth_b = int(mouth_centroid_norm[1] + mouth_height / 2) - - mouth_crop_image = resized_img[mouth_t:mouth_b, mouth_l:mouth_r] - - mouth_frames.append(mouth_crop_image) - return mouth_frames - - def get_video_frames(self, path): - """ - Get video frames - """ - videogen = skvideo.io.vreader(path) - frames = np.array([frame for frame in videogen]) - return frames - - def set_data(self, frames): - """ - Prepare the input of model - """ - data_frames = [] - for frame in frames: - #frame H x W x C - frame = frame.swapaxes(0, 1) # swap width and height to form format W x H x C - if len(frame.shape) < 3: - frame = np.array([frame]).swapaxes(0, 2).swapaxes(0, 1) # Add grayscale channel - data_frames.append(frame) - frames_n = len(data_frames) - data_frames = np.array(data_frames) # T x W x H x C - data_frames = np.rollaxis(data_frames, 3) # C x T x W x H - data_frames = data_frames.swapaxes(2, 3) # C x T x H x W = NCDHW - - self.data = data_frames - self.length = frames_n - -def preprocess(from_idx, to_idx, _params): - """ - Preprocess: Convert a video into the mouth images - """ - source_exts = '*.mpg' - src_path = _params['src_path'] - tgt_path = _params['tgt_path'] - face_predictor_path = './shape_predictor_68_face_landmarks.dat' - - succ = set() - fail = set() - for idx in range(from_idx, to_idx): - s_id = 's' + str(idx) + '/' - source_path = src_path + '/' + s_id - target_path = tgt_path + '/' + s_id - fail_cnt = 0 - for filepath in find_files(source_path, source_exts): - print("Processing: {}".format(filepath)) - filepath_wo_ext = os.path.splitext(filepath)[0].split('/')[-2:] - target_dir = os.path.join(tgt_path, '/'.join(filepath_wo_ext)) - - if os.path.exists(target_dir): - continue - - try: - video = Video(vtype='face', \ - face_predictor_path=face_predictor_path).from_video(filepath) - mkdir_p(target_dir) - i = 0 - if video.mouth[0] is None: - continue - for frame in video.mouth: - io.imsave(os.path.join(target_dir, "mouth_{0:03d}.png".format(i)), frame) - i += 1 - except ValueError as error: - print(error) - fail_cnt += 1 - if fail_cnt == 0: - succ.add(idx) - else: - fail.add(idx) - return (succ, fail) - -if __name__ == '__main__': - import argparse - from multi import multi_p_run, put_worker - PARSER = argparse.ArgumentParser() - PARSER.add_argument('--src_path', type=str, default='../data/mp4s') - PARSER.add_argument('--tgt_path', type=str, default='../data/datasets') - PARSER.add_argument('--n_process', type=int, default=1) - CONFIG = PARSER.parse_args() - N_PROCESS = CONFIG.n_process - PARAMS = {'src_path':CONFIG.src_path, - 'tgt_path':CONFIG.tgt_path} - - os.makedirs('{tgt_path}'.format(tgt_path=PARAMS['tgt_path']), exist_ok=True) - - if N_PROCESS == 1: - RES = preprocess(0, 35, PARAMS) - else: - RES = multi_p_run(35, put_worker, preprocess, PARAMS, N_PROCESS) diff --git a/example/gluon/lipnet/utils/run_preprocess.ipynb b/example/gluon/lipnet/utils/run_preprocess.ipynb deleted file mode 100644 index 7a25e9b33517..000000000000 --- a/example/gluon/lipnet/utils/run_preprocess.ipynb +++ /dev/null @@ -1,194 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from download_data import multi_p_run, put_worker, _worker, download_mp4, download_align" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]\n", - "5\n", - "35 >> [[0, 7], [7, 14], [14, 21], [21, 28], [28, 35]]\n", - "[{'succ': {0, 1, 2, 3, 4, 5, 6}, 'fail': set()}, {'succ': {7, 8, 9, 10, 11, 12, 13}, 'fail': set()}, {'succ': {14, 15, 16, 17, 18, 19, 20}, 'fail': set()}, {'succ': {21, 22, 23, 24, 25, 26, 27}, 'fail': set()}, {'succ': {32, 33, 34, 28, 29, 30, 31}, 'fail': set()}]\n" - ] - } - ], - "source": [ - "res = multi_p_run(35, put_worker, _worker, 5)\n", - "print (res)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Download Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## down\n", - "import os\n", - "os.makedirs('./datasets', exist_ok=True)\n", - "#os.system('rm -rf ./datasets/*')\n", - "\n", - "res = multi_p_run(35, put_worker, download_align, 9)\n", - "print (res)\n", - "\n", - "os.system('rm -f datasets/*.tar && rm -f datasets/align/Thumbs.db')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = multi_p_run(35, put_worker, download_mp4, 9)\n", - "print (res)\n", - "\n", - "os.system('rm -f datasets/*.zip && rm -f datasets/*/Thumbs.db')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## download single 22 th dir\n", - "#download_data.py(22, 22)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Preprocess Data" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from preprocess_data import preprocess, find_files, Video" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import os\n", - "os.makedirs('./TARGET', exist_ok=True)\n", - "os.system('rm -rf ./TARGET/*')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]\n", - "9\n", - "35 >> [[0, 4], [4, 8], [8, 12], [12, 16], [16, 20], [20, 24], [24, 28], [28, 32], [32, 35]]\n", - "Processing: datasets/s1/prwq3s.mpg\n", - "Processing: datasets/s4/lrix7n.mpg\n", - "Processing: datasets/s8/pgbyza.mpg\n", - "Processing: datasets/s12/brik7n.mpg\n", - "Processing: datasets/s16/sgit7p.mpg\n", - "Processing: datasets/s20/lrbp8a.mpg\n", - "Processing: datasets/s24/sbik8a.mpg\n", - "Processing: datasets/s28/srwf8a.mpg\n", - "Processing: datasets/s32/pbbm1n.mpg\n", - "Processing: datasets/s12/sbbaza.mpg\n", - "Processing: datasets/s28/lbit7n.mpg\n", - "Processing: datasets/s32/pbwm7p.mpg\n", - "Processing: datasets/s8/bril2s.mpg\n", - "Processing: datasets/s20/bway7n.mpg\n", - "Processing: datasets/s1/pbib8p.mpg\n", - "Processing: datasets/s16/lwaj7n.mpg\n", - "Processing: datasets/s24/bwwl6a.mpg\n", - "Processing: datasets/s4/bbwf7n.mpg\n" - ] - } - ], - "source": [ - "res = multi_p_run(35, put_worker, preprocess, 9)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/example/gluon/lipnet/utils/run_preprocess_single_process.ipynb b/example/gluon/lipnet/utils/run_preprocess_single_process.ipynb deleted file mode 100644 index 4311323206e1..000000000000 --- a/example/gluon/lipnet/utils/run_preprocess_single_process.ipynb +++ /dev/null @@ -1,360 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from download_data import multi_p_run, put_worker, test_worker, download_mp4, download_align" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "tot_movies=35" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]\n", - "5\n", - "35 >> [[0, 7], [7, 14], [14, 21], [21, 28], [28, 35]]\n", - "[{'succ': {0, 1, 2, 3, 4, 5, 6}, 'fail': set()}, {'succ': {7, 8, 9, 10, 11, 12, 13}, 'fail': set()}, {'succ': {14, 15, 16, 17, 18, 19, 20}, 'fail': set()}, {'succ': {21, 22, 23, 24, 25, 26, 27}, 'fail': set()}, {'succ': {32, 33, 34, 28, 29, 30, 31}, 'fail': set()}]\n" - ] - } - ], - "source": [ - "res = multi_p_run(tot_movies, put_worker, test_worker, params={}, n_process=5)\n", - "print (res)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Download Data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Aligns" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s0/align/s0.tar && tar -xvf s0.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s1/align/s1.tar && tar -xvf s1.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s2/align/s2.tar && tar -xvf s2.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s3/align/s3.tar && tar -xvf s3.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s4/align/s4.tar && tar -xvf s4.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s5/align/s5.tar && tar -xvf s5.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s6/align/s6.tar && tar -xvf s6.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s7/align/s7.tar && tar -xvf s7.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s8/align/s8.tar && tar -xvf s8.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s9/align/s9.tar && tar -xvf s9.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s10/align/s10.tar && tar -xvf s10.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s11/align/s11.tar && tar -xvf s11.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s12/align/s12.tar && tar -xvf s12.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s13/align/s13.tar && tar -xvf s13.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s14/align/s14.tar && tar -xvf s14.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s15/align/s15.tar && tar -xvf s15.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s16/align/s16.tar && tar -xvf s16.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s17/align/s17.tar && tar -xvf s17.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s18/align/s18.tar && tar -xvf s18.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s19/align/s19.tar && tar -xvf s19.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s20/align/s20.tar && tar -xvf s20.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s21/align/s21.tar && tar -xvf s21.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s22/align/s22.tar && tar -xvf s22.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s23/align/s23.tar && tar -xvf s23.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s24/align/s24.tar && tar -xvf s24.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s25/align/s25.tar && tar -xvf s25.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s26/align/s26.tar && tar -xvf s26.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s27/align/s27.tar && tar -xvf s27.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s28/align/s28.tar && tar -xvf s28.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s29/align/s29.tar && tar -xvf s29.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s30/align/s30.tar && tar -xvf s30.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s31/align/s31.tar && tar -xvf s31.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s32/align/s32.tar && tar -xvf s32.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s33/align/s33.tar && tar -xvf s33.tar\n", - "cd ../data/align && wget http://spandh.dcs.shef.ac.uk/gridcorpus/s34/align/s34.tar && tar -xvf s34.tar\n" - ] - } - ], - "source": [ - "align_path = '../data/align'\n", - "os.makedirs(align_path, exist_ok=True)\n", - "\n", - "res = download_align(0, tot_movies, {'align_path':align_path})" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34}, set())\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print (res)\n", - "os.system('rm -f {align_path}/*.tar && rm -f {align_path}/Thumbs.db'.format(align_path=align_path))" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "### Moives(MP4s)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s0/video/s0.mpg_vcd.zip --output s0.mpg_vcd.zip && unzip s0.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s1/video/s1.mpg_vcd.zip --output s1.mpg_vcd.zip && unzip s1.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s2/video/s2.mpg_vcd.zip --output s2.mpg_vcd.zip && unzip s2.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s3/video/s3.mpg_vcd.zip --output s3.mpg_vcd.zip && unzip s3.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s4/video/s4.mpg_vcd.zip --output s4.mpg_vcd.zip && unzip s4.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s5/video/s5.mpg_vcd.zip --output s5.mpg_vcd.zip && unzip s5.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s6/video/s6.mpg_vcd.zip --output s6.mpg_vcd.zip && unzip s6.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s7/video/s7.mpg_vcd.zip --output s7.mpg_vcd.zip && unzip s7.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s8/video/s8.mpg_vcd.zip --output s8.mpg_vcd.zip && unzip s8.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s9/video/s9.mpg_vcd.zip --output s9.mpg_vcd.zip && unzip s9.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s10/video/s10.mpg_vcd.zip --output s10.mpg_vcd.zip && unzip s10.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s11/video/s11.mpg_vcd.zip --output s11.mpg_vcd.zip && unzip s11.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s12/video/s12.mpg_vcd.zip --output s12.mpg_vcd.zip && unzip s12.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s13/video/s13.mpg_vcd.zip --output s13.mpg_vcd.zip && unzip s13.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s14/video/s14.mpg_vcd.zip --output s14.mpg_vcd.zip && unzip s14.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s15/video/s15.mpg_vcd.zip --output s15.mpg_vcd.zip && unzip s15.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s16/video/s16.mpg_vcd.zip --output s16.mpg_vcd.zip && unzip s16.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s17/video/s17.mpg_vcd.zip --output s17.mpg_vcd.zip && unzip s17.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s18/video/s18.mpg_vcd.zip --output s18.mpg_vcd.zip && unzip s18.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s19/video/s19.mpg_vcd.zip --output s19.mpg_vcd.zip && unzip s19.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s20/video/s20.mpg_vcd.zip --output s20.mpg_vcd.zip && unzip s20.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s21/video/s21.mpg_vcd.zip --output s21.mpg_vcd.zip && unzip s21.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s22/video/s22.mpg_vcd.zip --output s22.mpg_vcd.zip && unzip s22.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s23/video/s23.mpg_vcd.zip --output s23.mpg_vcd.zip && unzip s23.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s24/video/s24.mpg_vcd.zip --output s24.mpg_vcd.zip && unzip s24.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s25/video/s25.mpg_vcd.zip --output s25.mpg_vcd.zip && unzip s25.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s26/video/s26.mpg_vcd.zip --output s26.mpg_vcd.zip && unzip s26.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s27/video/s27.mpg_vcd.zip --output s27.mpg_vcd.zip && unzip s27.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s28/video/s28.mpg_vcd.zip --output s28.mpg_vcd.zip && unzip s28.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s29/video/s29.mpg_vcd.zip --output s29.mpg_vcd.zip && unzip s29.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s30/video/s30.mpg_vcd.zip --output s30.mpg_vcd.zip && unzip s30.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s31/video/s31.mpg_vcd.zip --output s31.mpg_vcd.zip && unzip s31.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s32/video/s32.mpg_vcd.zip --output s32.mpg_vcd.zip && unzip s32.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s33/video/s33.mpg_vcd.zip --output s33.mpg_vcd.zip && unzip s33.mpg_vcd.zip\n", - "cd ../data/mp4s && curl http://spandh.dcs.shef.ac.uk/gridcorpus/s34/video/s34.mpg_vcd.zip --output s34.mpg_vcd.zip && unzip s34.mpg_vcd.zip\n" - ] - } - ], - "source": [ - "src_path = '../data/mp4s'\n", - "res = download_mp4(0, tot_movies, {'src_path':src_path})" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34}, set())\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print (res)\n", - "os.system('rm -f {src_path}/*.zip && rm -f {src_path}/*/Thumbs.db'.format(src_path=src_path))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Preprocess Data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "from preprocess_data import preprocess, find_files, Video" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "tgt_path = '../data/datasets'" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "os.makedirs('{tgt_path}'.format(tgt_path=tgt_path), exist_ok=True)\n", - "os.system('rm -rf {tgt_path}'.format(tgt_path=tgt_path))" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "res = preprocess(0, tot_movies, {'src_path':src_path, 'tgt_path':tgt_path})" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34}, set())\n" - ] - } - ], - "source": [ - "print (res)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python [default]", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/example/gluon/lstm_crf/README.md b/example/gluon/lstm_crf/README.md deleted file mode 100644 index 519c3b89f9fd..000000000000 --- a/example/gluon/lstm_crf/README.md +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - -# BiLSTM CRF model -This example demonstrates how a [BiLSTM-CRF model](https://arxiv.org/pdf/1508.01991v1.pdf) can be implemented in Gluon to perform noun-phrase chunking as a sequence labeling task. In this example we define the following training sample: -``` -georgia tech is a university in georgia -B I O O O O B -``` -The second line is the IOB representation of the above sentence that is learnt by the model. **I** stands for in chunk, **O** for out of a chunk and **B** for beginning of junks. - -The model consists of an LSTM layer with 2 hidden units and a CRF layer. The CRF layer has a state transition matrix which allows to take past and future tags into account when predicting the current tag. The bidirectional LSTM is reading the word sequence from beginning to end and vice versa. It prodcues a vector representation for the words. The following image is taken from https://arxiv.org/pdf/1508.01991v1.pdf and shows the model architecture: - -![Image taken from https://arxiv.org/pdf/1508.01991v1.pdf](https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/example/gluon/lstm_crf/bi-lstm_crf.png) - -You can run the example by executing -``` -python lstm_crf.py -``` -The example code does not take any commandline arguments. If you want to change the number of hidden units or the size of vectors embeddings, then you need to change the variables ```EMBEDDING_DIM``` and ```HIDDEN_DIM```. - - diff --git a/example/gluon/lstm_crf/lstm_crf.py b/example/gluon/lstm_crf/lstm_crf.py deleted file mode 100644 index 6cdc6e95a383..000000000000 --- a/example/gluon/lstm_crf/lstm_crf.py +++ /dev/null @@ -1,241 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -"""This example demonstrates how the LSTM-CRF model can be implemented -in Gluon to perform noun-phrase chunking as a sequence labeling task. -""" -import sys -import mxnet as mx -from mxnet import autograd as ag, ndarray as nd, gluon -from mxnet.gluon import Block, nn, rnn -import mxnet.optimizer as optim - -mx.random.seed(1) - - -# Helper functions to make the code more readable. -def to_scalar(x): - return int(x.asscalar()) - - -def argmax(vec): - # return the argmax as a python int - idx = nd.argmax(vec, axis=1) - return to_scalar(idx) - - -def prepare_sequence(seq, word2Idx): - return nd.array([word2Idx[w] for w in seq]) - - -# Compute log sum exp is numerically more stable than multiplying probabilities -def log_sum_exp(vec): - max_score = nd.max(vec).asscalar() - return nd.log(nd.sum(nd.exp(vec - max_score))) + max_score - - -# Model -class BiLSTM_CRF(Block): - """Get BiLSTM_CRF model""" - def __init__(self, vocab_size, tag2Idx, embedding_dim, hidden_dim): - super(BiLSTM_CRF, self).__init__() - with self.name_scope(): - self.embedding_dim = embedding_dim - self.hidden_dim = hidden_dim - self.vocab_size = vocab_size - self.tag2idx = tag2Idx - self.tagset_size = len(tag2Idx) - self.word_embeds = nn.Embedding(vocab_size, embedding_dim) - self.lstm = rnn.LSTM(hidden_dim // 2, num_layers=1, bidirectional=True) - - # Maps the output of the LSTM into tag space. - self.hidden2tag = nn.Dense(self.tagset_size) - - # Matrix of transition parameters. Entry i,j is the score of - # transitioning *to* i *from* j. - self.transitions = self.params.get("crf_transition_matrix", shape=(self.tagset_size, self.tagset_size)) - self.hidden = self.init_hidden() - - def init_hidden(self): - return [nd.random.normal(shape=(2, 1, self.hidden_dim // 2)), - nd.random.normal(shape=(2, 1, self.hidden_dim // 2))] - - def _forward_alg(self, feats): - # Do the forward algorithm to compute the partition function - alphas = [[-10000.] * self.tagset_size] - alphas[0][self.tag2idx[START_TAG]] = 0. - alphas = nd.array(alphas) - - # Iterate through the sentence - for feat in feats: - alphas_t = [] # The forward variables at this timestep - for next_tag in range(self.tagset_size): - # broadcast the emission score: it is the same regardless of - # the previous tag - emit_score = feat[next_tag].reshape((1, -1)) - # the ith entry of trans_score is the score of transitioning to - # next_tag from i - trans_score = self.transitions.data()[next_tag].reshape((1, -1)) - # The ith entry of next_tag_var is the value for the - # edge (i -> next_tag) before we do log-sum-exp - next_tag_var = alphas + trans_score + emit_score - # The forward variable for this tag is log-sum-exp of all the - # scores. - alphas_t.append(log_sum_exp(next_tag_var)) - alphas = nd.concat(*alphas_t, dim=0).reshape((1, -1)) - terminal_var = alphas + self.transitions.data()[self.tag2idx[STOP_TAG]] - alpha = log_sum_exp(terminal_var) - return alpha - - def _get_lstm_features(self, sentences): - self.hidden = self.init_hidden() - length = sentences.shape[0] - embeds = self.word_embeds(sentences).reshape((length, 1, -1)) - lstm_out, self.hidden = self.lstm(embeds, self.hidden) - lstm_out = lstm_out.reshape((length, self.hidden_dim)) - lstm_feats = self.hidden2tag(lstm_out) - return nd.split(lstm_feats, num_outputs=length, axis=0, squeeze_axis=True) - - def _score_sentence(self, feats, tags_array): - # Gives the score of a provided tag sequence - score = nd.array([0]) - tags_array = nd.concat(nd.array([self.tag2idx[START_TAG]]), *tags_array, dim=0) - for idx, feat in enumerate(feats): - score = score + \ - self.transitions.data()[to_scalar(tags_array[idx+1]), - to_scalar(tags_array[idx])] + feat[to_scalar(tags_array[idx+1])] - score = score + self.transitions.data()[self.tag2idx[STOP_TAG], - to_scalar(tags_array[int(tags_array.shape[0]-1)])] - return score - - def _viterbi_decode(self, feats): - backpointers = [] - - # Initialize the viterbi variables in log space - vvars = nd.full((1, self.tagset_size), -10000.) - vvars[0, self.tag2idx[START_TAG]] = 0 - - for feat in feats: - bptrs_t = [] # holds the backpointers for this step - viterbivars_t = [] # holds the viterbi variables for this step - - for next_tag in range(self.tagset_size): - # next_tag_var[i] holds the viterbi variable for tag i at the - # previous step, plus the score of transitioning - # from tag i to next_tag. - # We don't include the emission scores here because the max - # does not depend on them (we add them in below) - next_tag_var = vvars + self.transitions.data()[next_tag] - best_tag_id = argmax(next_tag_var) - bptrs_t.append(best_tag_id) - viterbivars_t.append(next_tag_var[0, best_tag_id]) - # Now add in the emission scores, and assign vvars to the set - # of viterbi variables we just computed - vvars = (nd.concat(*viterbivars_t, dim=0) + feat).reshape((1, -1)) - backpointers.append(bptrs_t) - - # Transition to STOP_TAG - terminal_var = vvars + self.transitions.data()[self.tag2idx[STOP_TAG]] - best_tag_id = argmax(terminal_var) - path_score = terminal_var[0, best_tag_id] - - # Follow the back pointers to decode the best path. - best_path = [best_tag_id] - for bptrs_t in reversed(backpointers): - best_tag_id = bptrs_t[best_tag_id] - best_path.append(best_tag_id) - # Pop off the start tag (we dont want to return that to the caller) - start = best_path.pop() - assert start == self.tag2idx[START_TAG] # Sanity check - best_path.reverse() - return path_score, best_path - - def neg_log_likelihood(self, sentences, tags_list): - feats = self._get_lstm_features(sentences) - forward_score = self._forward_alg(feats) - gold_score = self._score_sentence(feats, tags_list) - return forward_score - gold_score - - def forward(self, sentences): # dont confuse this with _forward_alg above. - # Get the emission scores from the BiLSTM - lstm_feats = self._get_lstm_features(sentences) - - # Find the best path, given the features. - score, tag_seq = self._viterbi_decode(lstm_feats) - return score, tag_seq - - -# Run training -START_TAG = "" -STOP_TAG = "" -EMBEDDING_DIM = 5 -HIDDEN_DIM = 4 - -# Make up some training data -training_data = [( - "the wall street journal reported today that apple corporation made money".split(), - "B I I I O O O B I O O".split() -), ( - "georgia tech is a university in georgia".split(), - "B I O O O O B".split() -)] - -word2idx = {} -for sentence, tags in training_data: - for word in sentence: - if word not in word2idx: - word2idx[word] = len(word2idx) - -tag2idx = {"B": 0, "I": 1, "O": 2, START_TAG: 3, STOP_TAG: 4} - -model = BiLSTM_CRF(len(word2idx), tag2idx, EMBEDDING_DIM, HIDDEN_DIM) -model.initialize(mx.init.Xavier(magnitude=2.24), ctx=mx.cpu()) -optimizer = gluon.Trainer(model.collect_params(), 'sgd', {'learning_rate': 0.01, 'wd': 1e-4}) - -# Check predictions before training -precheck_sent = prepare_sequence(training_data[0][0], word2idx) -precheck_tags = nd.array([tag2idx[t] for t in training_data[0][1]]) -print(model(precheck_sent)) - -# Make sure prepare_sequence from earlier in the LSTM section is loaded -for epoch in range(300): # again, normally you would NOT do 300 epochs, it is toy data - - neg_log_likelihood_acc = 0. - iter = 0 - for i, (sentence, tags) in enumerate(training_data): - # Step 1. Get our inputs ready for the network, that is, - # turn them into Variables of word indices. - # Remember to use autograd to record the calculation. - with ag.record(): - sentence_in = prepare_sequence(sentence, word2idx) - targets = nd.array([tag2idx[t] for t in tags]) - - # Step 2. Run our forward pass. - neg_log_likelihood = model.neg_log_likelihood(sentence_in, targets) - - # Step 3. Compute the loss, gradients, and update the parameters by - # calling optimizer.step() - neg_log_likelihood.backward() - optimizer.step(1) - neg_log_likelihood_acc += neg_log_likelihood.mean() - iter = i - print("Epoch [{}], Negative Log Likelihood {:.4f}".format(epoch, neg_log_likelihood_acc.asscalar()/(iter+1))) - -# Check predictions after training -precheck_sent = prepare_sequence(training_data[0][0], word2idx) -print(model(precheck_sent)) - -# Acknowledgement: this example is adopted from pytorch nlp tutorials. diff --git a/example/gluon/mnist/mnist.py b/example/gluon/mnist/mnist.py index 8066379df05a..121fcdf12250 100644 --- a/example/gluon/mnist/mnist.py +++ b/example/gluon/mnist/mnist.py @@ -71,8 +71,8 @@ def transformer(data, label): def test(ctx): metric = mx.gluon.metric.Accuracy() for data, label in val_data: - data = data.as_in_context(ctx) - label = label.as_in_context(ctx) + data = data.as_in_ctx(ctx) + label = label.as_in_ctx(ctx) output = net(data) metric.update([label], [output]) @@ -93,8 +93,8 @@ def train(epochs, ctx): metric.reset() for i, (data, label) in enumerate(train_data): # Copy data to ctx if necessary - data = data.as_in_context(ctx) - label = label.as_in_context(ctx) + data = data.as_in_ctx(ctx) + label = label.as_in_ctx(ctx) # Start recording computation graph with record() section. # Recorded graphs can then be differentiated with backward. with autograd.record(): diff --git a/example/gluon/sn_gan/README.md b/example/gluon/sn_gan/README.md deleted file mode 100644 index 054416fced09..000000000000 --- a/example/gluon/sn_gan/README.md +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - -# Spectral Normalization GAN - -This example implements [Spectral Normalization for Generative Adversarial Networks](https://arxiv.org/abs/1802.05957) based on [CIFAR10](https://www.cs.toronto.edu/~kriz/cifar.html) dataset. - -## Usage - -Example runs and the results: - -```python -python train.py --use-gpu --data-path=data -``` - -* Note that the program would download the CIFAR10 for you - -`python train.py --help` gives the following arguments: - -```bash -optional arguments: - -h, --help show this help message and exit - --data-path DATA_PATH - path of data. - --batch-size BATCH_SIZE - training batch size. default is 64. - --epochs EPOCHS number of training epochs. default is 100. - --lr LR learning rate. default is 0.0001. - --lr-beta LR_BETA learning rate for the beta in margin based loss. - default is 0.5. - --use-gpu use gpu for training. - --clip_gr CLIP_GR Clip the gradient by projecting onto the box. default - is 10.0. - --z-dim Z_DIM dimension of the latent z vector. default is 100. -``` - -## Result - -![SN-GAN](sn_gan_output.png) - -## Learned Spectral Normalization - -![alt text](https://github.com/taki0112/Spectral_Normalization-Tensorflow/blob/master/assests/sn.png) - -## Reference - -[Simple Tensorflow Implementation](https://github.com/taki0112/Spectral_Normalization-Tensorflow) \ No newline at end of file diff --git a/example/gluon/sn_gan/data.py b/example/gluon/sn_gan/data.py deleted file mode 100644 index 754aa2c992b1..000000000000 --- a/example/gluon/sn_gan/data.py +++ /dev/null @@ -1,42 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This example is inspired by https://github.com/jason71995/Keras-GAN-Library, -# https://github.com/kazizzad/DCGAN-Gluon-MxNet/blob/master/MxnetDCGAN.ipynb -# https://github.com/apache/incubator-mxnet/blob/master/example/gluon/dc_gan/dcgan.py - -import numpy as np - -import mxnet as mx -from mxnet import gluon -from mxnet.gluon.data.vision import CIFAR10 - -IMAGE_SIZE = 64 - -def transformer(data, label): - """ data preparation """ - data = mx.image.imresize(data, IMAGE_SIZE, IMAGE_SIZE) - data = mx.nd.transpose(data, (2, 0, 1)) - data = data.astype(np.float32) / 128.0 - 1 - return data, label - - -def get_training_data(batch_size): - """ helper function to get dataloader""" - return gluon.data.DataLoader( - CIFAR10(train=True).transform(transformer), - batch_size=batch_size, shuffle=True, last_batch='discard') diff --git a/example/gluon/sn_gan/model.py b/example/gluon/sn_gan/model.py deleted file mode 100644 index cfd7f93e8dae..000000000000 --- a/example/gluon/sn_gan/model.py +++ /dev/null @@ -1,139 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This example is inspired by https://github.com/jason71995/Keras-GAN-Library, -# https://github.com/kazizzad/DCGAN-Gluon-MxNet/blob/master/MxnetDCGAN.ipynb -# https://github.com/apache/incubator-mxnet/blob/master/example/gluon/dc_gan/dcgan.py - -import mxnet as mx -from mxnet import nd -from mxnet import gluon, autograd -from mxnet.gluon import Block - - -EPSILON = 1e-08 -POWER_ITERATION = 1 - -class SNConv2D(Block): - """ Customized Conv2D to feed the conv with the weight that we apply spectral normalization """ - - def __init__(self, num_filter, kernel_size, - strides, padding, in_channels, - ctx=mx.cpu(), iterations=1): - - super(SNConv2D, self).__init__() - - self.num_filter = num_filter - self.kernel_size = kernel_size - self.strides = strides - self.padding = padding - self.in_channels = in_channels - self.iterations = iterations - self.ctx = ctx - - with self.name_scope(): - # init the weight - self.weight = self.params.get('weight', shape=( - num_filter, in_channels, kernel_size, kernel_size)) - self.u = self.params.get( - 'u', init=mx.init.Normal(), shape=(1, num_filter)) - - def _spectral_norm(self): - """ spectral normalization """ - w = self.params.get('weight').data(self.ctx) - w_mat = nd.reshape(w, [w.shape[0], -1]) - - _u = self.u.data(self.ctx) - _v = None - - for _ in range(POWER_ITERATION): - _v = nd.L2Normalization(nd.dot(_u, w_mat)) - _u = nd.L2Normalization(nd.dot(_v, w_mat.T)) - - sigma = nd.sum(nd.dot(_u, w_mat) * _v) - if sigma == 0.: - sigma = EPSILON - - with autograd.pause(): - self.u.set_data(_u) - - return w / sigma - - def forward(self, x): - # x shape is batch_size x in_channels x height x width - return nd.Convolution( - data=x, - weight=self._spectral_norm(), - kernel=(self.kernel_size, self.kernel_size), - pad=(self.padding, self.padding), - stride=(self.strides, self.strides), - num_filter=self.num_filter, - no_bias=True - ) - - -def get_generator(): - """ construct and return generator """ - g_net = gluon.nn.Sequential() - with g_net.name_scope(): - - g_net.add(gluon.nn.Conv2DTranspose( - channels=512, kernel_size=4, strides=1, padding=0, use_bias=False)) - g_net.add(gluon.nn.BatchNorm()) - g_net.add(gluon.nn.LeakyReLU(0.2)) - - g_net.add(gluon.nn.Conv2DTranspose( - channels=256, kernel_size=4, strides=2, padding=1, use_bias=False)) - g_net.add(gluon.nn.BatchNorm()) - g_net.add(gluon.nn.LeakyReLU(0.2)) - - g_net.add(gluon.nn.Conv2DTranspose( - channels=128, kernel_size=4, strides=2, padding=1, use_bias=False)) - g_net.add(gluon.nn.BatchNorm()) - g_net.add(gluon.nn.LeakyReLU(0.2)) - - g_net.add(gluon.nn.Conv2DTranspose( - channels=64, kernel_size=4, strides=2, padding=1, use_bias=False)) - g_net.add(gluon.nn.BatchNorm()) - g_net.add(gluon.nn.LeakyReLU(0.2)) - - g_net.add(gluon.nn.Conv2DTranspose(channels=3, kernel_size=4, strides=2, padding=1, use_bias=False)) - g_net.add(gluon.nn.Activation('tanh')) - - return g_net - - -def get_descriptor(ctx): - """ construct and return descriptor """ - d_net = gluon.nn.Sequential() - with d_net.name_scope(): - - d_net.add(SNConv2D(num_filter=64, kernel_size=4, strides=2, padding=1, in_channels=3, ctx=ctx)) - d_net.add(gluon.nn.LeakyReLU(0.2)) - - d_net.add(SNConv2D(num_filter=128, kernel_size=4, strides=2, padding=1, in_channels=64, ctx=ctx)) - d_net.add(gluon.nn.LeakyReLU(0.2)) - - d_net.add(SNConv2D(num_filter=256, kernel_size=4, strides=2, padding=1, in_channels=128, ctx=ctx)) - d_net.add(gluon.nn.LeakyReLU(0.2)) - - d_net.add(SNConv2D(num_filter=512, kernel_size=4, strides=2, padding=1, in_channels=256, ctx=ctx)) - d_net.add(gluon.nn.LeakyReLU(0.2)) - - d_net.add(SNConv2D(num_filter=1, kernel_size=4, strides=1, padding=0, in_channels=512, ctx=ctx)) - - return d_net diff --git a/example/gluon/sn_gan/sn_gan_output.png b/example/gluon/sn_gan/sn_gan_output.png deleted file mode 100644 index 428c333150234cc5e586bf0f8dd43023bc9ae092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404415 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
JKT`KX1sW7qh3L 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� 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

s4{PeH6raVh*W)|0k>WE#_IFfE;lvIgrMdK-< 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