Repository: microsoft/nn-Meter (language: python)

Issue:
Bump tensorflow from 1.15.0 to 2.4.0 in /kerneldetection
Bumps [tensorflow](https://github.com/tensorflow/tensorflow) from 1.15.0 to 2.4.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/tensorflow/tensorflow/releases">tensorflow's releases</a>.</em></p>
<blockquote>
<h2>TensorFlow 2.4.0</h2>
<h1>Release 2.4.0</h1>
<h2>Major Features and Improvements</h2>
<ul>
<li>
<p><code>tf.distribute</code> introduces experimental support for asynchronous training of models via the <a href="https://www.tensorflow.org/api_docs/python/tf/distribute/experimental/ParameterServerStrategy"><code>tf.distribute.experimental.ParameterServerStrategy</code></a> API. Please see the <a href="https://www.tensorflow.org/tutorials/distribute/parameter_server_training">tutorial</a> to learn more.</p>
</li>
<li>
<p><a href="https://www.tensorflow.org/api_docs/python/tf/distribute/MultiWorkerMirroredStrategy"><code>MultiWorkerMirroredStrategy</code></a> is now a stable API and is no longer considered experimental. Some of the major improvements involve handling peer failure and many bug fixes. Please check out the detailed tutorial on <a href="https://www.tensorflow.org/tutorials/distribute/multi_worker_with_keras">Multi-worker training with Keras</a>.</p>
</li>
<li>
<p>Introduces experimental support for a new module named <a href="https://www.tensorflow.org/api_docs/python/tf/experimental/numpy"><code>tf.experimental.numpy</code></a> which is a NumPy-compatible API for writing TF programs. See the <a href="https://www.tensorflow.org/guide/tf_numpy">detailed guide</a> to learn more. Additional details below.</p>
</li>
<li>
<p>Adds Support for
<a href="https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/">TensorFloat-32</a> on Ampere based GPUs. TensorFloat-32, or TF32 for short, is a math mode for NVIDIA Ampere based GPUs and is enabled by default.</p>
</li>
<li>
<p>A major refactoring of the internals of the Keras Functional API has been completed, that should improve the reliability, stability, and performance of constructing Functional models.</p>
</li>
<li>
<p>Keras mixed precision API <a href="https://www.tensorflow.org/api_docs/python/tf/keras/mixed_precision?version=nightly"><code>tf.keras.mixed_precision</code></a> is no longer experimental and allows the use of 16-bit floating point formats during training, improving performance by up to 3x on GPUs and 60% on TPUs. Please see below for additional details.</p>
</li>
<li>
<p>TensorFlow Profiler now supports profiling <code>MultiWorkerMirroredStrategy</code> and tracing multiple workers using the <a href="https://www.tensorflow.org/guide/profiler#profiling_apis">sampling mode API</a>.</p>
</li>
<li>
<p>TFLite Profiler for Android is available. See the detailed <a href="https://www.tensorflow.org/lite/performance/measurement#trace_tensorflow_lite_internals_in_android">guide</a> to learn more.</p>
</li>
<li>
<p>TensorFlow pip packages are now built with CUDA11 and cuDNN 8.0.2.</p>
</li>
</ul>
<h2>Breaking Changes</h2>
<ul>
<li>
<p>TF Core:</p>
<ul>
<li>Certain float32 ops run in lower precsion on Ampere based GPUs, including  matmuls and convolutions, due to the use of <a href="https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/">TensorFloat-32</a>. Specifically, inputs to such ops are rounded from 23 bits of precision to 10
bits of precision. This is unlikely to cause issues in practice for deep learning models. In some cases, TensorFloat-32 is also used for complex64 ops.
TensorFloat-32 can be disabled by running <code>tf.config.experimental.enable_tensor_float_32_execution(False)</code>.</li>
<li>The byte layout for string tensors across the C-API has been updated to match TF Core/C++; i.e., a contiguous array of <code>tensorflow::tstring</code>/<code>TF_TString</code>s.</li>
<li>C-API functions <code>TF_StringDecode</code>, <code>TF_StringEncode</code>, and <code>TF_StringEncodedSize</code> are no longer relevant and have been removed; see <code>core/platform/ctstring.h</code> for  string access/modification in C.</li>
<li><code>tensorflow.python</code>, <code>tensorflow.core</code> and <code>tensorflow.compiler</code> modules are now hidden. These modules are not part of TensorFlow public API.</li>
<li><code>tf.raw_ops.Max</code> and <code>tf.raw_ops.Min</code> no longer accept inputs of type <code>tf.complex64</code> or <code>tf.complex128</code>, because the behavior of these ops is not well defined for complex types.</li>
<li>XLA:CPU and XLA:GPU devices are no longer registered by default. Use <code>TF_XLA_FLAGS=--tf_xla_enable_xla_devices</code> if you really need them, but this flag will eventually be removed in subsequent releases.</li>
</ul>
</li>
<li>
<p><code>tf.keras</code>:</p>
<ul>
<li>The <code>steps_per_execution</code> argument in <code>model.compile()</code> is no longer experimental; if you were passing <code>experimental_steps_per_execution</code>, rename it to <code>steps_per_execution</code> in your code. This argument controls the number of batches to run during each <code>tf.function</code> call when calling <code>model.fit()</code>. Running multiple batches inside a single <code>tf.function</code> call can greatly improve performance on TPUs or small models with a large Python overhead.</li>
<li>A <strong>major refactoring</strong> of the internals of the Keras Functional API may affect code that
is relying on certain internal details:
<ul>
<li>Code that uses <code>isinstance(x, tf.Tensor)</code> instead of <code>tf.is_tensor</code> when checking Keras symbolic inputs/outputs should switch to using <code>tf.is_tensor</code>.</li>
<li>Code that is overly dependent on the exact names attached to symbolic tensors (e.g. assumes there will be &quot;:0&quot; at the end of the inputs, treats names as unique identifiers instead of using <code>tensor.ref()</code>, etc.) may break.</li>
<li>Code that uses full path for <code>get_concrete_function</code> to trace Keras symbolic inputs directly should switch to building matching <code>tf.TensorSpec</code>s directly and tracing the <code>TensorSpec</code> objects.</li>
<li>Code that relies on the exact number and names of the op layers that TensorFlow operations  were converted into may have changed.</li>
<li>Code that uses <code>tf.map_fn</code>/<code>tf.cond</code>/<code>tf.while_loop</code>/control flow as op layers and  happens to work before TF 2.4. These will explicitly be unsupported now. Converting these ops to Functional API op layers was unreliable before TF 2.4, and prone to erroring incomprehensibly  or being silently buggy.</li>
<li>Code that directly asserts on a Keras symbolic value in cases where ops like <code>tf.rank</code> used to  return a static or symbolic value depending on if the input had a fully static shape or not. Now these ops always return symbolic values.</li>
<li>Code already susceptible to leaking tensors outside of graphs becomes slightly more likely to do so now.</li>
<li>Code that tries directly getting gradients with respect to symbolic Keras inputs/outputs. Use <code>GradientTape</code> on the actual Tensors passed to the already-constructed model instead.</li>
<li>Code that requires very tricky shape manipulation via converted op layers in order to work, where the Keras symbolic shape inference proves insufficient.</li>
<li>Code that tries manually walking a <code>tf.keras.Model</code> layer by layer and assumes layers only ever have one positional argument. This assumption doesn't hold       true before TF 2.4 either, but is more likely to cause issues now.</li>
</ul>
</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/tensorflow/tensorflow/blob/master/RELEASE.md">tensorflow's changelog</a>.</em></p>
<blockquote>
<h1>Release 2.4.0</h1>
<h2>Major Features and Improvements</h2>
<ul>
<li>
<p><code>tf.distribute</code> introduces experimental support for asynchronous training of
models via the [<code>tf.distribute.experimental.ParameterServerStrategy</code>]
(<a href="https://www.tensorflow.org/api_docs/python/tf/distribute/experimental/ParameterServerStrategy">https://www.tensorflow.org/api_docs/python/tf/distribute/experimental/ParameterServerStrategy</a>)
API. Please see the <a href="https://www.tensorflow.org/tutorials/distribute/parameter_server_training">tutorial</a>
to learn more.</p>
</li>
<li>
<p><a href="https://www.tensorflow.org/api_docs/python/tf/distribute/MultiWorkerMirroredStrategy"><code>MultiWorkerMirroredStrategy</code></a>
is now a stable API and is no longer considered experimental. Some of the
major improvements involve handling peer failure and many bug fixes. Please
check out the detailed tutorial on [Multi-worker training with Keras]
(<a href="https://www.tensorflow.org/tutorials/distribute/multi_worker_with_keras">https://www.tensorflow.org/tutorials/distribute/multi_worker_with_keras</a>).</p>
</li>
<li>
<p>Introduces experimental support for a new module named [<code>tf.experimental.numpy</code>]
(<a href="https://www.tensorflow.org/api_docs/python/tf/experimental/numpy">https://www.tensorflow.org/api_docs/python/tf/experimental/numpy</a>) which is a
NumPy-compatible API for writing TF programs. See the [detailed guide]
(<a href="https://www.tensorflow.org/guide/tf_numpy">https://www.tensorflow.org/guide/tf_numpy</a>) to learn more. Additional details below.</p>
</li>
<li>
<p>Adds Support for
<a href="https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/">TensorFloat-32</a>
on Ampere based GPUs. TensorFloat-32, or TF32 for short, is a math mode for
NVIDIA Ampere based GPUs and is enabled by default.</p>
</li>
<li>
<p>A major refactoring of the internals of the Keras Functional API has been
completed, that should improve the reliability, stability, and performance of
constructing Functional models.</p>
</li>
<li>
<p>Keras mixed precision API [<code>tf.keras.mixed_precision</code>]
(<a href="https://www.tensorflow.org/api_docs/python/tf/keras/mixed_precision?version=nightly">https://www.tensorflow.org/api_docs/python/tf/keras/mixed_precision?version=nightly</a>)
is no longer experimental and allows the use of 16-bit floating point formats
during training, improving performance by up to 3x on GPUs and 60% on TPUs.
Please see below for additional details.</p>
</li>
<li>
<p>TensorFlow Profiler now supports profiling <code>MultiWorkerMirroredStrategy</code> and
tracing multiple workers using the [sampling mode API]
(<a href="https://www.tensorflow.org/guide/profiler#profiling_apis">https://www.tensorflow.org/guide/profiler#profiling_apis</a>).</p>
</li>
<li>
<p>TFLite Profiler for Android is available. See the detailed [guide]
(<a href="https://www.tensorflow.org/lite/performance/measurement#trace_tensorflow_lite_internals_in_android">https://www.tensorflow.org/lite/performance/measurement#trace_tensorflow_lite_internals_in_android</a>)
to learn more.</p>
</li>
<li>
<p>TensorFlow pip packages are now built with CUDA11 and cuDNN 8.0.2.</p>
</li>
</ul>
<h2>Breaking Changes</h2>
<ul>
<li>TF Core:
<ul>
<li>Certain float32 ops run in lower precision on Ampere based GPUs, including</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/tensorflow/tensorflow/commit/582c8d236cb079023657287c318ff26adb239002"><code>582c8d2</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/tensorflow/tensorflow/issues/44220">#44220</a> from tensorflow-jenkins/relnotes-2.4.0rc0-18048</li>
<li><a href="https://github.com/tensorflow/tensorflow/commit/c16387f692bf46a95100adc91a68922414b53d4c"><code>c16387f</code></a> Update RELEASE.md</li>
<li><a href="https://github.com/tensorflow/tensorflow/commit/4cf406c8a617392864efa7d8f50510a2c95e049a"><code>4cf406c</code></a> Update RELEASE.md</li>
<li><a href="https://github.com/tensorflow/tensorflow/commit/3f35ef2452dc0f27797e8a295371065834335944"><code>3f35ef2</code></a> Update RELEASE.md</li>
<li><a href="https://github.com/tensorflow/tensorflow/commit/3647e8ec38de7891887ca72c9777ab92a2c09ad2"><code>3647e8e</code></a> Update RELEASE.md</li>
<li><a href="https://github.com/tensorflow/tensorflow/commit/281c7d540508ebf92d5c8f602e52b37836c9f55c"><code>281c7d5</code></a> Update RELEASE.md</li>
<li><a href="https://github.com/tensorflow/tensorflow/commit/91ec75f872634537d95485b66d8c82c2bb61a497"><code>91ec75f</code></a> Update RELEASE.md</li>
<li><a href="https://github.com/tensorflow/tensorflow/commit/ed5ad82e763f0842d96762cf3ae214ea5c6eadc8"><code>ed5ad82</code></a> Update RELEASE.md</li>
<li><a href="https://github.com/tensorflow/tensorflow/commit/1267bba74887f0a4ae47a8758b24b11165daf928"><code>1267bba</code></a> Update RELEASE.md</li>
<li><a href="https://github.com/tensorflow/tensorflow/commit/13a4067a164648411cb7ef9cb579e2a4d5844260"><code>13a4067</code></a> Update RELEASE.md</li>
<li>Additional commits viewable in <a href="https://github.com/tensorflow/tensorflow/compare/v1.15.0...v2.4.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tensorflow&package-manager=pip&previous-version=1.15.0&new-version=2.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language
- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language
- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language
- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language

You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/microsoft/nn-Meter/network/alerts).

</details>


Discussion / hints:
Current code implementation bases on tf 1.15.0. 
OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting `@dependabot ignore this major version` or `@dependabot ignore this minor version`.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

Fix patch:
diff --git a/docs/backend.md b/docs/backend.md
new file mode 100644
index 00000000..3e9d662c
--- /dev/null
+++ b/docs/backend.md
@@ -0,0 +1,73 @@
+# Setup Device and Backend
+
+To run a model on the device, we implement several backends. These backends will run the model and parse the command line outputs to get latency results. We provide a consistent API for such backends. You can inherit the `BaseBackend` and implement a backend for your own device that's not included here.
+
+Currently we support TFLite on CPU, GPU and OpenVINO on VPU. Following we will explain how to setup the device and backend.
+
+## Android Guide
+
+### Prepare Android Device
+
+> Follow [ADB Guide](https://developer.android.com/studio/command-line/adb) to install adb on your host device.
+
+> Follow the [tensorflow official guide](https://www.tensorflow.org/lite/performance/measurement) for a more detailed guide to build and deploy `benchmark_model` onto the device.
+
+
+Download tensorflow source code and type following lines in tensorflow root folder:
+```
+bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model
+adb push bazel-bin/tensorflow/lite/tools/benchmark/benchmark_model /data/local/tmp
+adb shell chmod +x /data/local/tmp/benchmark_model
+```
+
+### Usage
+
+Use api `get_backend` to initialize the Android CPU or GPU backend.
+
+```python
+backend = get_backend('tflite_cpu', {
+    'MODEL_DIR': '~/models',  # directory on host to save temporary tflite models
+    'REMOTE_MODEL_DIR': '/data/local/tmp/models',  # directory on mobile phone to place models
+    'KERNEL_PATH': '/data/local/tmp/kernels.cl',  # directory on mobile phone where kernel code files will be generated
+    'BENCHMARK_MODEL_PATH': '/data/local/tmp/benchmark_model',  # path to bin of `benchmark_model`
+    'DEVICE_SERIAL': '',  # serial id of the device. set to '' if there is only one device connected to your host
+})
+```
+
+### Modified Build for TFLite GPU
+
+TODO
+
+## VPU Guide
+
+### Prerequisits
+
+#### OpenVINO
+
+Follow [OpenVINO Installation Guide](https://docs.openvinotoolkit.org/latest/installation_guides.html) to install openvino on your host.
+
+#### Python Environments
+
+Because some tools for VPU use a different tensorflow and python version from nn_meter, so you need to provide seperate environments for the main tool and VPU. We recommend to use [virtualenv](https://virtualenv.pypa.io/en/latest/). We use python3.6 as our test enviroment.
+
+```
+virtualenv openvino_env
+source openvino_env/bin/activate
+pip install -r openvino_env.txt
+deactivate
+```
+
+### Usage
+
+Suppose you place the python environments at `~/openvino_env`.
+
+```python
+backend = get_backend('vpu', {
+    'OPENVINO_ENV': '~/openvino_env',
+    'OPTIMIZER_PATH': '/data/openvino_2019.2.242/deployment_tools/model_optimizer/mo_tf.py',
+    'TMP_DIR': '~/models',
+    'OPENVINO_RUNTIME_DIR': '/data/openvino_2019.2.242/bin',
+    'DEVICE_SERIAL': '/dev/ttyUSB4',
+    'DATA_TYPE': 'FP16',
+})
+```
diff --git a/docs/openvino_requirements.txt b/docs/openvino_requirements.txt
new file mode 100644
index 00000000..f6195c41
--- /dev/null
+++ b/docs/openvino_requirements.txt
@@ -0,0 +1,6 @@
+tensorflow>=1.2.0,<2.0.0
+networkx==2.3.0
+numpy>=1.12.0
+test-generator==0.1.1
+defusedxml>=0.5.0
+serial
diff --git a/docs/rule_builder.md b/docs/rule_builder.md
new file mode 100644
index 00000000..f1b802df
--- /dev/null
+++ b/docs/rule_builder.md
@@ -0,0 +1,141 @@
+# RuleTest Builder
+
+This part generates and profiles models (what we call "test cases") on a given device to get rules.
+
+## End-to-End Demo
+
+```python
+# initialize backend
+backend = get_backend(
+    backend = 'tflite_cpu', 
+    params = {
+        'MODEL_DIR': '/data/jiahang/test_models',
+        'REMOTE_MODEL_DIR': '/mnt/sdcard/tflite_bench',
+        'KERNEL_PATH': '/mnt/sdcard/tflite_bench/kernel.cl',
+        'BENCHMARK_MODEL_PATH': '/data/local/tmp/benchmark_model_fixed_group_size',
+        'DEVICE_SERIAL': '0000028e2c780e4e',
+    }
+)
+
+# generate testcases
+testcases = get_testcases(model_dir='/data/jiahang/test_models')
+
+# run testcases and collect profiling results
+profile_results = run_testcases(backend, testcases)
+
+# determine fusion rules from profiling results
+detect_results = get_fusionrule(profile_results)
+```
+
+`backend` refers to device and framework to execute the model. Currently we support TFLite on CPU, GPU and OpenVINO on VPU. Refer to [backend guide](./backend.md) for how to setup the device and backend.
+
+Note that we provide a consistent API for backend, so you can inherit the `BaseBackend` and implement a backend for your own device that's not included here. 
+
+Also note that it's optional to use a backend. What `run_testcases` do is just collecting latency results of each testcases, so you can use your own tools to measure the latency. Refer to implementation of `run_testcases` for how to fill back the latency.
+
+## Data Structure of TestCases
+
+This is a json dump of generated testcases.
+
+```json
+{
+    "BF_reshape_reshape": {
+        "reshape_1": {
+            "model": "/Users/kalineid/test_models/BF_reshape_reshape_reshape_1",
+            "shapes": [
+                [
+                    28,
+                    28,
+                    16
+                ]
+            ]
+        },
+        "reshape_2": {
+            "model": "/Users/kalineid/test_models/BF_reshape_reshape_reshape_2",
+            "shapes": [
+                [
+                    16,
+                    28,
+                    28
+                ]
+            ]
+        },
+        "block": {
+            "model": "/Users/kalineid/test_models/BF_reshape_reshape_block",
+            "shapes": [
+                [
+                    28,
+                    28,
+                    16
+                ]
+            ]
+        }
+    },
+    "BF_reshape_dwconv": {
+        "reshape": {
+            "model": "/Users/kalineid/test_models/BF_reshape_dwconv_reshape",
+            "shapes": [
+                [
+                    28,
+                    28,
+                    16
+                ]
+            ]
+        },
+        "dwconv": {
+            "model": "/Users/kalineid/test_models/BF_reshape_dwconv_dwconv",
+            "shapes": [
+                [
+                    16,
+                    28,
+                    28
+                ]
+            ]
+        },
+        "block": {
+            "model": "/Users/kalineid/test_models/BF_reshape_dwconv_block",
+            "shapes": [
+                [
+                    28,
+                    28,
+                    16
+                ]
+            ]
+        }
+    },
+    "BF_reshape_relu": {
+        "reshape": {
+            "model": "/Users/kalineid/test_models/BF_reshape_relu_reshape",
+            "shapes": [
+                [
+                    28,
+                    28,
+                    16
+                ]
+            ]
+        },
+        "relu": {
+            "model": "/Users/kalineid/test_models/BF_reshape_relu_relu",
+            "shapes": [
+                [
+                    16,
+                    28,
+                    28
+                ]
+            ]
+        },
+        "block": {
+            "model": "/Users/kalineid/test_models/BF_reshape_relu_block",
+            "shapes": [
+                [
+                    28,
+                    28,
+                    16
+                ]
+            ]
+        }
+    }
+}
+```
+
+`BF_reshape_dwconv` is the name of a rule. It consists of several test models to profile. Here, there are three models called `reshape`, `dwconv` and `block`. For each model, the `model` field is the path to where the model is saved. `shapes` is its inputs. For example, here `[[28, 28, 16]]` means this model has only one input, and the shape is `(28, 28, 16)`.
diff --git a/examples/local_config_example.py b/examples/local_config_example.py
new file mode 100644
index 00000000..e897162a
--- /dev/null
+++ b/examples/local_config_example.py
@@ -0,0 +1,48 @@
+import os
+
+ENABLED = ['MON']
+
+HOME_DIR = os.path.expanduser('~')
+
+BASE_DIR = os.path.dirname(__file__)
+
+BACKENDS = {
+    'tflite_gpu': {
+        'ENGINE': 'backends.tflite_gpu',
+        'PARAMS': {
+            'MODEL_DIR': '/data1/datasets_pad', #os.path.join(HOME_DIR, "benchmarks/models/tflite"),
+            'REMOTE_MODEL_DIR': '/mnt/sdcard/tflite_bench',
+            'KERNEL_PATH': '/mnt/sdcard/tflite_bench/kernel.cl',
+            'BENCHMARK_MODEL_PATH': '/data/local/tmp/benchmark_model_fixed_group_size',
+            'DEVICE_SERIAL': '5e6fecf',
+        },
+        'ENABLED': True,
+    },
+    'tflite_cpu': {
+        'ENGINE': 'backends.tflite_cpu',
+        'PARAMS': {
+            'MODEL_DIR': os.path.join(HOME_DIR, "benchmarks/models/tflite"),
+            'REMOTE_MODEL_DIR': '/mnt/sdcard/tflite_bench',
+            'KERNEL_PATH': '/mnt/sdcard/tflite_bench/kernel.cl',
+            'BENCHMARK_MODEL_PATH': '/data/local/tmp/benchmark_model_fixed_group_size',
+            'DEVICE_SERIAL': '5e6fecf',
+        },
+        'ENABLED': True,
+    },
+    'vpu': {
+        'ENGINE': 'backends.vpu',
+        'PARAMS': {
+            'OPENVINO_ENV': os.path.join(BASE_DIR, 'openvino_env'),
+            'OPTIMIZER_PATH': '/data/openvino_2019.2.242/deployment_tools/model_optimizer/mo_tf.py',
+            'TMP_DIR': os.path.join(HOME_DIR, 'benchmarks/openvino'),
+            'OPENVINO_RUNTIME_DIR': '/data/openvino_2019.2.242/bin',
+            'DEVICE_SERIAL': '/dev/ttyUSB4',
+            'DATA_TYPE': 'FP16',
+        },
+        'ENABLED': False,
+    }
+}
+
+OUTPUT_PATH = './gpuconv-bn-relu-test_tflite_gpu.csv'
+
+DETAIL = True
diff --git a/examples/nn-meter_builder_with_tflite.ipynb b/examples/nn-meter_builder_with_tflite.ipynb
new file mode 100644
index 00000000..4aad6d8d
--- /dev/null
+++ b/examples/nn-meter_builder_with_tflite.ipynb
@@ -0,0 +1,7127 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import warnings\n",
+    "from silence_tensorflow import silence_tensorflow\n",
+    "warnings.filterwarnings('ignore')\n",
+    "silence_tensorflow() \n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from nn_meter.builder import get_backend, get_testcases, run_testcases, get_fusionrule"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<nn_meter.builder.backends.tflite.cpu.CPUBackend object at 0x7fad700f1f28>\n"
+     ]
+    }
+   ],
+   "source": [
+    "# initialize backend\n",
+    "backend = get_backend(\n",
+    "    backend = 'tflite_cpu', \n",
+    "    params = {\n",
+    "        'MODEL_DIR': '/data/jiahang/test_models',\n",
+    "        'REMOTE_MODEL_DIR': '/mnt/sdcard/tflite_bench',\n",
+    "        'KERNEL_PATH': '/mnt/sdcard/tflite_bench/kernel.cl',\n",
+    "        'BENCHMARK_MODEL_PATH': '/data/local/tmp/benchmark_model_fixed_group_size',\n",
+    "        'DEVICE_SERIAL': '0000028e2c780e4e',\n",
+    "    }\n",
+    ")\n",
+    "print(backend)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:absl:Found untraced functions such as conv2d_84_layer_call_and_return_conditional_losses, conv2d_84_layer_call_fn, conv2d_85_layer_call_and_return_conditional_losses, conv2d_85_layer_call_fn, conv2d_84_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_84_layer_call_and_return_conditional_losses, conv2d_84_layer_call_fn, conv2d_85_layer_call_and_return_conditional_losses, conv2d_85_layer_call_fn, conv2d_84_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_86_layer_call_and_return_conditional_losses, conv2d_86_layer_call_fn, conv2d_87_layer_call_and_return_conditional_losses, conv2d_87_layer_call_fn, conv2d_86_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_86_layer_call_and_return_conditional_losses, conv2d_86_layer_call_fn, conv2d_87_layer_call_and_return_conditional_losses, conv2d_87_layer_call_fn, conv2d_86_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    }
+   ],
+   "source": [
+    "# generate testcases\n",
+    "testcases = get_testcases(model_dir='/data/jiahang/test_models')\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpq29fejjw/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpq29fejjw/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmprvyy537x/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmprvyy537x/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyqc2xxym/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyqc2xxym/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpwq2fmoj0/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpwq2fmoj0/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpnfu0fkaq/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpnfu0fkaq/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp2ow3hskw/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp2ow3hskw/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpadv7g_uq/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpadv7g_uq/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_layer_call_and_return_conditional_losses, re_lu_layer_call_fn, re_lu_layer_call_fn, re_lu_layer_call_and_return_conditional_losses, re_lu_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0anz3isa/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0anz3isa/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_layer_call_and_return_conditional_losses, re_lu_layer_call_fn, re_lu_layer_call_fn, re_lu_layer_call_and_return_conditional_losses, re_lu_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa2xb9dcd/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa2xb9dcd/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpky1w4kwh/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpky1w4kwh/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_layer_call_and_return_conditional_losses, add_layer_call_fn, add_layer_call_fn, add_layer_call_and_return_conditional_losses, add_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpl3r9ytds/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpl3r9ytds/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_layer_call_and_return_conditional_losses, add_layer_call_fn, add_layer_call_fn, add_layer_call_and_return_conditional_losses, add_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpsqg4ycwv/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpsqg4ycwv/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp95vgfp8p/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp95vgfp8p/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_layer_call_and_return_conditional_losses, conv2d_layer_call_fn, conv2d_layer_call_fn, conv2d_layer_call_and_return_conditional_losses, conv2d_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp27ezwi9p/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp27ezwi9p/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_layer_call_and_return_conditional_losses, conv2d_layer_call_fn, conv2d_layer_call_fn, conv2d_layer_call_and_return_conditional_losses, conv2d_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppty5umwp/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppty5umwp/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjoyjkggm/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjoyjkggm/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_layer_call_and_return_conditional_losses, concatenate_layer_call_fn, concatenate_layer_call_fn, concatenate_layer_call_and_return_conditional_losses, concatenate_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5n0wc6su/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5n0wc6su/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_layer_call_and_return_conditional_losses, concatenate_layer_call_fn, concatenate_layer_call_fn, concatenate_layer_call_and_return_conditional_losses, concatenate_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpgbiduar8/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpgbiduar8/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa8oblli_/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa8oblli_/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmphz4q8uv1/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmphz4q8uv1/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpr5ow3ndo/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpr5ow3ndo/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpuq2sxs2a/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpuq2sxs2a/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpczngmgsb/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpczngmgsb/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp17loc7ei/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp17loc7ei/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmphlpoe5n2/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmphlpoe5n2/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpvp6g838r/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpvp6g838r/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplby8niw2/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplby8niw2/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp12bdq6g7/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp12bdq6g7/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp8elag3zm/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp8elag3zm/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5lak12sm/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5lak12sm/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp2hgzz9v9/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp2hgzz9v9/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_1_layer_call_and_return_conditional_losses, re_lu_1_layer_call_fn, re_lu_1_layer_call_fn, re_lu_1_layer_call_and_return_conditional_losses, re_lu_1_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx5pdf8w8/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx5pdf8w8/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_1_layer_call_and_return_conditional_losses, re_lu_1_layer_call_fn, re_lu_1_layer_call_fn, re_lu_1_layer_call_and_return_conditional_losses, re_lu_1_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpf55w_8af/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpf55w_8af/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmps4rqlhku/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmps4rqlhku/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_1_layer_call_and_return_conditional_losses, add_1_layer_call_fn, add_1_layer_call_fn, add_1_layer_call_and_return_conditional_losses, add_1_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5ks4cu8q/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5ks4cu8q/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_1_layer_call_and_return_conditional_losses, add_1_layer_call_fn, add_1_layer_call_fn, add_1_layer_call_and_return_conditional_losses, add_1_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpq37f43ey/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpq37f43ey/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg4_gljfh/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg4_gljfh/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_1_layer_call_and_return_conditional_losses, conv2d_1_layer_call_fn, conv2d_1_layer_call_fn, conv2d_1_layer_call_and_return_conditional_losses, conv2d_1_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp3m_pml6h/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp3m_pml6h/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_1_layer_call_and_return_conditional_losses, conv2d_1_layer_call_fn, conv2d_1_layer_call_fn, conv2d_1_layer_call_and_return_conditional_losses, conv2d_1_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp6jsvo62a/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp6jsvo62a/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbnr0bekx/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbnr0bekx/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_1_layer_call_and_return_conditional_losses, concatenate_1_layer_call_fn, concatenate_1_layer_call_fn, concatenate_1_layer_call_and_return_conditional_losses, concatenate_1_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjnrnvre6/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjnrnvre6/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_1_layer_call_and_return_conditional_losses, concatenate_1_layer_call_fn, concatenate_1_layer_call_fn, concatenate_1_layer_call_and_return_conditional_losses, concatenate_1_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp6dt2k_0c/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp6dt2k_0c/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa_ghbp2_/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa_ghbp2_/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmfbm_t2p/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmfbm_t2p/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0lg1leg6/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0lg1leg6/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp36_g1z38/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp36_g1z38/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjpjmy14y/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjpjmy14y/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpolszugs7/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpolszugs7/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_2_layer_call_and_return_conditional_losses, re_lu_2_layer_call_fn, re_lu_2_layer_call_fn, re_lu_2_layer_call_and_return_conditional_losses, re_lu_2_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbkovrcz4/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbkovrcz4/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg5d6qn43/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg5d6qn43/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_2_layer_call_and_return_conditional_losses, re_lu_2_layer_call_fn, re_lu_2_layer_call_fn, re_lu_2_layer_call_and_return_conditional_losses, re_lu_2_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0yvng5ab/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0yvng5ab/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_3_layer_call_and_return_conditional_losses, re_lu_3_layer_call_fn, re_lu_3_layer_call_fn, re_lu_3_layer_call_and_return_conditional_losses, re_lu_3_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpw84b1g4o/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpw84b1g4o/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg6uivawq/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg6uivawq/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_3_layer_call_and_return_conditional_losses, re_lu_3_layer_call_fn, re_lu_3_layer_call_fn, re_lu_3_layer_call_and_return_conditional_losses, re_lu_3_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpobnxosek/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpobnxosek/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_4_layer_call_and_return_conditional_losses, re_lu_4_layer_call_fn, re_lu_4_layer_call_fn, re_lu_4_layer_call_and_return_conditional_losses, re_lu_4_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjsi5_4qb/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjsi5_4qb/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_5_layer_call_and_return_conditional_losses, re_lu_5_layer_call_fn, re_lu_5_layer_call_fn, re_lu_5_layer_call_and_return_conditional_losses, re_lu_5_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmps6635x4u/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmps6635x4u/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_4_layer_call_and_return_conditional_losses, re_lu_4_layer_call_fn, re_lu_5_layer_call_and_return_conditional_losses, re_lu_5_layer_call_fn, re_lu_4_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpxgavmhp3/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpxgavmhp3/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_6_layer_call_and_return_conditional_losses, re_lu_6_layer_call_fn, re_lu_6_layer_call_fn, re_lu_6_layer_call_and_return_conditional_losses, re_lu_6_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplp50uu_g/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplp50uu_g/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_2_layer_call_and_return_conditional_losses, add_2_layer_call_fn, add_2_layer_call_fn, add_2_layer_call_and_return_conditional_losses, add_2_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpzhqoth6y/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpzhqoth6y/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_6_layer_call_and_return_conditional_losses, re_lu_6_layer_call_fn, add_2_layer_call_and_return_conditional_losses, add_2_layer_call_fn, re_lu_6_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpnn4xgbze/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpnn4xgbze/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_7_layer_call_and_return_conditional_losses, re_lu_7_layer_call_fn, re_lu_7_layer_call_fn, re_lu_7_layer_call_and_return_conditional_losses, re_lu_7_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmkq9y5tg/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmkq9y5tg/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_2_layer_call_and_return_conditional_losses, conv2d_2_layer_call_fn, conv2d_2_layer_call_fn, conv2d_2_layer_call_and_return_conditional_losses, conv2d_2_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5uxn4e4_/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5uxn4e4_/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_7_layer_call_and_return_conditional_losses, re_lu_7_layer_call_fn, conv2d_2_layer_call_and_return_conditional_losses, conv2d_2_layer_call_fn, re_lu_7_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp3s_kb0r9/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp3s_kb0r9/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_8_layer_call_and_return_conditional_losses, re_lu_8_layer_call_fn, re_lu_8_layer_call_fn, re_lu_8_layer_call_and_return_conditional_losses, re_lu_8_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppfuyq2db/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppfuyq2db/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_2_layer_call_and_return_conditional_losses, concatenate_2_layer_call_fn, concatenate_2_layer_call_fn, concatenate_2_layer_call_and_return_conditional_losses, concatenate_2_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpagbb18tc/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpagbb18tc/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_8_layer_call_and_return_conditional_losses, re_lu_8_layer_call_fn, concatenate_2_layer_call_and_return_conditional_losses, concatenate_2_layer_call_fn, re_lu_8_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpm1lv1ixe/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpm1lv1ixe/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_9_layer_call_and_return_conditional_losses, re_lu_9_layer_call_fn, re_lu_9_layer_call_fn, re_lu_9_layer_call_and_return_conditional_losses, re_lu_9_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp712t3raz/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp712t3raz/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpki9u4bm5/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpki9u4bm5/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_9_layer_call_and_return_conditional_losses, re_lu_9_layer_call_fn, re_lu_9_layer_call_fn, re_lu_9_layer_call_and_return_conditional_losses, re_lu_9_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_xldjstr/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_xldjstr/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_10_layer_call_and_return_conditional_losses, re_lu_10_layer_call_fn, re_lu_10_layer_call_fn, re_lu_10_layer_call_and_return_conditional_losses, re_lu_10_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpf34q6gsx/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpf34q6gsx/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_layer_call_and_return_conditional_losses, dense_layer_call_fn, dense_layer_call_fn, dense_layer_call_and_return_conditional_losses, dense_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5rqypqd_/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5rqypqd_/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_10_layer_call_and_return_conditional_losses, re_lu_10_layer_call_fn, dense_layer_call_and_return_conditional_losses, dense_layer_call_fn, re_lu_10_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbk3sxiuj/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbk3sxiuj/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_11_layer_call_and_return_conditional_losses, re_lu_11_layer_call_fn, re_lu_11_layer_call_fn, re_lu_11_layer_call_and_return_conditional_losses, re_lu_11_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0q6nccp9/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0q6nccp9/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpptz8zox_/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpptz8zox_/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_11_layer_call_and_return_conditional_losses, re_lu_11_layer_call_fn, re_lu_11_layer_call_fn, re_lu_11_layer_call_and_return_conditional_losses, re_lu_11_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp97m50eog/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp97m50eog/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_3_layer_call_and_return_conditional_losses, add_3_layer_call_fn, add_3_layer_call_fn, add_3_layer_call_and_return_conditional_losses, add_3_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpp_e83aqn/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpp_e83aqn/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdvr4gng2/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdvr4gng2/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_3_layer_call_and_return_conditional_losses, add_3_layer_call_fn, add_3_layer_call_fn, add_3_layer_call_and_return_conditional_losses, add_3_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_bkjlwt6/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_bkjlwt6/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_4_layer_call_and_return_conditional_losses, add_4_layer_call_fn, add_4_layer_call_fn, add_4_layer_call_and_return_conditional_losses, add_4_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpds0eyl34/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpds0eyl34/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpj_1izw6j/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpj_1izw6j/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_4_layer_call_and_return_conditional_losses, add_4_layer_call_fn, add_4_layer_call_fn, add_4_layer_call_and_return_conditional_losses, add_4_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpgfusbe8x/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpgfusbe8x/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_5_layer_call_and_return_conditional_losses, add_5_layer_call_fn, add_5_layer_call_fn, add_5_layer_call_and_return_conditional_losses, add_5_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5_k2074q/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5_k2074q/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_12_layer_call_and_return_conditional_losses, re_lu_12_layer_call_fn, re_lu_12_layer_call_fn, re_lu_12_layer_call_and_return_conditional_losses, re_lu_12_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp9dfp1m90/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp9dfp1m90/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_5_layer_call_and_return_conditional_losses, add_5_layer_call_fn, re_lu_12_layer_call_and_return_conditional_losses, re_lu_12_layer_call_fn, add_5_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmvcnk9ui/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmvcnk9ui/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_6_layer_call_and_return_conditional_losses, add_6_layer_call_fn, add_6_layer_call_fn, add_6_layer_call_and_return_conditional_losses, add_6_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpgm6dn0xj/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpgm6dn0xj/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_7_layer_call_and_return_conditional_losses, add_7_layer_call_fn, add_7_layer_call_fn, add_7_layer_call_and_return_conditional_losses, add_7_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpq5bgl5e4/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpq5bgl5e4/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1, inputs/2 with unsupported characters which will be renamed to inputs_0, inputs_1, inputs_2 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_6_layer_call_and_return_conditional_losses, add_6_layer_call_fn, add_7_layer_call_and_return_conditional_losses, add_7_layer_call_fn, add_6_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx081i295/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx081i295/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_8_layer_call_and_return_conditional_losses, add_8_layer_call_fn, add_8_layer_call_fn, add_8_layer_call_and_return_conditional_losses, add_8_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyq6prtud/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyq6prtud/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_3_layer_call_and_return_conditional_losses, conv2d_3_layer_call_fn, conv2d_3_layer_call_fn, conv2d_3_layer_call_and_return_conditional_losses, conv2d_3_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpkxztb0kk/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpkxztb0kk/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_8_layer_call_and_return_conditional_losses, add_8_layer_call_fn, conv2d_3_layer_call_and_return_conditional_losses, conv2d_3_layer_call_fn, add_8_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpz4e_ahex/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpz4e_ahex/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_9_layer_call_and_return_conditional_losses, add_9_layer_call_fn, add_9_layer_call_fn, add_9_layer_call_and_return_conditional_losses, add_9_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpitt6mm3y/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpitt6mm3y/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_3_layer_call_and_return_conditional_losses, concatenate_3_layer_call_fn, concatenate_3_layer_call_fn, concatenate_3_layer_call_and_return_conditional_losses, concatenate_3_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5hxvv7rz/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp5hxvv7rz/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1, inputs/2 with unsupported characters which will be renamed to inputs_0, inputs_1, inputs_2 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_9_layer_call_and_return_conditional_losses, add_9_layer_call_fn, concatenate_3_layer_call_and_return_conditional_losses, concatenate_3_layer_call_fn, add_9_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpelc789jt/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpelc789jt/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_10_layer_call_and_return_conditional_losses, add_10_layer_call_fn, add_10_layer_call_fn, add_10_layer_call_and_return_conditional_losses, add_10_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplxiq1kjr/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplxiq1kjr/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmptqnf6vqq/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmptqnf6vqq/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_10_layer_call_and_return_conditional_losses, add_10_layer_call_fn, add_10_layer_call_fn, add_10_layer_call_and_return_conditional_losses, add_10_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4m7gz2vh/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4m7gz2vh/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_11_layer_call_and_return_conditional_losses, add_11_layer_call_fn, add_11_layer_call_fn, add_11_layer_call_and_return_conditional_losses, add_11_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpu42m0_tr/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpu42m0_tr/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_1_layer_call_and_return_conditional_losses, dense_1_layer_call_fn, dense_1_layer_call_fn, dense_1_layer_call_and_return_conditional_losses, dense_1_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpoculikjp/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpoculikjp/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_11_layer_call_and_return_conditional_losses, add_11_layer_call_fn, dense_1_layer_call_and_return_conditional_losses, dense_1_layer_call_fn, add_11_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp73dk6aax/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp73dk6aax/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_12_layer_call_and_return_conditional_losses, add_12_layer_call_fn, add_12_layer_call_fn, add_12_layer_call_and_return_conditional_losses, add_12_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpecy0xh3b/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpecy0xh3b/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpth2taeys/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpth2taeys/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_12_layer_call_and_return_conditional_losses, add_12_layer_call_fn, add_12_layer_call_fn, add_12_layer_call_and_return_conditional_losses, add_12_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpeafj_0ku/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpeafj_0ku/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_4_layer_call_and_return_conditional_losses, conv2d_4_layer_call_fn, conv2d_4_layer_call_fn, conv2d_4_layer_call_and_return_conditional_losses, conv2d_4_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmzqna9r0/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmzqna9r0/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_a8ml1xb/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_a8ml1xb/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_4_layer_call_and_return_conditional_losses, conv2d_4_layer_call_fn, conv2d_4_layer_call_fn, conv2d_4_layer_call_and_return_conditional_losses, conv2d_4_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmcq7fcd9/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmcq7fcd9/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_5_layer_call_and_return_conditional_losses, conv2d_5_layer_call_fn, conv2d_5_layer_call_fn, conv2d_5_layer_call_and_return_conditional_losses, conv2d_5_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpnjm5mx5c/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpnjm5mx5c/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpoj6hpsfp/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpoj6hpsfp/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_5_layer_call_and_return_conditional_losses, conv2d_5_layer_call_fn, conv2d_5_layer_call_fn, conv2d_5_layer_call_and_return_conditional_losses, conv2d_5_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpaubgh9ct/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpaubgh9ct/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_6_layer_call_and_return_conditional_losses, conv2d_6_layer_call_fn, conv2d_6_layer_call_fn, conv2d_6_layer_call_and_return_conditional_losses, conv2d_6_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplrf3uoi6/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplrf3uoi6/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_13_layer_call_and_return_conditional_losses, re_lu_13_layer_call_fn, re_lu_13_layer_call_fn, re_lu_13_layer_call_and_return_conditional_losses, re_lu_13_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_9s62lys/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_9s62lys/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_6_layer_call_and_return_conditional_losses, conv2d_6_layer_call_fn, re_lu_13_layer_call_and_return_conditional_losses, re_lu_13_layer_call_fn, conv2d_6_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp2hqp619y/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp2hqp619y/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_7_layer_call_and_return_conditional_losses, conv2d_7_layer_call_fn, conv2d_7_layer_call_fn, conv2d_7_layer_call_and_return_conditional_losses, conv2d_7_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpxiozu5jr/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpxiozu5jr/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_13_layer_call_and_return_conditional_losses, add_13_layer_call_fn, add_13_layer_call_fn, add_13_layer_call_and_return_conditional_losses, add_13_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdph0qwwx/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdph0qwwx/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_7_layer_call_and_return_conditional_losses, conv2d_7_layer_call_fn, add_13_layer_call_and_return_conditional_losses, add_13_layer_call_fn, conv2d_7_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyrif0v63/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyrif0v63/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_8_layer_call_and_return_conditional_losses, conv2d_8_layer_call_fn, conv2d_8_layer_call_fn, conv2d_8_layer_call_and_return_conditional_losses, conv2d_8_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppyxy_pdf/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppyxy_pdf/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_9_layer_call_and_return_conditional_losses, conv2d_9_layer_call_fn, conv2d_9_layer_call_fn, conv2d_9_layer_call_and_return_conditional_losses, conv2d_9_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjcm1cli3/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjcm1cli3/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_8_layer_call_and_return_conditional_losses, conv2d_8_layer_call_fn, conv2d_9_layer_call_and_return_conditional_losses, conv2d_9_layer_call_fn, conv2d_8_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp8kawcf9_/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp8kawcf9_/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_10_layer_call_and_return_conditional_losses, conv2d_10_layer_call_fn, conv2d_10_layer_call_fn, conv2d_10_layer_call_and_return_conditional_losses, conv2d_10_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppjla97ze/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppjla97ze/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_4_layer_call_and_return_conditional_losses, concatenate_4_layer_call_fn, concatenate_4_layer_call_fn, concatenate_4_layer_call_and_return_conditional_losses, concatenate_4_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdhy1vn6u/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdhy1vn6u/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_10_layer_call_and_return_conditional_losses, conv2d_10_layer_call_fn, concatenate_4_layer_call_and_return_conditional_losses, concatenate_4_layer_call_fn, conv2d_10_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmptaf0nxmj/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmptaf0nxmj/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_11_layer_call_and_return_conditional_losses, conv2d_11_layer_call_fn, conv2d_11_layer_call_fn, conv2d_11_layer_call_and_return_conditional_losses, conv2d_11_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmh3ckajn/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmh3ckajn/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyadf_qff/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyadf_qff/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_11_layer_call_and_return_conditional_losses, conv2d_11_layer_call_fn, conv2d_11_layer_call_fn, conv2d_11_layer_call_and_return_conditional_losses, conv2d_11_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp9zf9vtav/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp9zf9vtav/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_12_layer_call_and_return_conditional_losses, conv2d_12_layer_call_fn, conv2d_12_layer_call_fn, conv2d_12_layer_call_and_return_conditional_losses, conv2d_12_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpe5q3wj4s/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpe5q3wj4s/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmphf5m6qgi/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmphf5m6qgi/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_12_layer_call_and_return_conditional_losses, conv2d_12_layer_call_fn, conv2d_12_layer_call_fn, conv2d_12_layer_call_and_return_conditional_losses, conv2d_12_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_43_5x_1/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_43_5x_1/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_5_layer_call_and_return_conditional_losses, concatenate_5_layer_call_fn, concatenate_5_layer_call_fn, concatenate_5_layer_call_and_return_conditional_losses, concatenate_5_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpw8mdcp9c/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpw8mdcp9c/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplbp4b6d_/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmplbp4b6d_/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_5_layer_call_and_return_conditional_losses, concatenate_5_layer_call_fn, concatenate_5_layer_call_fn, concatenate_5_layer_call_and_return_conditional_losses, concatenate_5_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp6q904uuo/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp6q904uuo/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_6_layer_call_and_return_conditional_losses, concatenate_6_layer_call_fn, concatenate_6_layer_call_fn, concatenate_6_layer_call_and_return_conditional_losses, concatenate_6_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpkzp1a7ia/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpkzp1a7ia/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpsd2ty359/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpsd2ty359/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_6_layer_call_and_return_conditional_losses, concatenate_6_layer_call_fn, concatenate_6_layer_call_fn, concatenate_6_layer_call_and_return_conditional_losses, concatenate_6_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7oxatp5v/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7oxatp5v/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_7_layer_call_and_return_conditional_losses, concatenate_7_layer_call_fn, concatenate_7_layer_call_fn, concatenate_7_layer_call_and_return_conditional_losses, concatenate_7_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp42rt_i5j/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp42rt_i5j/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_14_layer_call_and_return_conditional_losses, re_lu_14_layer_call_fn, re_lu_14_layer_call_fn, re_lu_14_layer_call_and_return_conditional_losses, re_lu_14_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7fbv73c5/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7fbv73c5/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_7_layer_call_and_return_conditional_losses, concatenate_7_layer_call_fn, re_lu_14_layer_call_and_return_conditional_losses, re_lu_14_layer_call_fn, concatenate_7_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpcoii67qt/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpcoii67qt/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_8_layer_call_and_return_conditional_losses, concatenate_8_layer_call_fn, concatenate_8_layer_call_fn, concatenate_8_layer_call_and_return_conditional_losses, concatenate_8_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpk4zv9pua/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpk4zv9pua/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_14_layer_call_and_return_conditional_losses, add_14_layer_call_fn, add_14_layer_call_fn, add_14_layer_call_and_return_conditional_losses, add_14_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpci9r9ixr/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpci9r9ixr/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1, inputs/2 with unsupported characters which will be renamed to inputs_0, inputs_1, inputs_2 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_8_layer_call_and_return_conditional_losses, concatenate_8_layer_call_fn, add_14_layer_call_and_return_conditional_losses, add_14_layer_call_fn, concatenate_8_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpzlz_a9y7/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpzlz_a9y7/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_9_layer_call_and_return_conditional_losses, concatenate_9_layer_call_fn, concatenate_9_layer_call_fn, concatenate_9_layer_call_and_return_conditional_losses, concatenate_9_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7yrcjx41/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7yrcjx41/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_13_layer_call_and_return_conditional_losses, conv2d_13_layer_call_fn, conv2d_13_layer_call_fn, conv2d_13_layer_call_and_return_conditional_losses, conv2d_13_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpn81o_zv1/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpn81o_zv1/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_9_layer_call_and_return_conditional_losses, concatenate_9_layer_call_fn, conv2d_13_layer_call_and_return_conditional_losses, conv2d_13_layer_call_fn, concatenate_9_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_m54tmxe/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_m54tmxe/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_10_layer_call_and_return_conditional_losses, concatenate_10_layer_call_fn, concatenate_10_layer_call_fn, concatenate_10_layer_call_and_return_conditional_losses, concatenate_10_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpxxpgi54q/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpxxpgi54q/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_11_layer_call_and_return_conditional_losses, concatenate_11_layer_call_fn, concatenate_11_layer_call_fn, concatenate_11_layer_call_and_return_conditional_losses, concatenate_11_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpe81vptbs/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpe81vptbs/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1, inputs/2 with unsupported characters which will be renamed to inputs_0, inputs_1, inputs_2 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_10_layer_call_and_return_conditional_losses, concatenate_10_layer_call_fn, concatenate_11_layer_call_and_return_conditional_losses, concatenate_11_layer_call_fn, concatenate_10_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpexn7vulm/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpexn7vulm/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_12_layer_call_and_return_conditional_losses, concatenate_12_layer_call_fn, concatenate_12_layer_call_fn, concatenate_12_layer_call_and_return_conditional_losses, concatenate_12_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpafq7vs_q/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpafq7vs_q/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpagfw6ymz/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpagfw6ymz/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_12_layer_call_and_return_conditional_losses, concatenate_12_layer_call_fn, concatenate_12_layer_call_fn, concatenate_12_layer_call_and_return_conditional_losses, concatenate_12_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpn7e9aubg/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpn7e9aubg/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_13_layer_call_and_return_conditional_losses, concatenate_13_layer_call_fn, concatenate_13_layer_call_fn, concatenate_13_layer_call_and_return_conditional_losses, concatenate_13_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp2ya0_vby/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp2ya0_vby/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_2_layer_call_and_return_conditional_losses, dense_2_layer_call_fn, dense_2_layer_call_fn, dense_2_layer_call_and_return_conditional_losses, dense_2_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp057lz9de/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp057lz9de/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_13_layer_call_and_return_conditional_losses, concatenate_13_layer_call_fn, dense_2_layer_call_and_return_conditional_losses, dense_2_layer_call_fn, concatenate_13_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4y1luc4l/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4y1luc4l/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_14_layer_call_and_return_conditional_losses, concatenate_14_layer_call_fn, concatenate_14_layer_call_fn, concatenate_14_layer_call_and_return_conditional_losses, concatenate_14_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp28c1mdcg/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp28c1mdcg/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpzgguxkdk/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpzgguxkdk/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_14_layer_call_and_return_conditional_losses, concatenate_14_layer_call_fn, concatenate_14_layer_call_fn, concatenate_14_layer_call_and_return_conditional_losses, concatenate_14_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpk6vlat3d/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpk6vlat3d/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpuds4ham7/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpuds4ham7/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_9jwoj80/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp_9jwoj80/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpajkmuxuj/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpajkmuxuj/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpta9n04ew/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpta9n04ew/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpkuiax1tl/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpkuiax1tl/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa95bjj6w/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa95bjj6w/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpfn_tox2p/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpfn_tox2p/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_15_layer_call_and_return_conditional_losses, re_lu_15_layer_call_fn, re_lu_15_layer_call_fn, re_lu_15_layer_call_and_return_conditional_losses, re_lu_15_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpedxupt7c/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpedxupt7c/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_15_layer_call_and_return_conditional_losses, re_lu_15_layer_call_fn, re_lu_15_layer_call_fn, re_lu_15_layer_call_and_return_conditional_losses, re_lu_15_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp12vpe3va/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp12vpe3va/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbemw16pj/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbemw16pj/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_15_layer_call_and_return_conditional_losses, add_15_layer_call_fn, add_15_layer_call_fn, add_15_layer_call_and_return_conditional_losses, add_15_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpd634wafk/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpd634wafk/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_15_layer_call_and_return_conditional_losses, add_15_layer_call_fn, add_15_layer_call_fn, add_15_layer_call_and_return_conditional_losses, add_15_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp88pd8gks/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp88pd8gks/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpuc_6o18j/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpuc_6o18j/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_14_layer_call_and_return_conditional_losses, conv2d_14_layer_call_fn, conv2d_14_layer_call_fn, conv2d_14_layer_call_and_return_conditional_losses, conv2d_14_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpudzd9w0h/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpudzd9w0h/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_14_layer_call_and_return_conditional_losses, conv2d_14_layer_call_fn, conv2d_14_layer_call_fn, conv2d_14_layer_call_and_return_conditional_losses, conv2d_14_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpfhhpxjaz/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpfhhpxjaz/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppa0i4l6n/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmppa0i4l6n/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_15_layer_call_and_return_conditional_losses, concatenate_15_layer_call_fn, concatenate_15_layer_call_fn, concatenate_15_layer_call_and_return_conditional_losses, concatenate_15_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp38k32idw/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp38k32idw/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_15_layer_call_and_return_conditional_losses, concatenate_15_layer_call_fn, concatenate_15_layer_call_fn, concatenate_15_layer_call_and_return_conditional_losses, concatenate_15_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4f_6w4n0/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4f_6w4n0/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpwa0xvra7/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpwa0xvra7/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpi74t2oeh/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpi74t2oeh/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa__vizmq/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa__vizmq/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx3lrkey3/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx3lrkey3/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpsk1iv6xr/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpsk1iv6xr/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpss4iko0d/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpss4iko0d/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_3_layer_call_and_return_conditional_losses, dense_3_layer_call_fn, dense_3_layer_call_fn, dense_3_layer_call_and_return_conditional_losses, dense_3_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpoalzrfe3/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpoalzrfe3/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_16_layer_call_and_return_conditional_losses, re_lu_16_layer_call_fn, re_lu_16_layer_call_fn, re_lu_16_layer_call_and_return_conditional_losses, re_lu_16_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpzo95ky2f/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpzo95ky2f/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_3_layer_call_and_return_conditional_losses, dense_3_layer_call_fn, re_lu_16_layer_call_and_return_conditional_losses, re_lu_16_layer_call_fn, dense_3_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpp_ydo3e3/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpp_ydo3e3/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_4_layer_call_and_return_conditional_losses, dense_4_layer_call_fn, dense_4_layer_call_fn, dense_4_layer_call_and_return_conditional_losses, dense_4_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpf3twxrcf/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpf3twxrcf/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_16_layer_call_and_return_conditional_losses, add_16_layer_call_fn, add_16_layer_call_fn, add_16_layer_call_and_return_conditional_losses, add_16_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa2j_egw0/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa2j_egw0/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as dense_4_layer_call_and_return_conditional_losses, dense_4_layer_call_fn, add_16_layer_call_and_return_conditional_losses, add_16_layer_call_fn, dense_4_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4pcdwac0/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4pcdwac0/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_5_layer_call_and_return_conditional_losses, dense_5_layer_call_fn, dense_5_layer_call_fn, dense_5_layer_call_and_return_conditional_losses, dense_5_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpw7s1cb11/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpw7s1cb11/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_16_layer_call_and_return_conditional_losses, concatenate_16_layer_call_fn, concatenate_16_layer_call_fn, concatenate_16_layer_call_and_return_conditional_losses, concatenate_16_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmptpm3lpe4/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmptpm3lpe4/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as dense_5_layer_call_and_return_conditional_losses, dense_5_layer_call_fn, concatenate_16_layer_call_and_return_conditional_losses, concatenate_16_layer_call_fn, dense_5_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7l8rro5c/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7l8rro5c/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_6_layer_call_and_return_conditional_losses, dense_6_layer_call_fn, dense_6_layer_call_fn, dense_6_layer_call_and_return_conditional_losses, dense_6_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7kz8dhoh/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp7kz8dhoh/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_7_layer_call_and_return_conditional_losses, dense_7_layer_call_fn, dense_7_layer_call_fn, dense_7_layer_call_and_return_conditional_losses, dense_7_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpez9eubys/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpez9eubys/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as dense_6_layer_call_and_return_conditional_losses, dense_6_layer_call_fn, dense_7_layer_call_and_return_conditional_losses, dense_7_layer_call_fn, dense_6_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbbq0rsvq/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpbbq0rsvq/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpm7i13_ui/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpm7i13_ui/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpfgss4qza/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpfgss4qza/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx8ogu_7a/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx8ogu_7a/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg99ovuqx/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg99ovuqx/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmph_c37syc/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmph_c37syc/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmt9onp6d/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmt9onp6d/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4um4acgx/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4um4acgx/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_17_layer_call_and_return_conditional_losses, re_lu_17_layer_call_fn, re_lu_17_layer_call_fn, re_lu_17_layer_call_and_return_conditional_losses, re_lu_17_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpf51pw86a/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpf51pw86a/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_17_layer_call_and_return_conditional_losses, re_lu_17_layer_call_fn, re_lu_17_layer_call_fn, re_lu_17_layer_call_and_return_conditional_losses, re_lu_17_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpon9yziig/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpon9yziig/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpd482my3t/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpd482my3t/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_17_layer_call_and_return_conditional_losses, add_17_layer_call_fn, add_17_layer_call_fn, add_17_layer_call_and_return_conditional_losses, add_17_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpiy54m_lm/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpiy54m_lm/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as add_17_layer_call_and_return_conditional_losses, add_17_layer_call_fn, add_17_layer_call_fn, add_17_layer_call_and_return_conditional_losses, add_17_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpqyn9rq8r/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpqyn9rq8r/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpkeq4y24b/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpkeq4y24b/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_15_layer_call_and_return_conditional_losses, conv2d_15_layer_call_fn, conv2d_15_layer_call_fn, conv2d_15_layer_call_and_return_conditional_losses, conv2d_15_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp3a2ytdil/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp3a2ytdil/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_15_layer_call_and_return_conditional_losses, conv2d_15_layer_call_fn, conv2d_15_layer_call_fn, conv2d_15_layer_call_and_return_conditional_losses, conv2d_15_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa_6ubwof/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpa_6ubwof/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp1dsp0da4/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp1dsp0da4/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_17_layer_call_and_return_conditional_losses, concatenate_17_layer_call_fn, concatenate_17_layer_call_fn, concatenate_17_layer_call_and_return_conditional_losses, concatenate_17_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmhpjkfdm/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpmhpjkfdm/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Function `_wrapped_model` contains input name(s) inputs/0, inputs/1 with unsupported characters which will be renamed to inputs_0, inputs_1 in the SavedModel.\n",
+      "WARNING:absl:Found untraced functions such as concatenate_17_layer_call_and_return_conditional_losses, concatenate_17_layer_call_fn, concatenate_17_layer_call_fn, concatenate_17_layer_call_and_return_conditional_losses, concatenate_17_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpot5x_slc/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpot5x_slc/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpu1l3ilq1/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpu1l3ilq1/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpysgcgms1/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpysgcgms1/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjt382ylx/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpjt382ylx/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpw6k00qm7/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpw6k00qm7/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0plkuz47/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp0plkuz47/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4qk01wgd/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp4qk01wgd/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_16_layer_call_and_return_conditional_losses, conv2d_16_layer_call_fn, conv2d_16_layer_call_fn, conv2d_16_layer_call_and_return_conditional_losses, conv2d_16_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp3cf3zcpn/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp3cf3zcpn/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpuqpuoqon/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpuqpuoqon/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_16_layer_call_and_return_conditional_losses, conv2d_16_layer_call_fn, conv2d_16_layer_call_fn, conv2d_16_layer_call_and_return_conditional_losses, conv2d_16_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg3qctmoy/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpg3qctmoy/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_17_layer_call_and_return_conditional_losses, conv2d_17_layer_call_fn, conv2d_17_layer_call_fn, conv2d_17_layer_call_and_return_conditional_losses, conv2d_17_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx9nwhy1q/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpx9nwhy1q/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_18_layer_call_and_return_conditional_losses, conv2d_18_layer_call_fn, conv2d_19_layer_call_and_return_conditional_losses, conv2d_19_layer_call_fn, conv2d_18_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmprl1cel2j/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmprl1cel2j/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_17_layer_call_and_return_conditional_losses, conv2d_17_layer_call_fn, conv2d_17_layer_call_fn, conv2d_17_layer_call_and_return_conditional_losses, conv2d_17_layer_call_and_return_conditional_losses while saving (showing 5 of 15). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmphtjpri5v/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmphtjpri5v/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as conv2d_20_layer_call_and_return_conditional_losses, conv2d_20_layer_call_fn, conv2d_21_layer_call_and_return_conditional_losses, conv2d_21_layer_call_fn, conv2d_20_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyqhv_mwl/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpyqhv_mwl/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_18_layer_call_and_return_conditional_losses, re_lu_18_layer_call_fn, re_lu_18_layer_call_fn, re_lu_18_layer_call_and_return_conditional_losses, re_lu_18_layer_call_and_return_conditional_losses while saving (showing 5 of 5). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpi5xcbfim/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpi5xcbfim/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+      "WARNING:absl:Found untraced functions such as re_lu_18_layer_call_and_return_conditional_losses, re_lu_18_layer_call_fn, conv2d_20_layer_call_and_return_conditional_losses, conv2d_20_layer_call_fn, conv2d_21_layer_call_and_return_conditional_losses while saving (showing 5 of 15). These functions will not be directly callable after loading.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpb1uiopl1/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpb1uiopl1/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpgljf9bv7/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpgljf9bv7/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpz_smfius/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpz_smfius/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpt0otvyc8/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpt0otvyc8/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpet7vc4yp/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpet7vc4yp/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpli8b96hx/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpli8b96hx/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpr336343v/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpr336343v/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpwdpuwpz3/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpwdpuwpz3/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdrrn8o4r/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdrrn8o4r/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdkcnxwrg/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpdkcnxwrg/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp6uual7j2/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp6uual7j2/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpd0m9v_ro/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmpd0m9v_ro/assets\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp1yz3td42/assets\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tensorflow:Assets written to: /tmp/tmp1yz3td42/assets\n",
+      "/home/jiahang/.conda/envs/py36-Jiahang/lib/python3.6/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
+      "  category=CustomMaskWarning)\n"
+     ]
+    }
+   ],
+   "source": [
+    "# run testcases and collect profiling results\n",
+    "profile_results = run_testcases(backend, testcases)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# determine fusion rules from profiling results\n",
+    "detect_results = get_fusionrule(profile_results)\n",
+    "\n"
+   ]
+  }
+ ],
+ "metadata": {
+  "interpreter": {
+   "hash": "e8b26d4e88bfd67f05264bddcd3043513b547d3c68498482ebbb5473451a395f"
+  },
+  "kernelspec": {
+   "display_name": "Python 3.6.10 64-bit ('py36-Jiahang': conda)",
+   "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.10"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/nn_meter/builder/__init__.py b/nn_meter/builder/__init__.py
new file mode 100644
index 00000000..f061cd61
--- /dev/null
+++ b/nn_meter/builder/__init__.py
@@ -0,0 +1,11 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .nn_meter_builder import (
+    get_testcases,
+    run_testcases,
+    get_fusionrule
+)
+from .rule_tester import config
+from .backends import get_backend
+from .rule_tester import RuleTester
+from .utils.utils import dump_testcases, read_testcases
diff --git a/nn_meter/builder/backends/__init__.py b/nn_meter/builder/backends/__init__.py
new file mode 100644
index 00000000..857edc5a
--- /dev/null
+++ b/nn_meter/builder/backends/__init__.py
@@ -0,0 +1,19 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .tflite import (
+    TFLiteBackend,
+    TFLiteRunner,
+    CPUBackend,
+    GPUBackend
+)
+from .openvino import (
+    OpenVINOBackend,
+    OpenVINORunner,
+    VPUBackend
+)
+from .interface import (
+    BaseBackend,
+    ProfileResults,
+    register_backend,
+    get_backend
+)
diff --git a/nn_meter/builder/backends/interface.py b/nn_meter/builder/backends/interface.py
new file mode 100644
index 00000000..9c637a5a
--- /dev/null
+++ b/nn_meter/builder/backends/interface.py
@@ -0,0 +1,154 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import importlib
+from typing import List
+import tensorflow as tf
+
+from nn_meter.builder.utils.latency import Latency
+from nn_meter.utils.path import get_filename_without_ext
+
+
+BACKENDS_PATH = {
+    'tflite_gpu': ['nn_meter.builder.backends', 'GPUBackend'],
+    'tflite_cpu': ['nn_meter.builder.backends', 'CPUBackend'],
+    'openvino_vpu': ['nn_meter.builder.backends', 'VPUBackend'],
+}
+
+
+class ProfileResults:
+    """
+    @params:
+    - results: Dict
+        The profiled results, with Dict key to be the metric name
+         # peak power/memory, energy, power
+    """
+    def __init__(self, results=None):
+        self.data = {}
+        for metric, value in results.items():
+            self.data[metric] = value
+    
+    def set(self, metric, value):
+        self.data[metric] = value
+
+    def get(self, metrics):
+        ''' Get metric value by calling the name of the metric
+        '''
+        if not isinstance(metrics, List):
+            metrics = [metrics]
+        result = ProfileResults()
+        for metric in metrics:
+            if metric in self.data:
+                result.set(metric, self.data[metric])
+            else:
+                raise AttributeError(f"Unsupported metric {metric}.")
+        return result
+
+
+class BaseBackend:
+    """
+    The basic class 
+    
+    TODO"""
+    parser_class = None
+    runner_class = None
+
+    def __init__(self, params):
+        """[summary]
+
+        Args:
+            params ([type]): [description]
+        """
+        self.params = params
+        self.get_params()
+        self.parser = self.parser_class(**self.parser_kwargs)
+        self.runner = self.runner_class(**self.runner_kwargs)
+
+    def get_params(self):
+        """[summary]
+        """
+        self.parser_kwargs = {}
+        self.runner_kwargs = {}
+
+    def profile(self, model, model_name, input_shape=None, metrics=[]):
+        """[summary]
+
+        Args:
+            model ([type]): [description]
+            model_name ([type]): [description]
+            input_shape ([type], optional): [description]. Defaults to None.
+            metrics (list, optional): [description]. Defaults to [].
+
+        Raises:
+            NotImplementedError: [description]
+        """
+        raise NotImplementedError
+
+    def profile_model_file(self, model_path, shapes=None):
+        """[summary]
+
+        Args:
+            model_path ([type]): [description]
+            shapes ([type], optional): [description]. Defaults to None.
+
+        Returns:
+            [type]: [description]
+        """
+        model_name = get_filename_without_ext(model_path)
+        model = tf.keras.models.load_model(model_path)
+        return self.profile(model, model_name, shapes)
+
+    def test_connection(self):
+        """[summary]
+        """
+        # TODO: test the connection (open/close/check_healthy)
+        # add command line interface: nn-meter device/backend test
+        pass
+
+
+def get_backend(backend, params):
+    """
+    @params:
+
+    - backend: str of path to module or subclass of `BaseBackend`
+
+    - params: Available backend and required params:
+
+        - tflite: {
+            'MODEL_DIR': '',  # directory on host to save the generated tflite models
+            'REMOTE_MODEL_DIR': '',  # directory on mobile phone to place models
+            'KERNEL_PATH': '',  # directory on mobile phone where kernel code files will be generated
+            'BENCHMARK_MODEL_PATH': '',  # path to bin of `benchmark_model`
+            'DEVICE_SERIAL': '',  # serial id of the device. set to '' if there is only one device connected to your host.
+        }
+        - openvino: {
+            'OPENVINO_ENV': '',  # path to openvino virtualenv (openvino_requirements.txt is provided)
+            'OPTIMIZER_PATH': '',  # path to openvino optimizer
+            'TMP_DIR': '',  # tmp directory where temp model and profiling results will be generated
+            'OPENVINO_RUNTIME_DIR': '',  # directory to openvino runtime
+            'DEVICE_SERIAL': '',  # serial id of the device
+            'DATA_TYPE': '',  # data type of the model (e.g., fp16, fp32)
+        }
+    """
+    if isinstance(backend, str):
+        module, attr = BACKENDS_PATH[backend]
+        backend_module = importlib.import_module(module)
+        backend_cls = getattr(backend_module, attr)
+    else:
+        backend_cls = backend
+    return backend_cls(params)
+
+
+def register_backend(backend_name, engine_path, cls_name):
+    """
+    Register a customized backend. The engine_path, cls_name will be used as:
+        'from <engine_path> import <cls_name>'
+
+    @params:
+
+    - backend_name: alias name of the new backend
+
+    - engine_path: the path to define the customized backend
+
+    - cls_name: class name of the customized backend class, should be a subclass of BaseBackend
+    """
+    BACKENDS_PATH[backend_name] = [engine_path, cls_name]
diff --git a/nn_meter/builder/backends/openvino/__init__.py b/nn_meter/builder/backends/openvino/__init__.py
new file mode 100644
index 00000000..0b99dd2b
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .openvino_backend import OpenVINOBackend
+from .openvino_runner import OpenVINORunner
+from .vpu import VPUBackend
diff --git a/nn_meter/builder/backends/openvino/frozenpb_patcher/__init__.py b/nn_meter/builder/backends/openvino/frozenpb_patcher/__init__.py
new file mode 100644
index 00000000..4ca1afb3
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/frozenpb_patcher/__init__.py
@@ -0,0 +1,3 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .patcher_wrapper import patch_frozenpb
\ No newline at end of file
diff --git a/nn_meter/builder/backends/openvino/frozenpb_patcher/frozenpb_patcher.py b/nn_meter/builder/backends/openvino/frozenpb_patcher/frozenpb_patcher.py
new file mode 100644
index 00000000..4a6bddd2
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/frozenpb_patcher/frozenpb_patcher.py
@@ -0,0 +1,369 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import os
+import re
+import sys
+
+import tensorflow as tf
+from google.protobuf import text_format
+from tensorflow import io
+
+
+def dec2octpkg4(input):
+    octPkgStr = ''
+    for i in range(4):
+        octPkgStr = octPkgStr + oct((input >> (i * 8)) %
+                                    256).replace('0o', '\\')
+    return octPkgStr
+
+
+KEEP_DIM_PATCH =\
+    '''
+  attr {
+    key: "keep_dims"
+    value {
+      b: {KEEP_DIM}
+    }
+  }
+'''
+
+REDUCE_DIM_PATCH =\
+    '''
+node {
+  name: "reshape/Reshape/shape"
+  op: "Const"
+  attr {
+    key: "dtype"
+    value {
+      type: DT_INT32
+    }
+  }
+  attr {
+    key: "value"
+    value {
+      tensor {
+        dtype: DT_INT32
+        tensor_shape {
+          dim {
+            size: 2
+          }
+        }
+        tensor_content: "{SHAPE}"
+      }
+    }
+  }
+}
+
+node {
+  name: "reshape/Reshape"
+  op: "Reshape"
+  input: "{INPUT_TENSOR_NAME}"
+  input: "reshape/Reshape/shape"
+  attr {
+    key: "T"
+    value {
+      type: DT_FLOAT
+    }
+  }
+  attr {
+    key: "Tshape"
+    value {
+      type: DT_INT32
+    }
+  }
+}
+'''
+
+SWISH_PATCH =\
+    '''
+node {
+  name: "{NAME}/Sigmoid"
+  op: "Sigmoid"
+  input: "{INPUT}"
+  attr {
+    key: "T"
+    value {
+      type: DT_FLOAT
+    }
+  }
+}
+
+node {
+  name: "{NAME}/mul"
+  op: "Mul"
+  input: "{INPUT}"
+  input: "{NAME}/Sigmoid"
+  attr {
+    key: "T"
+    value {
+      type: DT_FLOAT
+    }
+  }
+}
+'''
+
+MEAN_PATCH =\
+    '''
+node {
+  name: "{NAME}"
+  op: "AvgPool"
+  input: "{INPUT}"
+  attr {
+    key: "T"
+    value {
+      type: DT_FLOAT
+    }
+  }
+  attr {
+    key: "data_format"
+    value {
+      s: "NHWC"
+    }
+  }
+  attr {
+    key: "ksize"
+    value {
+      list {
+        i: 1
+        i: {KERNEL_SIZE}
+        i: {KERNEL_SIZE}
+        i: 1
+      }
+    }
+  }
+  attr {
+    key: "padding"
+    value {
+      s: "VALID"
+    }
+  }
+  attr {
+    key: "strides"
+    value {
+      list {
+        i: 1
+        i: 1
+        i: 1
+        i: 1
+      }
+    }
+  }
+}
+'''
+
+EXPLICT_PAD_ATTR_REGEX = r'attr {\n[\s]+key: "explicit_paddings"\n[\s]'\
+    r'+value {\n[\s]+list {\n[\s]+}\n[\s]+}\n[\s]+}'
+
+U_KEY_ATTR_REGEX = r'attr {\n[\s]+key: "U"\n[\s]+value {\n[\s]+type: DT_FLOAT\n[\s]+}\n[\s]+}'
+
+OUTPUT_SHAPE_REGEX_3 = r'([\s]+attr {\n[\s]+key: "_output_shapes"\n[\s]+value {\n[\s]+list {\n['\
+    r'\s]+)(shape[\s]+{[\s]+([\s]+(dim[\s]+{\s+size:[\s]+[0-9]+[\s]+})|([\s]+'\
+    r'unknown_rank: \w+([\s]+})+))+([\s]+}[\s]+)+)+([\s]})+'
+
+OUTPUT_SHAPE_REGEX_1 = r'attr {\n[\s]+key: "_output_shapes"\n[\s]+value {\n[\s]+list {\n[\s]+shape '\
+    r'{\n[\s]+dim {\n[\s]+size: [0-9]+\n[\s]+}\n[\s]+dim {\n[\s]+size: [0-9]+\n[\s]+}'\
+    r'\n[\s]+dim {\n[\s]+size: [0-9]+\n[\s]+}\n[\s]+dim {\n[\s]+size: [0-9]+\n[\s]+}\n'\
+    r'[\s]+}\n[\s]+shape {\n[\s]+dim {\n[\s]+size: [0-9]+\n[\s]+}\n[\s]+}\n[\s]+shape'\
+    r' {\n[\s]+dim {\n[\s]+size: [0-9]+\n[\s]+}\n[\s]+}\n[\s]+shape {\n[\s]+dim {\n[\s'\
+    r']+size: [0-9]+\n[\s]+}\n[\s]+}\n[\s]+shape {\n[\s]+dim {\n[\s]+size: [0-9]+\n[\s]'\
+    r'+}\n[\s]+}\n[\s]+shape {\n[\s]+unknown_rank: true\n[\s]+}\n[\s]+}\n[\s]+}\n[\s]+}'
+
+OUTPUT_SHAPE_REGEX_2 = r'[\s]+attr {\n[\s]+key: "_output_shapes"\n[\s]+value {\n[\s]+list {\n[\s]+shape '\
+    r'{([\s]+dim[\s]+{\n[\s]+size:[\s]+[0-9]+\n[\s]+}\n)+([\s]+}\n)+'
+
+REDUCTION_IDENCE_REGEX = r'node[\s]+{\n[\s]+name:[\s]+\"[^"]+reduction_indices'\
+    r'\"\n[\s]+op:[\s]+\"Const\"[\s]+[\s]+attr[\s]+{\n[\s]+k'\
+    r'ey:[\s]+\"dtype\"\n[\s]+value[\s]+{\n[\s]+type:[\s]+DT'\
+    r'_INT32\n[\s]+}\n[\s]+}\n[\s]+attr[\s]+{\n[\s]+key:[\s]'\
+    r'+\"value\"\n[\s]+value[\s]+{\n[\s]+tensor[\s]+{\n[\s]+'\
+    r'dtype:[\s]+DT_INT32\n[\s]+tensor_shape[\s]+{\n[\s]+dim'\
+    r'[\s]+{\n[\s]+size:[\s]+2\n[\s]+}\n[\s]+}\n[\s]+tensor_'\
+    r'content:[\s]+\"\\001\\000\\000\\000\\002\\000\\000\\00'\
+    r'0\"\n+([\s]+}\n[\s]+)(}\n[\s]+}\n})'
+
+
+def pbtxt_processing(content):
+    if content.find('explicit_paddings') != -1:
+        print('Find unsupported attr: explicit_paddings, removing...\n')
+        content = re.sub(EXPLICT_PAD_ATTR_REGEX, '', content)
+
+    meanCounter = content.count('op: "Mean"')
+    if meanCounter > 1:  # May not work
+        endMeanNodeName = ""
+        print(f'Find semi-supported op: Mean presented {meanCounter} times in pb, patching...')
+        while True:
+            meanOpLoc = content.find('op: "Mean"')
+            if meanOpLoc == -1:
+                break
+            nodeNameLoc = content.rfind('name', 0, meanOpLoc)
+            nodeNameDLoc = content.find('"', nodeNameLoc)
+            nodeName = content[nodeNameDLoc +
+                               1:content.find('"', nodeNameDLoc + 1)]
+
+            nodeInputLoc = content.find('input', meanOpLoc)
+            nodeInputDLoc = content.find('"', nodeInputLoc)
+            nodeInputName = content[nodeInputDLoc +
+                                    1:content.find('"', nodeInputDLoc + 1)]
+
+            inputNodeNameLoc = content.find(f'name: "{nodeInputName}"')
+            inputNodeEnd = content.find('node', inputNodeNameLoc)
+            inputNodeShape = re.findall(
+                r'[\d]+\n', content[inputNodeNameLoc:inputNodeEnd])
+
+            if len(inputNodeShape) != 4:
+                print(
+                    f'Unexpected happened in shape inference, infered shape: {inputNodeShape} in node [{nodeName}]')
+                sys.exit(-1)
+
+            for i in range(len(inputNodeShape)):
+                inputNodeShape[i] = int(inputNodeShape[i].replace('\n', ''))
+            print(
+                f'Found Node name: {nodeName}, Input Shape: {inputNodeShape}\nPatching the Mean operator...')
+
+            nodeStart = content.rfind('{', 0, nodeNameLoc)
+            nodeEnd = content.find('node', nodeNameLoc)
+
+            if content[nodeStart:nodeEnd].find(
+                    KEEP_DIM_PATCH.replace('{KEEP_DIM}', 'false')) != -1:
+                print('Find reduce mean at top, ignore and break.')
+                endMeanNodeName = nodeName
+                break
+
+            print(f'Generating the patcher, node input: {nodeInputName}')
+            patcher = MEAN_PATCH.replace('{NAME}', nodeName)
+            patcher = patcher.replace('{INPUT}', nodeInputName)
+            patcher = patcher.replace('{KERNEL_SIZE}', str(inputNodeShape[1]))
+
+            print('Inserting patch and removing the Mean node...\n')
+            content = content[:content.rfind(
+                'node', 0, nodeStart)] + patcher + content[nodeEnd:]
+
+        print('Removing unused const.\n')
+        content = re.sub(REDUCTION_IDENCE_REGEX, '', content)
+
+        while True:
+            indecOpLoc = content.find('reduction_indices')
+            if indecOpLoc == -1:
+                break
+            indecNameLoc = content.rfind('name', 0, indecOpLoc)
+            indecStart = content.rfind('{', 0, indecNameLoc)
+            indecEnd = content.find('node', indecNameLoc)
+            if content[indecStart:indecEnd].find(endMeanNodeName) != -1:
+                break
+            content = content[:content.rfind(
+                'node', 0, indecStart)] + content[indecEnd:]
+
+    if content.find('AddV2') != -1:
+        print('Find unsupported op: AddV2, patching...\n')
+        content = content.replace('AddV2', 'Add')
+
+    if content.find(KEEP_DIM_PATCH.replace('{KEEP_DIM}', 'false')) != -1:
+        print('Find unsupported op: reduce_dim=false, patching...')
+
+        while True:
+            keepDimLoc = content.find(
+                KEEP_DIM_PATCH.replace(
+                    '{KEEP_DIM}', 'false'))
+            if keepDimLoc == -1:
+                break
+
+            nodeNameLoc = content.rfind('name', 0, keepDimLoc)
+            nodeNameDLoc = content.find('"', nodeNameLoc)
+            nodeName = content[nodeNameDLoc +
+                               1:content.find('"', nodeNameDLoc + 1)]
+            print(
+                f'Found Node name: {nodeName}, Output Shape: {OUTPUT_FILTER}, Oct: {dec2octpkg4(OUTPUT_FILTER)}')
+            print('Patching the Mean operator...')
+
+            nodeEnd = content.find('node', nodeNameLoc)
+            content = content.replace(
+                f'input: "{nodeName}"',
+                'input: "reshape/Reshape"')
+
+            patcher = REDUCE_DIM_PATCH.replace('{INPUT_TENSOR_NAME}', nodeName)
+            patcher = patcher.replace(
+                '{SHAPE}', f'\\377\\377\\377\\377{dec2octpkg4(OUTPUT_FILTER)}')
+
+            content = content[:nodeEnd] + patcher + content[nodeEnd:]
+
+            content = content.replace(
+                KEEP_DIM_PATCH.replace(
+                    '{KEEP_DIM}', 'false'), KEEP_DIM_PATCH.replace(
+                    '{KEEP_DIM}', 'true'))
+            print('Modified reduce_dim=true...\n')
+
+    if content.find('FusedBatchNormV3') != -1:
+        print('Find unsupported op: FusedBatchNormV3, patching...\n')
+        content = content.replace('FusedBatchNormV3', 'FusedBatchNorm')
+        content = re.sub(U_KEY_ATTR_REGEX, '', content)
+        content = re.sub(OUTPUT_SHAPE_REGEX_1, '', content)
+        content = re.sub(OUTPUT_SHAPE_REGEX_2, '', content)
+
+    if content.find('op: "swish_f32"') != -1:
+        print('Find unsupported op: swish_f32, patching...')
+        while True:
+            swishOpLoc = content.find('op: "swish_f32"')
+            if swishOpLoc == -1:
+                break
+            nodeNameLoc = content.rfind('name', 0, swishOpLoc)
+            nodeNameDLoc = content.find('"', nodeNameLoc)
+            nodeName = content[nodeNameDLoc +
+                               1:content.find('"', nodeNameDLoc + 1)]
+
+            nodeInputLoc = content.find('input', swishOpLoc)
+            nodeInputDLoc = content.find('"', nodeInputLoc)
+            nodeInputName = content[nodeInputDLoc +
+                                    1:content.find('"', nodeInputDLoc + 1)]
+
+            print(
+                f'Found Node name: {nodeName}\nPatching the swish_f32 operator...')
+
+            nodeStart = content.rfind('{', 0, nodeNameLoc)
+            nodeEnd = content.find('node', nodeNameLoc)
+
+            print(f'Generating the patcher, node input: {nodeInputName}')
+            patcher = SWISH_PATCH.replace('{NAME}', nodeName)
+            patcher = patcher.replace('{INPUT}', nodeInputName)
+
+            print('Inserting patch and removing the swish_f32 node...')
+            content = content[:content.rfind(
+                'node', 0, nodeStart)] + patcher + content[nodeEnd:]
+
+            print('Reconnecting the graph...\n')
+            content = content.replace(
+                f'input: "{nodeName}"',
+                f'input: "{nodeName}/mul"')
+
+    return content
+
+
+FILE_NAME = sys.argv[1]
+PBTXT_FILE_NAME = FILE_NAME.replace('.pb', '.pbtxt')
+
+OUTPUT_FILTER = 1280
+if len(sys.argv) > 2:
+    OUTPUT_FILTER = int(sys.argv[2])
+
+if not os.path.isfile(PBTXT_FILE_NAME):
+    f = open(FILE_NAME, 'rb')
+    GRAPH_DEF = tf.compat.v1.get_default_graph().as_graph_def(add_shapes=True)
+    GRAPH_DEF.ParseFromString(f.read())
+    f.close()
+
+    tf.import_graph_def(GRAPH_DEF, name='')
+    io.write_graph(GRAPH_DEF, '', PBTXT_FILE_NAME, as_text=True)
+else:
+
+    GRAPH_DEF = tf.get_default_graph().as_graph_def(add_shapes=True)
+
+    FILE_CONTENT = pbtxt_processing(open(PBTXT_FILE_NAME, 'r').read())
+
+    print('Content check OK, start merging...')
+
+    text_format.Merge(FILE_CONTENT, GRAPH_DEF)
+    io.write_graph(GRAPH_DEF,
+                   os.path.dirname(FILE_NAME),
+                   os.path.basename(FILE_NAME).split('.')[0] + '_patched.pb',
+                   as_text=False)
+    
+    os.remove(PBTXT_FILE_NAME)
diff --git a/nn_meter/builder/backends/openvino/frozenpb_patcher/patcher_wrapper.py b/nn_meter/builder/backends/openvino/frozenpb_patcher/patcher_wrapper.py
new file mode 100644
index 00000000..7acdb66a
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/frozenpb_patcher/patcher_wrapper.py
@@ -0,0 +1,21 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import os
+import subprocess
+
+
+def patch_frozenpb(graph_path, interpreter_path):
+    """ 
+    Patch a frozen pb file to make it compatible with Movidius VPU and then return the path to the patched pb file.
+    @params:
+
+    graph_path: Path to the frozen pb file.
+
+    interpreter_path:  the path of python interpreter
+    """
+    scripts_dir = os.path.abspath(os.path.dirname(__file__))
+    subprocess.run(
+        f'{interpreter_path} {os.path.join(scripts_dir, "frozenpb_patcher.py")} {graph_path}',
+        shell=True
+    )
+    return os.path.splitext(graph_path)[0] + '_patched.pb'
diff --git a/nn_meter/builder/backends/openvino/openvino_backend.py b/nn_meter/builder/backends/openvino/openvino_backend.py
new file mode 100644
index 00000000..090cec3c
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/openvino_backend.py
@@ -0,0 +1,38 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import os
+import tensorflow as tf
+
+from ..interface import BaseBackend
+from .utils import keras_model_to_frozenpb
+from .frozenpb_patcher import patch_frozenpb
+from nn_meter.utils.path import get_filename_without_ext
+
+
+class OpenVINOBackend(BaseBackend):
+    parser_class = None
+    runner_class = None
+
+    def get_params(self):
+        super().get_params()
+        self.runner_kwargs.update({
+            'venv': self.params['OPENVINO_ENV'],
+            'optimizer': self.params['OPTIMIZER_PATH'],
+            'runtime_dir': self.params['OPENVINO_RUNTIME_DIR'],
+            'serial': self.params['DEVICE_SERIAL'],
+            'data_type': self.params['DATA_TYPE'],
+        })
+        self.tmp_dir = self.params['TMP_DIR']
+        self.venv = self.params['OPENVINO_ENV']
+
+    def profile(self, model, model_name, shapes):
+        model_tmp_dir = os.path.join(self.tmp_dir, model_name)
+        pb_path, _ = keras_model_to_frozenpb(model, model_tmp_dir, model_name, shapes)
+        patched_pb_path = patch_frozenpb(pb_path, os.path.join(self.venv, 'bin/python'))
+        self.runner.load_graph(patched_pb_path, model_tmp_dir)
+        return self.parser.parse(self.runner.run(shapes)).latency
+
+    def profile_model_file(self, model_path, shapes):
+        model_name = get_filename_without_ext(model_path)
+        model = tf.keras.models.load_model(model_path)
+        return self.profile(model, model_name, shapes)
diff --git a/nn_meter/builder/backends/openvino/openvino_runner.py b/nn_meter/builder/backends/openvino/openvino_runner.py
new file mode 100644
index 00000000..10b25feb
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/openvino_runner.py
@@ -0,0 +1,91 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import os
+import subprocess
+import numpy as np
+import shutil
+import serial
+
+from .utils import restart
+from nn_meter.utils.pyutils import get_pyver
+
+
+class OpenVINORunner:
+
+    device = None
+
+    def __init__(self, venv, optimizer, runtime_dir, serial, graph_path='', output_dir='', data_type='FP16'):
+        self._graph_path = graph_path
+        self._venv = venv
+        self._optimizer = optimizer
+        self._output_dir = output_dir
+        self._runtime_dir = runtime_dir
+        self._serial = serial
+        self._data_type = data_type
+
+    def load_graph(self, graph_path, output_dir):
+        self._graph_path = graph_path
+        self._output_dir = output_dir
+
+    def run(self, shapes, retry=2):
+        interpreter_path = os.path.join(self._venv, 'bin/python')
+        pyver = get_pyver(interpreter_path)
+
+        subprocess.run(
+            f'{interpreter_path} {self._optimizer} '
+            f'--input_model {self._graph_path} '
+            f'--output_dir {self._output_dir} '
+            f'--data_type {self._data_type}',
+            shell=True
+        )
+
+        filename = os.path.splitext(os.path.basename(self._graph_path))[0]
+
+        input_path = os.path.join(self._output_dir, 'inputs')
+        if os.path.exists(input_path):
+            shutil.rmtree(input_path)
+
+        os.mkdir(input_path)
+        for index, shape in enumerate(shapes):
+            np.random.rand(*shape).astype('float32').tofile(os.path.join(input_path, f'input_{index}.bin'))
+
+        output = ''
+
+        with serial.Serial(self._serial, 115200, timeout=1) as ser:
+            restart(ser)
+
+            command = (
+                f'. {os.path.join(self._venv, "bin/activate")}; '
+                f'cd {self._runtime_dir}; '
+                f'. {os.path.join(self._runtime_dir, "setupvars.sh")} -pyver {pyver}; '
+                f'{os.path.join(self._runtime_dir, "benchmark_app")} '
+                f'-i {input_path} '
+                f'-m {os.path.join(self._output_dir, filename + ".xml")} '
+                f'-d {self.device} '
+                f'-report_type detailed_counters '
+                f'-report_folder {self._output_dir} '
+                f'-niter 50 '
+                f'-nireq 1 '
+                f'-api sync'
+            )
+
+            while True:
+                try:
+                    subprocess.run(
+                        f'bash -c "{command}"',
+                        shell=True,
+                        timeout=30,
+                    )
+                    output = open(os.path.join(self._output_dir, 'benchmark_detailed_counters_report.csv'), 'r').read()
+                    break
+                except subprocess.TimeoutExpired as e:
+                    print(e)
+
+                    if retry == 0:
+                        raise e
+                    print('Retrying...')
+                    restart(ser)
+
+                    retry -= 1
+
+        return output
diff --git a/nn_meter/builder/backends/openvino/utils/__init__.py b/nn_meter/builder/backends/openvino/utils/__init__.py
new file mode 100644
index 00000000..ee84c959
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/utils/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .converters import keras_model_to_frozenpb
+from .restart import restart 
\ No newline at end of file
diff --git a/nn_meter/builder/backends/openvino/utils/converters.py b/nn_meter/builder/backends/openvino/utils/converters.py
new file mode 100644
index 00000000..899d569e
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/utils/converters.py
@@ -0,0 +1,38 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import tensorflow as tf
+from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
+import os
+
+
+def keras_model_to_frozenpb(model, frozen_out_path, frozen_graph_filename, shapes, dtype=tf.dtypes.float32):
+    full_model = tf.function(lambda x: model(x))
+    if len(shapes) == 1:
+        tensor_specs = tf.TensorSpec([1] + shapes[0], dtype)
+    else:
+        tensor_specs = [tf.TensorSpec([1] + shape, dtype) for shape in shapes]
+    full_model = full_model.get_concrete_function(tensor_specs)
+
+    frozen_func = convert_variables_to_constants_v2(full_model)
+    frozen_func.graph.as_graph_def()
+
+    frozen_graph_filename_bin = frozen_graph_filename + '.pb'
+    frozen_graph_filename_txt = frozen_graph_filename + '.pbtxt'
+
+    tf.io.write_graph(
+        graph_or_graph_def=frozen_func.graph,
+        logdir=frozen_out_path,
+        name=frozen_graph_filename_bin,
+        as_text=False
+    )
+    tf.io.write_graph(
+        graph_or_graph_def=frozen_func.graph,
+        logdir=frozen_out_path,
+        name=frozen_graph_filename_txt,
+        as_text=True
+    )
+
+    return (
+        os.path.join(frozen_out_path, frozen_graph_filename_bin),
+        os.path.join(frozen_out_path, frozen_graph_filename_txt),
+    )
diff --git a/nn_meter/builder/backends/openvino/utils/restart.py b/nn_meter/builder/backends/openvino/utils/restart.py
new file mode 100644
index 00000000..7be78551
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/utils/restart.py
@@ -0,0 +1,8 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import time
+
+
+def restart(ser):
+    ser.write(b'all_toggle\n')
+    time.sleep(0.5)
diff --git a/nn_meter/builder/backends/openvino/vpu.py b/nn_meter/builder/backends/openvino/vpu.py
new file mode 100644
index 00000000..07ad7607
--- /dev/null
+++ b/nn_meter/builder/backends/openvino/vpu.py
@@ -0,0 +1,50 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import re
+from .openvino_runner import OpenVINORunner
+from .openvino_backend import OpenVINOBackend
+from nn_meter.builder.utils.latency import Latency
+
+
+class VPULatencyParser:
+    def __init__(self):
+        pass
+
+    def parse(self, output):
+        self.layers = self._parse_layers(output)
+        self.comp_layer_latency = sum(
+            Latency(layer['realtime'])
+            for layer in self.layers
+            if layer['layer_name'] != '<Extra>'
+        )
+        return self
+
+    def _parse_layers(self, output):
+        layer_regex = r'^([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);$'
+        layers = []
+        for match in re.findall(layer_regex, output, re.MULTILINE):
+            try:
+                layers.append({
+                    'layer_name': match[0],
+                    'exec_status': match[1],
+                    'layer_type': match[2],
+                    'exec_type': match[3],
+                    'realtime': float(match[4]),
+                    'cputime': float(match[5]),
+                })
+            except:
+                pass
+        return layers
+
+    @property
+    def latency(self):
+        return self.comp_layer_latency
+
+
+class VPURunner(OpenVINORunner):
+    device = "MYRIAD"
+
+
+class VPUBackend(OpenVINOBackend):
+    parser_class = VPULatencyParser
+    runner_class = VPURunner
diff --git a/nn_meter/builder/backends/tflite/__init__.py b/nn_meter/builder/backends/tflite/__init__.py
new file mode 100644
index 00000000..1d573ed8
--- /dev/null
+++ b/nn_meter/builder/backends/tflite/__init__.py
@@ -0,0 +1,6 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .tflite_backend import TFLiteBackend
+from .tflite_runner import TFLiteRunner
+from .cpu import CPUBackend
+from .gpu import GPUBackend
\ No newline at end of file
diff --git a/nn_meter/builder/backends/tflite/cpu.py b/nn_meter/builder/backends/tflite/cpu.py
new file mode 100644
index 00000000..1bd43e5b
--- /dev/null
+++ b/nn_meter/builder/backends/tflite/cpu.py
@@ -0,0 +1,63 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import re
+from .tflite_runner import TFLiteRunner
+from .tflite_backend import TFLiteBackend
+from nn_meter.builder.utils.latency import Latency
+
+
+class CPULatencyParser:
+    def __init__(self):
+        self.nodes = []
+        self.total_latency = Latency()
+
+    def parse(self, output):
+        self.nodes = self._parse_nodes(output)
+        self.total_latency = self._parse_total_latency(output)
+        return self
+
+    def _parse_nodes(self, output):
+        start_regex = r'[= ]*Run Order[= ]*'
+        end_regex = r'[= ]*Top by Computation Time[= ]*'
+        node_regex = r'\s*(\w+)\s*[\d.e-]+\s*[\d.e-]+\s*([\d.e-]+)\s*[\d.e-]+%\s*[\d.e-]+%\s*[\d.e-]+\s*1\s*(\S*)'
+        flag = False
+
+        nodes = []
+        for line in output.splitlines():
+            if flag:
+                match = re.search(node_regex, line)
+                if match:
+                    nodes.append({
+                        'node_type': match[1],
+                        'avg': float(match[2]),
+                        'name': match[3],
+                    })
+            if re.search(start_regex, line):
+                flag = True
+            if re.search(end_regex, line):
+                flag = False
+        
+        return nodes
+
+    def _parse_total_latency(self, output):
+        total_latency_regex = r'Timings \(microseconds\): count=[\d.e-]+ first=[\d.e-]+ curr=[\d.e-]+ min=[\d.e-]+ max=[\d.e-]+ avg=([\d.e-]+) std=([\d.e-]+)'
+
+        total_latency = Latency()
+        match = re.search(total_latency_regex, output, re.MULTILINE)
+        if match:
+            total_latency = Latency(float(match[1]), float(match[2]))
+
+        return total_latency
+    
+    @property
+    def latency(self):
+        return self.total_latency
+
+
+class CPURunner(TFLiteRunner):
+    use_gpu = False
+
+
+class CPUBackend(TFLiteBackend):
+    parser_class = CPULatencyParser
+    runner_class = CPURunner
\ No newline at end of file
diff --git a/nn_meter/builder/backends/tflite/gpu.py b/nn_meter/builder/backends/tflite/gpu.py
new file mode 100644
index 00000000..807f6907
--- /dev/null
+++ b/nn_meter/builder/backends/tflite/gpu.py
@@ -0,0 +1,177 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import re
+from .tflite_runner import TFLiteRunner
+from .tflite_backend import TFLiteBackend
+from nn_meter.builder.utils.latency import Latency
+
+
+class GPULatencyParser:
+    def __init__(self):
+        self.kernels = []
+        self.realtime = 0
+        self.kernel_sum = 0
+        self.block_name = ''
+        self.raw_output = ''
+        self.before_fused_graph = ''
+        self.after_fused_graph = ''
+
+    def parse(self, output):
+        result = self._parse_time(output)
+        kernel_operation_map = self._parse_kernel_name(output)
+        work_size = self._parse_work_size(output)
+        self.realtime, self.block_name = self._parse_block(output)
+        self.kernel_sum = sum(value[0] for key, value in result.items())
+        self.kernels = [{}] * len(result)
+        self.before_fused_graph, self.after_fused_graph = self._parse_graph(output)
+        self.comp_avg, self.comp_std = self._parse_comp_time(output)
+        self.nodes = self._parse_node_cpu_time(output)
+        self.errors = self._parse_error(output)
+        for key, value in result.items():
+            self.kernels[key] = {
+                'avg': value[0],
+                'std': value[1],
+                'work_size': work_size[key],
+                'name': kernel_operation_map[key],
+            }
+
+        self.comp_kernel_latency = sum((Latency(kernel['avg'], kernel['std']) for kernel in self.kernels if kernel['name'] != 'to/from tensor'), Latency())
+
+        self.raw_output = output
+
+        return self
+
+    @staticmethod
+    def resolve_name(name):
+        name = name.split(' ')
+        if 'linked' in name:
+            ops = []
+            name = [x for x in name if x != ':' and x != 'linked']
+            for i in range(0, len(name), 2):
+                ops.append(name[i])
+            return ops
+        else:
+            return [name[0]]
+
+    @property
+    def latency(self):
+        """
+        On GPU, we currently decide to use kernel_sum instead of realtime (block) as latency
+        """
+        return self.comp_kernel_latency
+
+    def _parse_kernel_name(self, output):
+        kernel_name_regex = r'kernel_name\[(\d+)\]=(.*)'
+        kernel_operation_map = {}
+
+        for line in output.splitlines():
+            match = re.search(kernel_name_regex, line)
+            if match:
+                index = int(match[1])
+                kernel_operation_map[index] = match[2]
+
+        return kernel_operation_map
+
+    def _parse_block(self, output):
+        node_regex = r'\s+\w+\s+[\d.e-]+\s+[\d.e-]+\s+([\d.e-]+)[\s\d.%]+(\S+)'
+
+        realtime = 0
+        block_name = ''
+        for line in output.splitlines():
+            match = re.search(node_regex, line)
+            if match:
+                realtime = float(match[1])
+                block_name = match[2]
+                break
+
+        return realtime, block_name
+
+    def _parse_time(self, output):
+        kernel_regex = r'\w+\[(\d+)\]\w+=([\d.e-]+) \w+\[(\d+)\]\w+=([\d.e-]+) ' \
+                       r'\w+\[(\d+)\]\w+=([\d.e-]+) \w+\[(\d+)\]\w+=([\d.e-]+)'
+        result = {}
+
+        for line in output.splitlines():
+            match = re.search(kernel_regex, line)
+            if match:
+                index = int(match[1])
+                avg_ms = float(match[2])
+                std_ms = float(match[4])
+                result[index] = (avg_ms, std_ms)
+
+        return result
+
+    def _parse_work_size(self, output):
+        work_size_regex = r'local_work_size\[(\d+)\]=([\d,]+)'
+        work_size = {}
+
+        for line in output.splitlines():
+            match = re.search(work_size_regex, line)
+            if match:
+                index = int(match[1])
+                work_size[index] = match[2]
+
+        return work_size
+
+    def _parse_graph(self, output):
+        before_fused_regex = r'\[Before Fused\](.*)\[end\]'
+        before_fused_pattern = re.compile(before_fused_regex, re.DOTALL)
+
+        before_fused_graph = ''
+        match = before_fused_pattern.search(output)
+        if match:
+            before_fused_graph = match[1]
+
+        after_fused_regex = r'\[After Fused\](.*)\[end\]'
+        after_fused_pattern = re.compile(after_fused_regex, re.DOTALL)
+
+        after_fused_graph = ''
+        match = after_fused_pattern.search(output)
+        if match:
+            after_fused_graph = match[1]
+
+        return before_fused_graph, after_fused_graph
+
+    def _parse_comp_time(self, output):
+        comp_time_regex = r'comp_avg_ms=([\d.e-]+) comp_std_ms=([\d.e-]+)'
+        comp_avg, comp_std = 0, 0
+
+        for line in output.splitlines():
+            match = re.search(comp_time_regex, line)
+            if match:
+                comp_avg = float(match[1])
+                comp_std = float(match[2])
+
+        return comp_avg, comp_std
+
+    def _parse_node_cpu_time(self, output):
+        node_regex = r'(\w+)\s+[\d]+\s+([\d.e-]+)\s+[\d.%]+\s+[\d.%]+\s+[\d.e-]+\s+\d+'
+        nodes = {}
+
+        for line in output.splitlines():
+            match = re.search(node_regex, line)
+            if match:
+                nodes[match[1]] = float(match[2])
+
+        return nodes
+
+    def _parse_error(self, output):
+        error_regex = r'ERROR: (.*)'
+        errors = []
+
+        for line in output.splitlines():
+            match = re.search(error_regex, line)
+            if match:
+                errors.append(match[1])
+
+        return errors
+
+
+class GPURunner(TFLiteRunner):
+    use_gpu = True
+
+
+class GPUBackend(TFLiteBackend):
+    parser_class = GPULatencyParser
+    runner_class = GPURunner
+    
\ No newline at end of file
diff --git a/nn_meter/builder/backends/tflite/tflite_backend.py b/nn_meter/builder/backends/tflite/tflite_backend.py
new file mode 100644
index 00000000..da3f7107
--- /dev/null
+++ b/nn_meter/builder/backends/tflite/tflite_backend.py
@@ -0,0 +1,32 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import os
+import tensorflow as tf
+
+from ..interface import BaseBackend
+from nn_meter.builder.utils import get_tensor_by_shapes
+
+
+class TFLiteBackend(BaseBackend):
+    parser_class = None
+    runner_class = None
+
+    def get_params(self):
+        super().get_params()
+        self.runner_kwargs.update({
+            'dst_kernel_path': self.params['KERNEL_PATH'],
+            'serial': self.params['DEVICE_SERIAL'],
+            'benchmark_model_path': self.params['BENCHMARK_MODEL_PATH'],
+        })
+        self.model_dir = self.params['MODEL_DIR']
+        self.remote_model_dir = self.params['REMOTE_MODEL_DIR']
+
+    def profile(self, model, model_name, shapes=None):
+        # build input shapes
+        model(get_tensor_by_shapes(shapes))
+        converter = tf.lite.TFLiteConverter.from_keras_model(model)
+        tflite_model = converter.convert()
+        graph_path = os.path.join(self.model_dir, model_name + '.tflite')
+        open(graph_path, 'wb').write(tflite_model)
+        self.runner.load_graph(graph_path, os.path.join(self.remote_model_dir, model_name + '.tflite'))
+        return self.parser.parse(self.runner.run()).latency
diff --git a/nn_meter/builder/backends/tflite/tflite_runner.py b/nn_meter/builder/backends/tflite/tflite_runner.py
new file mode 100644
index 00000000..9ddb4891
--- /dev/null
+++ b/nn_meter/builder/backends/tflite/tflite_runner.py
@@ -0,0 +1,63 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import subprocess
+
+
+class TFLiteRunner:
+    use_gpu = None
+
+    def __init__(self, dst_kernel_path, benchmark_model_path, graph_path='', dst_graph_path='', serial='', num_threads=1, num_runs=50, warm_ups=10):
+        """
+        :param graph_path: graph file. path on host server
+        :param dst_graph_path: graph file. path on android device
+        :param kernel_path: dest kernel output file. path on android device
+        :param benchmark_model_path: path to benchmark_model on android device
+        """
+        self._serial = serial
+        self._graph_path = graph_path
+        self._dst_graph_path = dst_graph_path
+        self._dst_kernel_path = dst_kernel_path
+        self._benchmark_model_path = benchmark_model_path
+        self._num_threads = num_threads
+        self._num_runs = num_runs
+        self._warm_ups = warm_ups
+
+    def load_graph(self, graph_path, dst_graph_path):
+        self._graph_path = graph_path
+        self._dst_graph_path = dst_graph_path
+
+        return self
+
+    def run(self, preserve=False, clean=False, taskset='70'):
+        """
+        :param preserve: tflite file exists in remote dir. No need to push it again.
+        :param clean: remove tflite file after running.
+        """
+        base_adb_cmd = 'adb' + (f' -s {self._serial}' if self._serial != '' else '')
+        push_cmd = base_adb_cmd + f' push {self._graph_path} {self._dst_graph_path}'
+        taskset_cmd = ''
+        if taskset:
+            taskset_cmd = f'taskset {taskset}'
+        run_cmd = base_adb_cmd + f' shell {taskset_cmd} {self._benchmark_model_path}' \
+                                 f' --kernel_path={self._dst_kernel_path}' \
+                                 f' --num_threads={self._num_threads}' \
+                                 f' --num_runs={self._num_runs}' \
+                                 f' --warm_umps={self._warm_ups}' \
+                                 f' --graph={self._dst_graph_path}' \
+                                 f' --enable_op_profiling=true' \
+                                 f' --use_gpu={"true" if self.use_gpu else "false"}'
+        rm_cmd = base_adb_cmd + f' shell rm {self._dst_graph_path}'
+
+        if not preserve:
+            subprocess.check_output(push_cmd, shell=True)
+        try:
+            res = subprocess.check_output(run_cmd, shell=True)
+        except:
+            raise
+        finally:
+            if clean:
+                subprocess.check_output(rm_cmd, shell=True)
+            
+        res = res.decode('utf-8')
+
+        return res
diff --git a/nn_meter/builder/nn_meter_builder.py b/nn_meter/builder/nn_meter_builder.py
new file mode 100644
index 00000000..4ff1c200
--- /dev/null
+++ b/nn_meter/builder/nn_meter_builder.py
@@ -0,0 +1,76 @@
+import os
+import json
+from .rule_tester import config
+from .rule_tester import RuleTester
+from .utils.utils import dump_testcases, read_testcases
+
+def get_testcases(model_dir, case_save_path='./data/testcases.json'):
+    """
+    @params:
+
+    - model_dir: Directory to save testcase models
+
+    - case_save_path: Path to save the testcase json file
+
+    """
+    config.set('model_dir', model_dir, 'ruletest')
+
+    tester = RuleTester()
+    testcases = tester.generate()
+    
+    if case_save_path:
+        os.makedirs(os.path.dirname(case_save_path), exist_ok=True)
+        with open(case_save_path, 'w') as fp:
+            json.dump(dump_testcases(testcases), fp, indent=4)
+
+    return testcases
+
+
+def run_testcases(backend, testcases, case_save_path='./data/profiled_testcases.json'):
+    """
+    @params:
+
+    - backend: Applied backend with its config, a subclass of BaseBackend
+
+    - testcases: The TestCases class or the path of the testcase json file
+
+    - case_save_path: Path to save the testcase json file
+
+    """
+    if isinstance(testcases, str):
+        with open(testcases, 'r') as fp:
+            testcases = read_testcases(json.load(fp))
+
+    for _, testcase in testcases.items():
+        for _, model in testcase.items():
+            model_path = model['model']
+            model['latency'] = backend.profile_model_file(model_path, model['shapes'])
+
+    if case_save_path:
+        os.makedirs(os.path.dirname(case_save_path), exist_ok=True)
+        with open(case_save_path, 'w') as fp:
+            json.dump(dump_testcases(testcases), fp, indent=4)
+    return testcases
+
+
+def get_fusionrule(testcases, case_save_path='./data/detected_testcases.json'):
+    """
+    @params:
+
+    - testcases: The TestCases class or the path of the testcase json file
+
+    - case_save_path: Path to save the testcase json file
+
+    """
+    if isinstance(testcases, str):
+        with open(testcases, 'r') as fp:
+            testcases = read_testcases(json.load(fp))
+
+    tester = RuleTester()
+    result = tester.analyze(testcases)
+    
+    if case_save_path:
+        os.makedirs(os.path.dirname(case_save_path), exist_ok=True)
+        with open(case_save_path, 'w') as fp:
+            json.dump(result, fp, indent=4)
+    return result
diff --git a/nn_meter/builder/utils/__init__.py b/nn_meter/builder/utils/__init__.py
new file mode 100644
index 00000000..b9fff74b
--- /dev/null
+++ b/nn_meter/builder/utils/__init__.py
@@ -0,0 +1,3 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .utils import get_inputs_by_shapes, get_tensor_by_shapes
\ No newline at end of file
diff --git a/nn_meter/builder/utils/latency.py b/nn_meter/builder/utils/latency.py
new file mode 100644
index 00000000..c727707a
--- /dev/null
+++ b/nn_meter/builder/utils/latency.py
@@ -0,0 +1,52 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import math
+
+
+class Latency:
+    def __init__(self, avg=0, std=0):
+        if isinstance(avg, str):
+            avg, std = avg.split('+-')
+            self.avg = float(avg)
+            self.std = float(std)
+        elif isinstance(avg, Latency):
+            self.avg, self.std = avg.avg, avg.std
+        else:
+            self.avg = avg
+            self.std = std
+
+    def __str__(self):
+        return f'{self.avg} +- {self.std}'
+
+    def __add__(self, rhs):
+        if isinstance(rhs, Latency):
+            return Latency(self.avg + rhs.avg, math.sqrt(self.std ** 2 + rhs.std ** 2))
+        else:
+            return Latency(self.avg + rhs, self.std)
+    
+    def __radd__(self, lhs):
+        return self.__add__(lhs)
+
+    def __mul__(self, rhs):
+        return Latency(self.avg * rhs, self.std * rhs)
+
+    def __rmul__(self, lhs):
+        return self.__mul__(lhs)
+
+    def __le__(self, rhs):
+        return self.avg < rhs.avg
+    
+    def __gt__(self, rhs):
+        return self.avg > rhs.avg
+
+    def __neg__(self):
+        return Latency(-self.avg, -self.std)
+
+    def __sub__(self, rhs):
+        return self + rhs.__neg__()
+    
+    def _dump(self):
+        return {
+            'avg': self.avg,
+            'std': self.std
+        }
diff --git a/nn_meter/builder/utils/utils.py b/nn_meter/builder/utils/utils.py
new file mode 100644
index 00000000..cec7567d
--- /dev/null
+++ b/nn_meter/builder/utils/utils.py
@@ -0,0 +1,38 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import copy
+import tensorflow as tf
+from tensorflow import keras
+from .latency import Latency
+
+
+def get_inputs_by_shapes(shapes):
+    if len(shapes) == 1:
+        return keras.Input(shape=shapes[0])
+    else:
+        return [keras.Input(shape=shape) for shape in shapes]
+
+
+def get_tensor_by_shapes(shapes):
+    if len(shapes) == 1:
+        return tf.random.normal(shape=[1] + shapes[0])
+    else:
+        return [tf.random.normal(shape=[1] + shape) for shape in shapes]
+
+
+def dump_testcases(testcases):
+    testcases_copy = copy.deepcopy(testcases)
+    for item in testcases_copy.values():
+        for model in item.values():
+            if 'latency' in model:
+                model['latency'] = str(model['latency'])
+    return testcases_copy
+
+
+def read_testcases(testcases):
+    testcases_copy = copy.deepcopy(testcases)
+    for item in testcases_copy.values():
+        for model in item.values():
+            if 'latency' in model:
+                model['latency'] = Latency(model['latency'])
+    return testcases_copy
diff --git a/nn_meter/utils/import_package.py b/nn_meter/utils/import_package.py
index 08a5cb79..f4304d2a 100644
--- a/nn_meter/utils/import_package.py
+++ b/nn_meter/utils/import_package.py
@@ -28,7 +28,7 @@ def try_import_torch(require_version = ["1.9.0", "1.7.1"]):
         logging.error(f'You have not install the torch package, please install torch=={require_version[0]} and try again.')
         exit()
 
-def try_import_tensorflow(require_version = ["1.15.0"]):
+def try_import_tensorflow(require_version = ["2.6.0", "1.15.0"]):
     if isinstance(require_version, str):
         require_version = [require_version]
     try:
@@ -40,7 +40,7 @@ def try_import_tensorflow(require_version = ["1.15.0"]):
         logging.error(f'You have not install the tensorflow package, please install tensorflow=={require_version[0]} and try again.')
         exit()
 
-def try_import_nni(require_version = ["2.4", "2.5"]):
+def try_import_nni(require_version = ["2.5", "2.4"]):
     if isinstance(require_version, str):
         require_version = [require_version]
     try:
@@ -49,7 +49,7 @@ def try_import_nni(require_version = ["2.4", "2.5"]):
             logging.warning(f'nni=={nni.__version__} is not well tested now, well tested version: nni=={", ".join(require_version)}' )
         return nni
     except ImportError:
-        logging.error(f'You have not install the tensorflow package, please install tensorflow=={require_version[0]} and try again.')
+        logging.error(f'You have not install the nni package, please install nni=={require_version[0]} and try again.')
         exit()
 
 def try_import_torchvision_models():
diff --git a/nn_meter/utils/path.py b/nn_meter/utils/path.py
new file mode 100644
index 00000000..e894bd0a
--- /dev/null
+++ b/nn_meter/utils/path.py
@@ -0,0 +1,8 @@
+import os
+
+
+def get_filename(path):
+    return os.path.basename(path)
+
+def get_filename_without_ext(path):
+    return os.path.splitext(os.path.basename(path))[0]
diff --git a/nn_meter/utils/pyutils.py b/nn_meter/utils/pyutils.py
new file mode 100644
index 00000000..21632d55
--- /dev/null
+++ b/nn_meter/utils/pyutils.py
@@ -0,0 +1,10 @@
+import subprocess
+
+
+def get_pyver(interpreter_path):
+    script = '''
+import sys
+print(f'{sys.version_info.major}.{sys.version_info.minor}')
+    '''
+    version = subprocess.check_output(f'{interpreter_path} -c "{script}"', shell=True)
+    return version.decode('utf-8').strip()


Test patch:
diff --git a/nn_meter/builder/rule_tester/README.md b/nn_meter/builder/rule_tester/README.md
new file mode 100644
index 00000000..e8e98709
--- /dev/null
+++ b/nn_meter/builder/rule_tester/README.md
@@ -0,0 +1,64 @@
+# Android Guide
+
+## Prepare Android Device
+
+Please follow the [tensorflow official guide](https://www.tensorflow.org/lite/performance/measurement) to build and deploy `benchmark_model` onto the device. 
+
+1. use bazel to build a benchmark_model file. Please refer to https://dev.azure.com/v-wjiany/Personal/_git/tensorflow_modified?path=/tensorflow/lite/tools/benchmark/android/README.md&_a=preview
+Follow the tensorflow official guide for a more detailed guide to build and deploy benchmark_model onto the device.
+``` Bash
+bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model
+```
+
+2. Push the benchmark_model to edge device by specifing its serial.
+``` Bash
+adb -s <device-serial> push bazel-bin/tensorflow/lite/tools/benchmark/benchmark_model /data/local/tmp # send to edge
+adb shell chmod +x /data/local/tmp/benchmark_model
+```
+
+## Config RuleTest
+TODO: @ Jiahang: where is config.py?
+Directly modify `config.py` or provide a `local_config.py` to overide configurations.
+
+### Required Configs
+
+You need to provide settings for the `PARAMS` field.
+
+- `MODEL_DIR`: Path to the folder (on host device) where temporary models will be generated.
+- `REMOTE_MODEL_DIR`: Path to the folder (on android device) where temporary models will be copied to.
+- `KERNEL_PATH`: Path (on android device) where the kernel implementations will be dumped.
+- `BENCHMARK_MODEL_PATH`: Path (on android device) where `benchmark_model` is deployed.
+- `DEVICE_SERIAL`: If there are multiple adb devices connected to your host, you need to provide the corresponding serial id. Leave to `''` if not.
+
+```python
+BACKENDS = {
+    'tflite_gpu': {
+        'ENGINE': 'backends.tflite_gpu',
+        'PARAMS': {
+            'MODEL_DIR': '/data1/datasets_pad', #os.path.join(HOME_DIR, "benchmarks/models/tflite"),
+            'REMOTE_MODEL_DIR': '/mnt/sdcard/tflite_bench',
+            'KERNEL_PATH': '/mnt/sdcard/tflite_bench/kernel.cl',
+            'BENCHMARK_MODEL_PATH': '/data/local/tmp/benchmark_model',
+            'DEVICE_SERIAL': '5e6fecf',
+        },
+        'ENABLED': True,
+    },
+}
+```
+
+`OUTPUT_PATH` also need to be provided. The generated rule files will be placed there.
+
+### Optional Configs
+
+- `DEFAULT_INPUT_SHAPE`: default resolution and channels of your input image
+- `D1_INPUT_SHAPE`: input shapes of 1d operations like `dense`
+- `FILTERS`: filter numbers of conv and dwconv
+- `KERNEL_SIZE`: kernel size
+- `ENABLED`: rules to be tested
+- `DETAIL`: whether or not dump the detail inference time in rule files
+
+## Run
+
+```
+python main.py
+```
diff --git a/nn_meter/builder/rule_tester/__init__.py b/nn_meter/builder/rule_tester/__init__.py
new file mode 100644
index 00000000..3b736159
--- /dev/null
+++ b/nn_meter/builder/rule_tester/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .config_manager import config
+from .rule_test import RuleTester
diff --git a/nn_meter/builder/rule_tester/config_manager.py b/nn_meter/builder/rule_tester/config_manager.py
new file mode 100644
index 00000000..15551d1d
--- /dev/null
+++ b/nn_meter/builder/rule_tester/config_manager.py
@@ -0,0 +1,56 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import os
+import json
+
+
+class ConfigData:
+    def __init__(self, global_setting=None):
+        self._global_settings = global_setting if global_setting else {}
+
+    def set(self, name, value, module=''):
+        self._global_settings[module][name] = value
+        
+    def get(self, name, module=''):
+        return self._global_settings[module].get(name)
+
+    def get_settings(self):
+        return self._global_settings
+
+
+class ConfigManager(ConfigData):
+    def __init__(self, config_path=None, save_path='./data/ruletest_config.json'):
+        super().__init__()
+        if config_path: # load config from file
+            self._load_from_config_file(config_path)
+        else: # set default config
+            self._set_default_config()
+
+        if save_path:
+            os.makedirs(os.path.dirname(save_path), exist_ok=True)
+            with open(save_path, 'w') as fp:
+                json.dump(self._global_settings, fp, indent=4)
+
+    def _set_default_config(self):
+        self._global_settings['ruletest'] = {
+            'default_input_shape': [28, 28, 16],
+            'd1_input_shape': [428],
+            'filters': 256,
+            'kernel_size': 3,
+            'enabled': ['BF', 'MON', 'RT'],
+            'params': {
+                'BF': {
+                    'eps': 0.5,
+                }
+            },
+            'model_dir': '',
+            'detail': False,
+        }
+    
+    def _load_from_config_file(self, config_path):
+        with open(config_path, 'r') as fp:
+            setting = json.load(fp)
+        self._global_settings = setting
+
+
+config = ConfigManager()
diff --git a/nn_meter/builder/rule_tester/rule_test/__init__.py b/nn_meter/builder/rule_tester/rule_test/__init__.py
new file mode 100644
index 00000000..bc45c819
--- /dev/null
+++ b/nn_meter/builder/rule_tester/rule_test/__init__.py
@@ -0,0 +1,6 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .rule_tester.runner import RuleTester
+from nn_meter.utils.import_package import try_import_tensorflow
+
+try_import_tensorflow()
diff --git a/nn_meter/builder/rule_tester/rule_test/model_builder/__init__.py b/nn_meter/builder/rule_tester/rule_test/model_builder/__init__.py
new file mode 100644
index 00000000..9a045456
--- /dev/null
+++ b/nn_meter/builder/rule_tester/rule_test/model_builder/__init__.py
@@ -0,0 +1,2 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
diff --git a/nn_meter/builder/rule_tester/rule_test/model_builder/layers.py b/nn_meter/builder/rule_tester/rule_test/model_builder/layers.py
new file mode 100644
index 00000000..10caba7f
--- /dev/null
+++ b/nn_meter/builder/rule_tester/rule_test/model_builder/layers.py
@@ -0,0 +1,104 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import tensorflow as tf
+from tensorflow import keras
+from ...config_manager import config
+
+
+def reshape(input_shape):
+    if len(input_shape) == 3:
+        output_shape = [input_shape[2], input_shape[0], input_shape[1]]
+        def func(inputs):
+            return tf.reshape(inputs, [1] + output_shape)
+    else:
+        output_shape = [1, 2, int(input_shape[0] / 2)]
+        def func(inputs):
+            return tf.reshape(inputs, [1] + output_shape)
+    return func, output_shape, False
+
+
+def dwconv(input_shape):
+    return keras.layers.DepthwiseConv2D(config.get('kernel_size', 'ruletest'), padding='same'), input_shape, False
+
+
+def relu(input_shape):
+    return keras.layers.ReLU(), input_shape, False
+
+
+def add(input_shape):
+    return keras.layers.Add(), input_shape, True
+
+def conv(input_shape):
+    return keras.layers.Conv2D(input_shape[2], config.get('kernel_size', 'ruletest'), padding='same'), input_shape, False
+
+
+def concat(input_shape):
+    if len(input_shape) == 3:
+        output_shape = [input_shape[0], input_shape[1], input_shape[2] * 2]
+    else:
+        output_shape = [input_shape[0] * 2]
+
+    return keras.layers.Concatenate(), output_shape, True
+
+
+def convtrans(input_shape):
+    class Conv2dTranspose(keras.layers.Layer):
+        def __init__(self):
+            super().__init__()
+            self.filters = tf.Variable(tf.ones([config.get('kernel_size', 'ruletest'), config.get('kernel_size', 'ruletest'), input_shape[2], input_shape[2]])) 
+        def call(self, inputs):
+            return tf.nn.conv2d_transpose(
+                inputs,
+                filters=self.filters,
+                output_shape=[1] + input_shape,
+                strides=[1, 1],
+            )
+
+    return Conv2dTranspose(), input_shape, False
+
+
+def dense(input_shape):
+    return keras.layers.Dense(input_shape[0]), input_shape, False
+
+
+def pooling(input_shape):
+    output_shape = [int(input_shape[0] / 2), int(input_shape[1] / 2), input_shape[2]]
+    return keras.layers.AveragePooling2D(padding='same'), output_shape, False
+
+
+def se(input_shape):
+    class SE(keras.layers.Layer):
+        def __init__(self):
+            super().__init__()
+            self.conv1 = tf.keras.layers.Conv2D(
+                filters=input_shape[-1],
+                kernel_size=[1, 1],
+                strides=[1, 1],
+                padding="same",
+            )
+            self.conv2 = tf.keras.layers.Conv2D(
+                filters=input_shape[-1],
+                kernel_size=[1, 1],
+                strides=[1, 1],
+                padding="same",
+            )
+        def call(self, inputs):
+            x = tf.nn.avg_pool(
+                inputs,
+                ksize=[1] + input_shape[0:2] + [1],
+                strides=[1, 1, 1, 1],
+                padding='VALID',
+            )
+            x = self.conv1(x)
+            x = tf.nn.relu(x)
+            x = self.conv2(x)
+            return x * inputs
+
+    return SE(), input_shape, False
+
+
+def hswish(input_shape):
+    def func(inputs):
+        return tf.nn.relu6(tf.math.add(inputs, 3)) * 0.16667
+    return func, input_shape, False
+
diff --git a/nn_meter/builder/rule_tester/rule_test/model_builder/simple_model.py b/nn_meter/builder/rule_tester/rule_test/model_builder/simple_model.py
new file mode 100644
index 00000000..bccf0dd1
--- /dev/null
+++ b/nn_meter/builder/rule_tester/rule_test/model_builder/simple_model.py
@@ -0,0 +1,37 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import tensorflow as tf
+
+
+class SingleOpModel(tf.keras.Model):
+    def __init__(self, op):
+        super().__init__()
+        self.op = op
+
+    def call(self, inputs):
+        return self.op(inputs)
+
+
+class TwoOpModel(tf.keras.Model):
+    def __init__(self, op1, op2, op1_is_two_inputs, op2_is_two_inputs):
+        super().__init__()
+        self.op1 = op1
+        self.op2 = op2
+        self.op1_is_two_inputs = op1_is_two_inputs
+        self.op2_is_two_inputs = op2_is_two_inputs
+
+    def call(self, inputs):
+        if self.op1_is_two_inputs:
+            x = self.op1([inputs[0], inputs[1]])
+        else:
+            if self.op2_is_two_inputs:
+                x = self.op1(inputs[0])
+            else:
+                x = self.op1(inputs)
+        
+        if self.op2_is_two_inputs:
+            x = self.op2([x, inputs[-1]])
+        else:
+            x = self.op2(x)
+        
+        return x
diff --git a/nn_meter/builder/rule_tester/rule_test/model_builder/utils.py b/nn_meter/builder/rule_tester/rule_test/model_builder/utils.py
new file mode 100644
index 00000000..dc22c5ac
--- /dev/null
+++ b/nn_meter/builder/rule_tester/rule_test/model_builder/utils.py
@@ -0,0 +1,27 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from . import layers
+from .simple_model import SingleOpModel, TwoOpModel
+from nn_meter.builder.utils import get_inputs_by_shapes
+
+
+def get_layer_by_name(name, input_shape):
+    return getattr(layers, name)(input_shape)
+
+def get_model_by_ops(op1, op2, input_shape):
+    layer1, op1_output_shape, op1_is_two_inputs = get_layer_by_name(op1, input_shape)
+    layer2, _, op2_is_two_inputs = get_layer_by_name(op2, op1_output_shape)
+
+    op1_model = SingleOpModel(layer1)
+    op1_shapes = [input_shape] * (1 + op1_is_two_inputs)
+    op1_model(get_inputs_by_shapes(op1_shapes))
+
+    op2_model = SingleOpModel(layer2)
+    op2_shapes = [op1_output_shape] * (1 + op2_is_two_inputs)
+    op2_model(get_inputs_by_shapes(op2_shapes))
+
+    block_model = TwoOpModel(layer1, layer2, op1_is_two_inputs, op2_is_two_inputs)
+    block_shapes = [input_shape] * (1 + op1_is_two_inputs) + [op1_output_shape] * op2_is_two_inputs
+    block_model(get_inputs_by_shapes(block_shapes))
+
+    return op1_model, op2_model, block_model, op1_shapes, op2_shapes, block_shapes
diff --git a/nn_meter/builder/rule_tester/rule_test/rule_tester/__init__.py b/nn_meter/builder/rule_tester/rule_test/rule_tester/__init__.py
new file mode 100644
index 00000000..aac65331
--- /dev/null
+++ b/nn_meter/builder/rule_tester/rule_test/rule_tester/__init__.py
@@ -0,0 +1,3 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+from .rules import *
diff --git a/nn_meter/builder/rule_tester/rule_test/rule_tester/rules.py b/nn_meter/builder/rule_tester/rule_test/rule_tester/rules.py
new file mode 100644
index 00000000..3e10ff06
--- /dev/null
+++ b/nn_meter/builder/rule_tester/rule_test/rule_tester/rules.py
@@ -0,0 +1,417 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import os
+from tensorflow import keras
+
+from ...config_manager import config
+from ..model_builder.utils import get_model_by_ops
+from nn_meter.builder.utils import get_tensor_by_shapes
+from nn_meter.builder.utils.latency import Latency
+
+
+rules = {}
+
+
+class RuleTestBase:
+    name = ''
+    cases = None
+    true_case = ''
+    deps = {}
+    input_shape = None
+
+    def __init_subclass__(cls, **kwargs):
+        super().__init_subclass__(**kwargs)
+        cls._register()
+
+    def __init__(self, **kwargs):
+        self._kwargs = kwargs
+        self.latency = {}
+
+        self.load_config()
+
+    def _gen_testcase(self):
+        testcase = {}
+        model, shapes = self._model_block()
+        testcase['block'] = {
+            'model': model,
+            'shapes': shapes,
+        }
+
+        for _, ops in self.cases.items():
+            for op in ops:
+                model, shapes = getattr(self, '_model_' + op)()
+                testcase[op] = {
+                    'model': model,
+                    'shapes': shapes
+                }
+
+        return testcase
+
+    def save_testcase(self):
+        testcase = self._gen_testcase()
+
+        for op, model in testcase.items():
+            model_path = os.path.join(self.model_dir, self.name + '_' + op)
+            model['model'](get_tensor_by_shapes(model['shapes']))
+            keras.models.save_model(model['model'], model_path)
+            testcase[op]['model'] = model_path
+
+        return testcase
+
+    def load_latency(self, testcase):
+        self.latency['block'] = Latency(testcase['block']['latency'])
+
+        for case, ops in self.cases.items():
+            latency_sum = 0
+            for op in ops:
+                if op not in self.latency:
+                    self.latency[op] = Latency(testcase[op]['latency'])
+                latency_sum += self.latency[op]
+            self.latency[case] = latency_sum
+
+    def test(self):
+        true_case_lat_diff = abs(self.latency[self.true_case].avg - self.latency['block'].avg)
+
+        for case, _ in self.cases.items():
+            if case != self.true_case and true_case_lat_diff > abs(self.latency[case].avg - self.latency['block'].avg):
+                return case
+
+        return self.true_case
+
+    def load_config(self):
+        self.input_shape = self.input_shape or config.get('default_input_shape', 'ruletest')
+        self.kernel_size = config.get('kernel_size', 'ruletest')
+        self.filters = config.get('filters', 'ruletest')
+        self.enabled = self.name in config.get('enabled', 'ruletest')
+        self.model_dir = config.get('model_dir', 'ruletest')
+
+        for key, value in config.get('params', 'ruletest').get(self.name, {}).items():
+            setattr(self, key, value)
+
+    @classmethod
+    def _register(cls):
+        if cls.name != '':
+            rules[cls.name] = cls
+
+    def _model_relu(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.ReLU()(input_layer)
+
+        return keras.models.Model(input_layer, x), [self.input_shape]
+
+    def _model_dwconv_relu(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(input_layer)
+        x = keras.layers.ReLU()(x)
+
+        return keras.models.Model(input_layer, x), [self.input_shape]
+
+    def _model_add(self):
+        input_1 = keras.Input(shape=self.input_shape)
+        input_2 = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.Add()([input_1, input_2])
+
+        return keras.models.Model([input_1, input_2], x), [self.input_shape, self.input_shape]
+
+    def _model_dwconv(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(input_layer)
+
+        return keras.models.Model(input_layer, x), [self.input_shape]
+
+    def _model_conv(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.Conv2D(self.filters, self.kernel_size, padding='same')(input_layer)
+
+        return keras.models.Model(input_layer, x), [self.input_shape]
+
+    def _model_block(self):
+        pass
+
+
+class SingleCaseBase(RuleTestBase):
+    false_case = ''
+
+    def test(self):
+        latency_block = self.latency['block']
+        latency_case = self.latency[self.false_case]
+
+        if abs(latency_block.avg - latency_case.avg) < (latency_block.std + latency_case.std):
+            return False
+        else:
+            return True
+
+
+class BasicFusionImpl(RuleTestBase):
+    name = ''
+    cases = {
+        'ops': ['dwconv', 'relu'],
+    }
+    false_case = 'ops'
+
+    def load_config(self):
+        super().load_config()
+        self.enabled = 'BF' in config.get('enabled', 'ruletest')
+        self.eps = config.get('params', 'ruletest')['BF']['eps']
+
+    def test(self):
+        secondary_op_lat = min(lat for op, lat in self.latency.items() if op != 'block' or op != self.false_case)
+        return self.latency[self.false_case].avg - self.latency['block'].avg > self.eps * secondary_op_lat.avg
+
+    def load_latency(self, testcase):
+        self.latency['block'] = Latency(testcase['block']['latency'])
+
+        op1, op2 = self.cases['ops']
+        op1_alias, op2_alias = op1, op2
+
+        if op1_alias == op2_alias:
+            op1_alias += '_1'
+            op2_alias += '_2'
+        
+        self.latency[op1_alias] = Latency(testcase[op1_alias]['latency'])
+        self.latency[op2_alias] = Latency(testcase[op2_alias]['latency'])
+        self.latency['ops'] = self.latency[op1_alias] + self.latency[op2_alias]
+
+    def _gen_testcase(self):
+        testcase = {}
+
+        op1, op2 = self.cases['ops']
+        op1_alias, op2_alias = op1, op2
+
+        if op1_alias == op2_alias:
+            op1_alias += '_1'
+            op2_alias += '_2'
+
+        op1_model, op2_model, block_model, op1_shapes, op2_shapes, block_shapes = get_model_by_ops(op1, op2, self.input_shape)
+        testcase[op1_alias] = {
+            'model': op1_model,
+            'shapes': op1_shapes,
+        }
+        testcase[op2_alias] = {
+            'model': op2_model,
+            'shapes': op2_shapes,
+        }
+        testcase['block'] = {
+            'model': block_model,
+            'shapes': block_shapes,
+        }
+
+        return testcase
+
+
+class BasicFusion(RuleTestBase):
+    name = 'BF'
+
+    layers = [
+        'reshape',
+        'dwconv',
+        'relu',
+        'add',
+        'conv',
+        'concat',
+        'convtrans',
+        'dense',
+        'pooling',
+    ]
+
+    disabled_combinations = [
+        ('dense', 'pooling'),
+        ('dense', 'dwconv'),
+        ('dense', 'conv'),
+        ('dense', 'convtrans'),
+        ('dense', 'reshape'),
+    ]
+
+    d1_required_layers = [
+        'dense',
+    ]
+
+    additional_combinations = [
+        ('conv', 'hswish'),
+        ('conv', 'se'),
+        ('se', 'relu'),
+    ]
+
+    @classmethod
+    def get_combinations(cls):
+        combinations = []
+        for op1 in cls.layers:
+            for op2 in cls.layers:
+                if (op1, op2) not in cls.disabled_combinations and (op2, op1) not in cls.disabled_combinations:
+                    combinations.append((op1, op2))
+        for combi in cls.additional_combinations:
+            combinations.append(combi)
+        return combinations
+
+    @classmethod
+    def _register(cls):
+        for op1, op2 in cls.get_combinations():
+            classname = f'BasicFusion_{op1}_{op2}'
+            name = f'BF_{op1}_{op2}'
+            cases = {
+                'ops': [op1, op2],
+            }
+            if op1 in cls.d1_required_layers or op2 in cls.d1_required_layers:
+                input_shape = config.get('d1_input_shape', 'ruletest')
+            else:
+                input_shape = config.get('default_input_shape', 'ruletest')
+            bf_cls = type(classname, (BasicFusionImpl,), {
+                'name': name,
+                'cases': cases,
+                'input_shape': input_shape,
+            })
+            rules[bf_cls.name] = bf_cls
+
+
+class MultipleOutNodes(RuleTestBase):
+    name = 'MON'
+    cases = {
+        'case1': ['relu_relu', 'relu_dwconv', 'dwconv'],
+        'case2': ['dwconv_relu_relu', 'relu_dwconv'],
+        'case3': ['dwconv_relu', 'dwconv', 'relu_relu']
+    }
+    true_case = 'case1'
+    deps = {
+        'BF_dwconv_relu': True,
+    }
+
+    def _model_block(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(input_layer)
+        branch_1 = keras.layers.ReLU(negative_slope=0)(x)
+        branch_1 = keras.layers.ReLU(negative_slope=0)(branch_1)
+        branch_2 = keras.layers.ReLU(negative_slope=2)(x)
+        branch_2 = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(branch_2)
+
+        return keras.models.Model(input_layer, [branch_1, branch_2]), [self.input_shape]
+
+    def _model_relu_relu(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.ReLU()(input_layer)
+        x = keras.layers.ReLU()(x)
+
+        return keras.models.Model(input_layer, x), [self.input_shape]
+
+    def _model_dwconv_relu_relu(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(input_layer)
+        x = keras.layers.ReLU()(x)
+        x = keras.layers.ReLU()(x)
+
+        return keras.models.Model(input_layer, x), [self.input_shape]
+
+    def _model_relu_dwconv(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.ReLU()(input_layer)
+        x = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(x)
+
+        return keras.models.Model(input_layer, x), [self.input_shape]
+
+
+class ConvBranchContext(SingleCaseBase):
+    name = 'CBC'
+    cases = {
+        'ops': ['conv', 'conv', 'conv', 'concat3'],
+    }
+    false_case = 'ops'
+
+    def _model_block(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        branch_1 = keras.layers.Conv2D(self.filters, self.kernel_size, padding='same')(input_layer)
+        branch_2 = keras.layers.Conv2D(self.filters, self.kernel_size, padding='same')(input_layer)
+        branch_3 = keras.layers.Conv2D(self.filters, self.kernel_size, padding='same')(input_layer)
+
+        output_layer = keras.layers.Concatenate()([branch_1, branch_2, branch_3])
+
+        return keras.models.Model(input_layer, output_layer), [self.input_shape]
+
+    def _model_concat3(self):
+        input_1 = keras.Input(shape=self.input_shape)
+        input_2 = keras.Input(shape=self.input_shape)
+        input_3 = keras.Input(shape=self.input_shape)
+
+        output_layer = keras.layers.Concatenate()([input_1, input_2, input_3])
+
+        return keras.models.Model([input_1, input_2, input_3], output_layer), [self.input_shape, self.input_shape, self.input_shape]
+
+
+class ReLUBranchContext(SingleCaseBase):
+    name = 'RBC'
+    cases = {
+        'ops': ['3xrelu', 'conv'],
+    }
+    false_case = 'ops'
+
+    def _model_block(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.Conv2D(self.filters, self.kernel_size, padding='same')(input_layer)
+
+        branch_1 = keras.layers.ReLU(negative_slope=0)(x)
+        branch_2 = keras.layers.ReLU(negative_slope=0.5)(x)
+        branch_3 = keras.layers.ReLU(negative_slope=2)(x)
+
+        return keras.models.Model(input_layer, [branch_1, branch_2, branch_3]), [self.input_shape]
+
+    def _model_3xrelu(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        branch_1 = keras.layers.ReLU(negative_slope=0)(input_layer)
+        branch_2 = keras.layers.ReLU(negative_slope=0.5)(input_layer)
+        branch_3 = keras.layers.ReLU(negative_slope=2)(input_layer)
+
+        return keras.models.Model(input_layer, [branch_1, branch_2, branch_3]), [self.input_shape]
+
+
+class ReadyTensor(RuleTestBase):
+    name = 'RT'
+    cases = {
+        'case1': ['dwconv_add', 'dwconv', 'dwconv', 'add', 'relu'],
+        'case2': ['dwconv_add_add', 'dwconv', 'dwconv', 'relu'],
+    }
+    true_case = 'case1'
+    deps = {
+        'MON': True,
+        'BF_dwconv_relu': True,
+    }
+
+    def _model_block(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        branch_1 = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(input_layer)
+        branch_2 = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(input_layer)
+        output_1 = keras.layers.Add()([branch_1, branch_2])
+        branch_3 = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(input_layer)
+        output_1 = keras.layers.Add()([branch_3, output_1])
+
+        output_2 = keras.layers.ReLU()(branch_3)
+
+        return keras.Model(input_layer, [output_1, output_2]), [self.input_shape]
+
+    def _model_dwconv_add(self):
+        input_layer = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(input_layer)
+        x = keras.layers.Add()([x, input_layer])
+
+        return keras.models.Model(input_layer, x), [self.input_shape]
+
+    def _model_dwconv_add_add(self):
+        input_1 = keras.Input(shape=self.input_shape)
+        input_2 = keras.Input(shape=self.input_shape)
+
+        x = keras.layers.DepthwiseConv2D(self.kernel_size, padding='same')(input_1)
+        x = keras.layers.Add()([x, input_1])
+        x = keras.layers.Add()([x, input_2])
+
+        return keras.models.Model([input_1, input_2], x), [self.input_shape, self.input_shape]
diff --git a/nn_meter/builder/rule_tester/rule_test/rule_tester/runner.py b/nn_meter/builder/rule_tester/rule_test/rule_tester/runner.py
new file mode 100644
index 00000000..cbf246c4
--- /dev/null
+++ b/nn_meter/builder/rule_tester/rule_test/rule_tester/runner.py
@@ -0,0 +1,60 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT license.
+import networkx as nx
+from .rules import rules
+from ...config_manager import config
+
+
+class RuleTester:
+    def __init__(self):
+        self._rules = rules
+
+    def _build_dep_dag(self):
+        dag = nx.DiGraph()
+
+        for name, cls in self._rules.items():
+            dag.add_node(name)
+            for dep in cls.deps:
+                dag.add_edge(dep, name)
+
+        self._dag = list(nx.topological_sort(dag))
+
+    def generate(self):
+        testcases = {}
+
+        for name, cls in self._rules.items():
+            rule = cls()
+            if rule.enabled:
+                testcases[name] = cls().save_testcase()
+
+        return testcases
+
+    def analyze(self, profile_results):
+        self._build_dep_dag()
+        result = {}
+
+        for name in self._dag:
+            if name not in profile_results:
+                continue
+
+            result[name] = {}
+            rule_cls = self._rules[name]
+
+            obey = True
+            for dep, expect in rule_cls.deps.items():
+                if result[dep]['obey'] != expect:
+                    obey = False
+
+            if obey:
+                rule = rule_cls()
+                rule.load_latency(profile_results[name])
+                obey = rule.test()
+                if config.get('detail', 'ruletest'):
+                    latency = {key: str(value) for key, value in rule.latency.items()}
+                    result[name]['latency'] = latency
+
+            result[name]['obey'] = obey
+
+        return result
+
+
diff --git a/tests/integration_test_torch.py b/tests/integration_test_torch.py
index ad9e9099..afbe237d 100644
--- a/tests/integration_test_torch.py
+++ b/tests/integration_test_torch.py
@@ -42,7 +42,6 @@ def integration_test_onnx_based_torch(model_type, model_list, output_name = "tes
     for pred_name, pred_version in get_predictors():
         try:
             since = time.time()
-
             print(" ".join(['nn-meter', 'lat_pred', '--torchvision'] + model_list + ['--predictor', pred_name, '--predictor-version', pred_version]))
             result = subprocess.run(
                 ['nn-meter', 'lat_pred', '--torchvision'] + model_list + ['--predictor', pred_name, '--predictor-version', pred_version],