diff --git a/README.md b/README.md
index 60aff18ed..50db680a2 100644
--- a/README.md
+++ b/README.md
@@ -290,6 +290,7 @@ Models | Ca
[YoloNet](https://arxiv.org/abs/1506.02640) | √ | √ | √ |
[Pix2Pix](https://github.com/phillipi/pix2pix) | √ | × | × |
[VQA](https://github.com/iamaaditya/VQA_Demo) | √ | √ | √ |
+[Denoising Auto-Encoder](https://blog.keras.io/building-autoencoders-in-keras.html) | × | √ | √ |
Note: For models that use a custom LRN layer (Alexnet), Keras expects the custom layer to be passed when it is loaded from json. LRN.py is located in keras_app/custom_layers. [Alexnet import for Keras](https://github.com/Cloud-CV/Fabrik/blob/master/tutorials/keras_custom_layer_usage.md)
diff --git a/docs/source/tested_models.md b/docs/source/tested_models.md
index a8948c609..c028803d0 100644
--- a/docs/source/tested_models.md
+++ b/docs/source/tested_models.md
@@ -35,6 +35,7 @@
* Seq2Seq Translation [\[Source\]](https://github.com/fchollet/keras/blob/master/examples/lstm_seq2seq.py)[\[Visualise\]](http://fabrik.cloudcv.org/caffe/load?id=20171208115116hsfax)
* Text Generation [\[Source\]](https://machinelearningmastery.com/text-generation-lstm-recurrent-neural-networks-python-keras/)[\[Visualise\]](http://fabrik.cloudcv.org/caffe/load?id=20171208113517iphlh)
* Pix2Pix [\[Source\]](https://github.com/phillipi/pix2pix) [\[Visualise\]](http://fabrik.cloudcv.org/caffe/load?id=20180105143836eahgb)
+* Denoising Auto-Encoder [\[Source\]](https://blog.keras.io/building-autoencoders-in-keras.html)
### Captioning
diff --git a/example/keras/DAE_MNIST.json b/example/keras/DAE_MNIST.json
new file mode 100644
index 000000000..468312bce
--- /dev/null
+++ b/example/keras/DAE_MNIST.json
@@ -0,0 +1,583 @@
+{
+ "backend": "tensorflow",
+ "class_name": "Model",
+ "config": {
+ "input_layers": [
+ [
+ "input_1",
+ 0,
+ 0
+ ]
+ ],
+ "layers": [
+ {
+ "class_name": "InputLayer",
+ "config": {
+ "batch_input_shape": [
+ null,
+ 28,
+ 28,
+ 1
+ ],
+ "dtype": "float32",
+ "name": "input_1",
+ "sparse": false
+ },
+ "inbound_nodes": [],
+ "name": "input_1"
+ },
+ {
+ "class_name": "GaussianNoise",
+ "config": {
+ "name": "gaussian_noise_1",
+ "stddev": 0.2,
+ "trainable": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "input_1",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "gaussian_noise_1"
+ },
+ {
+ "class_name": "Conv2D",
+ "config": {
+ "activation": "relu",
+ "activity_regularizer": null,
+ "bias_constraint": null,
+ "bias_initializer": {
+ "class_name": "Zeros",
+ "config": {}
+ },
+ "bias_regularizer": null,
+ "data_format": "channels_last",
+ "dilation_rate": [
+ 1,
+ 1
+ ],
+ "filters": 16,
+ "kernel_constraint": null,
+ "kernel_initializer": {
+ "class_name": "VarianceScaling",
+ "config": {
+ "distribution": "uniform",
+ "mode": "fan_avg",
+ "scale": 1.0,
+ "seed": null
+ }
+ },
+ "kernel_regularizer": null,
+ "kernel_size": [
+ 3,
+ 3
+ ],
+ "name": "conv2d_1",
+ "padding": "same",
+ "strides": [
+ 1,
+ 1
+ ],
+ "trainable": true,
+ "use_bias": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "gaussian_noise_1",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "conv2d_1"
+ },
+ {
+ "class_name": "MaxPooling2D",
+ "config": {
+ "data_format": "channels_last",
+ "name": "max_pooling2d_1",
+ "padding": "same",
+ "pool_size": [
+ 2,
+ 2
+ ],
+ "strides": [
+ 2,
+ 2
+ ],
+ "trainable": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "conv2d_1",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "max_pooling2d_1"
+ },
+ {
+ "class_name": "Conv2D",
+ "config": {
+ "activation": "relu",
+ "activity_regularizer": null,
+ "bias_constraint": null,
+ "bias_initializer": {
+ "class_name": "Zeros",
+ "config": {}
+ },
+ "bias_regularizer": null,
+ "data_format": "channels_last",
+ "dilation_rate": [
+ 1,
+ 1
+ ],
+ "filters": 8,
+ "kernel_constraint": null,
+ "kernel_initializer": {
+ "class_name": "VarianceScaling",
+ "config": {
+ "distribution": "uniform",
+ "mode": "fan_avg",
+ "scale": 1.0,
+ "seed": null
+ }
+ },
+ "kernel_regularizer": null,
+ "kernel_size": [
+ 3,
+ 3
+ ],
+ "name": "conv2d_2",
+ "padding": "same",
+ "strides": [
+ 1,
+ 1
+ ],
+ "trainable": true,
+ "use_bias": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "max_pooling2d_1",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "conv2d_2"
+ },
+ {
+ "class_name": "MaxPooling2D",
+ "config": {
+ "data_format": "channels_last",
+ "name": "max_pooling2d_2",
+ "padding": "same",
+ "pool_size": [
+ 2,
+ 2
+ ],
+ "strides": [
+ 2,
+ 2
+ ],
+ "trainable": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "conv2d_2",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "max_pooling2d_2"
+ },
+ {
+ "class_name": "Conv2D",
+ "config": {
+ "activation": "relu",
+ "activity_regularizer": null,
+ "bias_constraint": null,
+ "bias_initializer": {
+ "class_name": "Zeros",
+ "config": {}
+ },
+ "bias_regularizer": null,
+ "data_format": "channels_last",
+ "dilation_rate": [
+ 1,
+ 1
+ ],
+ "filters": 8,
+ "kernel_constraint": null,
+ "kernel_initializer": {
+ "class_name": "VarianceScaling",
+ "config": {
+ "distribution": "uniform",
+ "mode": "fan_avg",
+ "scale": 1.0,
+ "seed": null
+ }
+ },
+ "kernel_regularizer": null,
+ "kernel_size": [
+ 3,
+ 3
+ ],
+ "name": "conv2d_3",
+ "padding": "same",
+ "strides": [
+ 1,
+ 1
+ ],
+ "trainable": true,
+ "use_bias": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "max_pooling2d_2",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "conv2d_3"
+ },
+ {
+ "class_name": "MaxPooling2D",
+ "config": {
+ "data_format": "channels_last",
+ "name": "max_pooling2d_3",
+ "padding": "same",
+ "pool_size": [
+ 2,
+ 2
+ ],
+ "strides": [
+ 2,
+ 2
+ ],
+ "trainable": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "conv2d_3",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "max_pooling2d_3"
+ },
+ {
+ "class_name": "Conv2D",
+ "config": {
+ "activation": "relu",
+ "activity_regularizer": null,
+ "bias_constraint": null,
+ "bias_initializer": {
+ "class_name": "Zeros",
+ "config": {}
+ },
+ "bias_regularizer": null,
+ "data_format": "channels_last",
+ "dilation_rate": [
+ 1,
+ 1
+ ],
+ "filters": 8,
+ "kernel_constraint": null,
+ "kernel_initializer": {
+ "class_name": "VarianceScaling",
+ "config": {
+ "distribution": "uniform",
+ "mode": "fan_avg",
+ "scale": 1.0,
+ "seed": null
+ }
+ },
+ "kernel_regularizer": null,
+ "kernel_size": [
+ 3,
+ 3
+ ],
+ "name": "conv2d_4",
+ "padding": "same",
+ "strides": [
+ 1,
+ 1
+ ],
+ "trainable": true,
+ "use_bias": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "max_pooling2d_3",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "conv2d_4"
+ },
+ {
+ "class_name": "UpSampling2D",
+ "config": {
+ "data_format": "channels_last",
+ "name": "up_sampling2d_1",
+ "size": [
+ 2,
+ 2
+ ],
+ "trainable": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "conv2d_4",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "up_sampling2d_1"
+ },
+ {
+ "class_name": "Conv2D",
+ "config": {
+ "activation": "relu",
+ "activity_regularizer": null,
+ "bias_constraint": null,
+ "bias_initializer": {
+ "class_name": "Zeros",
+ "config": {}
+ },
+ "bias_regularizer": null,
+ "data_format": "channels_last",
+ "dilation_rate": [
+ 1,
+ 1
+ ],
+ "filters": 8,
+ "kernel_constraint": null,
+ "kernel_initializer": {
+ "class_name": "VarianceScaling",
+ "config": {
+ "distribution": "uniform",
+ "mode": "fan_avg",
+ "scale": 1.0,
+ "seed": null
+ }
+ },
+ "kernel_regularizer": null,
+ "kernel_size": [
+ 3,
+ 3
+ ],
+ "name": "conv2d_5",
+ "padding": "same",
+ "strides": [
+ 1,
+ 1
+ ],
+ "trainable": true,
+ "use_bias": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "up_sampling2d_1",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "conv2d_5"
+ },
+ {
+ "class_name": "UpSampling2D",
+ "config": {
+ "data_format": "channels_last",
+ "name": "up_sampling2d_2",
+ "size": [
+ 2,
+ 2
+ ],
+ "trainable": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "conv2d_5",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "up_sampling2d_2"
+ },
+ {
+ "class_name": "Conv2D",
+ "config": {
+ "activation": "relu",
+ "activity_regularizer": null,
+ "bias_constraint": null,
+ "bias_initializer": {
+ "class_name": "Zeros",
+ "config": {}
+ },
+ "bias_regularizer": null,
+ "data_format": "channels_last",
+ "dilation_rate": [
+ 1,
+ 1
+ ],
+ "filters": 16,
+ "kernel_constraint": null,
+ "kernel_initializer": {
+ "class_name": "VarianceScaling",
+ "config": {
+ "distribution": "uniform",
+ "mode": "fan_avg",
+ "scale": 1.0,
+ "seed": null
+ }
+ },
+ "kernel_regularizer": null,
+ "kernel_size": [
+ 3,
+ 3
+ ],
+ "name": "conv2d_6",
+ "padding": "valid",
+ "strides": [
+ 1,
+ 1
+ ],
+ "trainable": true,
+ "use_bias": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "up_sampling2d_2",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "conv2d_6"
+ },
+ {
+ "class_name": "UpSampling2D",
+ "config": {
+ "data_format": "channels_last",
+ "name": "up_sampling2d_3",
+ "size": [
+ 2,
+ 2
+ ],
+ "trainable": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "conv2d_6",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "up_sampling2d_3"
+ },
+ {
+ "class_name": "Conv2D",
+ "config": {
+ "activation": "sigmoid",
+ "activity_regularizer": null,
+ "bias_constraint": null,
+ "bias_initializer": {
+ "class_name": "Zeros",
+ "config": {}
+ },
+ "bias_regularizer": null,
+ "data_format": "channels_last",
+ "dilation_rate": [
+ 1,
+ 1
+ ],
+ "filters": 1,
+ "kernel_constraint": null,
+ "kernel_initializer": {
+ "class_name": "VarianceScaling",
+ "config": {
+ "distribution": "uniform",
+ "mode": "fan_avg",
+ "scale": 1.0,
+ "seed": null
+ }
+ },
+ "kernel_regularizer": null,
+ "kernel_size": [
+ 3,
+ 3
+ ],
+ "name": "conv2d_7",
+ "padding": "same",
+ "strides": [
+ 1,
+ 1
+ ],
+ "trainable": true,
+ "use_bias": true
+ },
+ "inbound_nodes": [
+ [
+ [
+ "up_sampling2d_3",
+ 0,
+ 0,
+ {}
+ ]
+ ]
+ ],
+ "name": "conv2d_7"
+ }
+ ],
+ "name": "Denoising Auto-Encoder",
+ "output_layers": [
+ [
+ "conv2d_7",
+ 0,
+ 0
+ ]
+ ]
+ },
+ "keras_version": "2.1.6"
+}
\ No newline at end of file
diff --git a/ide/static/js/modelZoo.js b/ide/static/js/modelZoo.js
index 186846286..320360427 100644
--- a/ide/static/js/modelZoo.js
+++ b/ide/static/js/modelZoo.js
@@ -55,6 +55,8 @@ class ModelZoo extends React.Component {
+