├── .gitignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── SECURITY.md ├── SUPPORT.md ├── ThirdPartyNotices.txt ├── data ├── model-onnx │ ├── mediapipe-facemesh │ │ └── model.onnx │ └── test_softmax_axis_0 │ │ └── model.onnx └── model-tfjs │ └── mediapipe-facemesh │ ├── group1-shard1of1.bin │ └── model.json ├── karma.conf.js ├── package-lock.json ├── package.json ├── sample-configs ├── run_config_mediapipe_facemesh.json └── run_config_softmax_test.json ├── src ├── benchmark-utils.ts ├── benchmark.ts ├── index.js ├── ort-schema │ ├── README.md │ └── ort-generated.ts ├── ort-web-benchmark.ts └── tfjs-benchmark.ts ├── tsconfig.json ├── utils └── gen-chrome-trace.ts └── webpack.conf.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | 4 | /src/**/*.js 5 | /src/**/*.js.map 6 | 7 | !/src/index.js 8 | 9 | /utils/**/*.js 10 | /utils/**/*.js.map 11 | /types/ 12 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ONNX Runtime Web Benchmark 2 | A benchmarking tool under development. Current it supports running wasm and webgl backends with profiling for tfjs and ort-web frameworks. 3 | 4 | ## Setup 5 | Change the package version for onnxruntime-web in package.json to point to either an official release or a local build. 6 | i.e. if using local build and onnxruntime's base folder is `~/onnxruntime`, set `onnxruntime-web` dependency in package.json to: 7 | `"onnxruntime-web": "file:~/onnxruntime/js/web"`. 8 | Note that all of the .wasm libraries including threaded and simd.threaded files must exist in the dist folder(js/web/dist) of ort-web. 9 | 10 | If using official release, simply set it with a version number. 11 | 12 | In the root directory, run `npm install` to install all required packages. 13 | 14 | To build the bundle, run `npm run build` in the root directory. 15 | 16 | ## Run 17 | To start benchmarking, run `npm run benchmark`. Users need to provide a runtime configuration file that contains all parameters. By default, it looks for `run_config.json` in the root folder. Some sample configuration files are provided under `/sample-configs`. To pass a custom config, run `npm run benchmark --run_config=path_to_config`. In example, 18 | 19 | ```code 20 | npm run benchmark --run_config=./sample-configs/run_config_softmax_test.json 21 | ``` 22 | 23 | Profiling data can be generated using `npm run profile` command. It will create a chrome-trace event file named trace.json in the root folder. This file can be loaded into `chrome://tracing` for visualization. Note that model files must exist under the `data/` directory in the root. The browser doesn't have access to local file system so files need to be uploaded to the local server when benchmark starts up. All content under `data/` will be served. 24 | 25 | ### Input formats 26 | This tool automatically generates synthetic input data referring to a model input shape. If a shape is not a fixed dimension except batch size, a hint by 'config.ortweb.shape' or 'config.tfjs.shape' can be added into configuration as follows, 27 | 28 | ```code 29 | "ortweb": { 30 | "shape": { 31 | "images:0": [1, 224, 224, 3] 32 | }, 33 | ``` 34 | 35 | ### Input models 36 | #### Ort-web 37 | Only .onnx models are supported as of now. Set config.ortweb.path to the file path. 38 | 39 | #### Tensorflow.js 40 | Tensorflow.js models can be either a layers model or a graph model with model.json and model.bin -> This is the official way provided by TFJS project to load models. It will use `tf.LoadLayeredModel` or `tf.LoadGraphModel` to load the model structure and weights. Set `config.tfjs.path` to the path of `model.json`. The bin file which contains the weights should be in the same directory as `model.json`. 41 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). 40 | 41 | -------------------------------------------------------------------------------- /SUPPORT.md: -------------------------------------------------------------------------------- 1 | # Support 2 | 3 | ## How to file issues and get help 4 | 5 | This project uses GitHub Issues to track bugs and feature requests. Please search the existing 6 | issues before filing new issues to avoid duplicates. For new issues, file your bug or 7 | feature request as a new Issue. 8 | 9 | For help and questions about using this project, please **REPO MAINTAINER: INSERT INSTRUCTIONS HERE 10 | FOR HOW TO ENGAGE REPO OWNERS OR COMMUNITY FOR HELP. COULD BE A STACK OVERFLOW TAG OR OTHER 11 | CHANNEL. WHERE WILL YOU HELP PEOPLE?**. 12 | 13 | ## Microsoft Support Policy 14 | 15 | Support for this **PROJECT or PRODUCT** is limited to the resources listed above. 16 | -------------------------------------------------------------------------------- /ThirdPartyNotices.txt: -------------------------------------------------------------------------------- 1 | THIRD PARTY SOFTWARE NOTICES AND INFORMATION 2 | 3 | Do Not Translate or Localize 4 | 5 | This software incorporates material from third parties. Microsoft makes certain 6 | open source code available at http://3rdpartysource.microsoft.com, or you may 7 | send a check or money order for US $5.00, including the product name, the open 8 | source component name, and version number, to: 9 | 10 | Source Code Compliance Team 11 | Microsoft Corporation 12 | One Microsoft Way 13 | Redmond, WA 98052 14 | USA 15 | 16 | Notwithstanding any other terms, you may reverse engineer this software to the 17 | extent required to debug changes to any libraries licensed under the GNU Lesser 18 | General Public License. 19 | 20 | _______________________________________________________________________________ 21 | 22 | Mediapipe Facemesh 23 | 24 | 25 | Apache License 26 | Version 2.0, January 2004 27 | http://www.apache.org/licenses/ 28 | 29 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 30 | 31 | 1. Definitions. 32 | 33 | "License" shall mean the terms and conditions for use, reproduction, 34 | and distribution as defined by Sections 1 through 9 of this document. 35 | 36 | "Licensor" shall mean the copyright owner or entity authorized by 37 | the copyright owner that is granting the License. 38 | 39 | "Legal Entity" shall mean the union of the acting entity and all 40 | other entities that control, are controlled by, or are under common 41 | control with that entity. For the purposes of this definition, 42 | "control" means (i) the power, direct or indirect, to cause the 43 | direction or management of such entity, whether by contract or 44 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 45 | outstanding shares, or (iii) beneficial ownership of such entity. 46 | 47 | "You" (or "Your") shall mean an individual or Legal Entity 48 | exercising permissions granted by this License. 49 | 50 | "Source" form shall mean the preferred form for making modifications, 51 | including but not limited to software source code, documentation 52 | source, and configuration files. 53 | 54 | "Object" form shall mean any form resulting from mechanical 55 | transformation or translation of a Source form, including but 56 | not limited to compiled object code, generated documentation, 57 | and conversions to other media types. 58 | 59 | "Work" shall mean the work of authorship, whether in Source or 60 | Object form, made available under the License, as indicated by a 61 | copyright notice that is included in or attached to the work 62 | (an example is provided in the Appendix below). 63 | 64 | "Derivative Works" shall mean any work, whether in Source or Object 65 | form, that is based on (or derived from) the Work and for which the 66 | editorial revisions, annotations, elaborations, or other modifications 67 | represent, as a whole, an original work of authorship. For the purposes 68 | of this License, Derivative Works shall not include works that remain 69 | separable from, or merely link (or bind by name) to the interfaces of, 70 | the Work and Derivative Works thereof. 71 | 72 | "Contribution" shall mean any work of authorship, including 73 | the original version of the Work and any modifications or additions 74 | to that Work or Derivative Works thereof, that is intentionally 75 | submitted to Licensor for inclusion in the Work by the copyright owner 76 | or by an individual or Legal Entity authorized to submit on behalf of 77 | the copyright owner. For the purposes of this definition, "submitted" 78 | means any form of electronic, verbal, or written communication sent 79 | to the Licensor or its representatives, including but not limited to 80 | communication on electronic mailing lists, source code control systems, 81 | and issue tracking systems that are managed by, or on behalf of, the 82 | Licensor for the purpose of discussing and improving the Work, but 83 | excluding communication that is conspicuously marked or otherwise 84 | designated in writing by the copyright owner as "Not a Contribution." 85 | 86 | "Contributor" shall mean Licensor and any individual or Legal Entity 87 | on behalf of whom a Contribution has been received by Licensor and 88 | subsequently incorporated within the Work. 89 | 90 | 2. Grant of Copyright License. Subject to the terms and conditions of 91 | this License, each Contributor hereby grants to You a perpetual, 92 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 93 | copyright license to reproduce, prepare Derivative Works of, 94 | publicly display, publicly perform, sublicense, and distribute the 95 | Work and such Derivative Works in Source or Object form. 96 | 97 | 3. Grant of Patent License. Subject to the terms and conditions of 98 | this License, each Contributor hereby grants to You a perpetual, 99 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 100 | (except as stated in this section) patent license to make, have made, 101 | use, offer to sell, sell, import, and otherwise transfer the Work, 102 | where such license applies only to those patent claims licensable 103 | by such Contributor that are necessarily infringed by their 104 | Contribution(s) alone or by combination of their Contribution(s) 105 | with the Work to which such Contribution(s) was submitted. If You 106 | institute patent litigation against any entity (including a 107 | cross-claim or counterclaim in a lawsuit) alleging that the Work 108 | or a Contribution incorporated within the Work constitutes direct 109 | or contributory patent infringement, then any patent licenses 110 | granted to You under this License for that Work shall terminate 111 | as of the date such litigation is filed. 112 | 113 | 4. Redistribution. You may reproduce and distribute copies of the 114 | Work or Derivative Works thereof in any medium, with or without 115 | modifications, and in Source or Object form, provided that You 116 | meet the following conditions: 117 | 118 | (a) You must give any other recipients of the Work or 119 | Derivative Works a copy of this License; and 120 | 121 | (b) You must cause any modified files to carry prominent notices 122 | stating that You changed the files; and 123 | 124 | (c) You must retain, in the Source form of any Derivative Works 125 | that You distribute, all copyright, patent, trademark, and 126 | attribution notices from the Source form of the Work, 127 | excluding those notices that do not pertain to any part of 128 | the Derivative Works; and 129 | 130 | (d) If the Work includes a "NOTICE" text file as part of its 131 | distribution, then any Derivative Works that You distribute must 132 | include a readable copy of the attribution notices contained 133 | within such NOTICE file, excluding those notices that do not 134 | pertain to any part of the Derivative Works, in at least one 135 | of the following places: within a NOTICE text file distributed 136 | as part of the Derivative Works; within the Source form or 137 | documentation, if provided along with the Derivative Works; or, 138 | within a display generated by the Derivative Works, if and 139 | wherever such third-party notices normally appear. The contents 140 | of the NOTICE file are for informational purposes only and 141 | do not modify the License. You may add Your own attribution 142 | notices within Derivative Works that You distribute, alongside 143 | or as an addendum to the NOTICE text from the Work, provided 144 | that such additional attribution notices cannot be construed 145 | as modifying the License. 146 | 147 | You may add Your own copyright statement to Your modifications and 148 | may provide additional or different license terms and conditions 149 | for use, reproduction, or distribution of Your modifications, or 150 | for any such Derivative Works as a whole, provided Your use, 151 | reproduction, and distribution of the Work otherwise complies with 152 | the conditions stated in this License. 153 | 154 | 5. Submission of Contributions. Unless You explicitly state otherwise, 155 | any Contribution intentionally submitted for inclusion in the Work 156 | by You to the Licensor shall be under the terms and conditions of 157 | this License, without any additional terms or conditions. 158 | Notwithstanding the above, nothing herein shall supersede or modify 159 | the terms of any separate license agreement you may have executed 160 | with Licensor regarding such Contributions. 161 | 162 | 6. Trademarks. This License does not grant permission to use the trade 163 | names, trademarks, service marks, or product names of the Licensor, 164 | except as required for reasonable and customary use in describing the 165 | origin of the Work and reproducing the content of the NOTICE file. 166 | 167 | 7. Disclaimer of Warranty. Unless required by applicable law or 168 | agreed to in writing, Licensor provides the Work (and each 169 | Contributor provides its Contributions) on an "AS IS" BASIS, 170 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 171 | implied, including, without limitation, any warranties or conditions 172 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 173 | PARTICULAR PURPOSE. You are solely responsible for determining the 174 | appropriateness of using or redistributing the Work and assume any 175 | risks associated with Your exercise of permissions under this License. 176 | 177 | 8. Limitation of Liability. In no event and under no legal theory, 178 | whether in tort (including negligence), contract, or otherwise, 179 | unless required by applicable law (such as deliberate and grossly 180 | negligent acts) or agreed to in writing, shall any Contributor be 181 | liable to You for damages, including any direct, indirect, special, 182 | incidental, or consequential damages of any character arising as a 183 | result of this License or out of the use or inability to use the 184 | Work (including but not limited to damages for loss of goodwill, 185 | work stoppage, computer failure or malfunction, or any and all 186 | other commercial damages or losses), even if such Contributor 187 | has been advised of the possibility of such damages. 188 | 189 | 9. Accepting Warranty or Additional Liability. While redistributing 190 | the Work or Derivative Works thereof, You may choose to offer, 191 | and charge a fee for, acceptance of support, warranty, indemnity, 192 | or other liability obligations and/or rights consistent with this 193 | License. However, in accepting such obligations, You may act only 194 | on Your own behalf and on Your sole responsibility, not on behalf 195 | of any other Contributor, and only if You agree to indemnify, 196 | defend, and hold each Contributor harmless for any liability 197 | incurred by, or claims asserted against, such Contributor by reason 198 | of your accepting any such warranty or additional liability. 199 | 200 | END OF TERMS AND CONDITIONS 201 | 202 | APPENDIX: How to apply the Apache License to your work. 203 | 204 | To apply the Apache License to your work, attach the following 205 | boilerplate notice, with the fields enclosed by brackets "[]" 206 | replaced with your own identifying information. (Don't include 207 | the brackets!) The text should be enclosed in the appropriate 208 | comment syntax for the file format. We also recommend that a 209 | file or class name and description of purpose be included on the 210 | same "printed page" as the copyright notice for easier 211 | identification within third-party archives. 212 | 213 | Copyright [yyyy] [name of copyright owner] 214 | 215 | Licensed under the Apache License, Version 2.0 (the "License"); 216 | you may not use this file except in compliance with the License. 217 | You may obtain a copy of the License at 218 | 219 | http://www.apache.org/licenses/LICENSE-2.0 220 | 221 | Unless required by applicable law or agreed to in writing, software 222 | distributed under the License is distributed on an "AS IS" BASIS, 223 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 224 | See the License for the specific language governing permissions and 225 | limitations under the License. 226 | 227 | _______________________________________________________________________________ 228 | -------------------------------------------------------------------------------- /data/model-onnx/mediapipe-facemesh/model.onnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/onnxruntime-web-benchmark/9f22806768ca6c0c4c58387843954ed9d275c857/data/model-onnx/mediapipe-facemesh/model.onnx -------------------------------------------------------------------------------- /data/model-onnx/test_softmax_axis_0/model.onnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/onnxruntime-web-benchmark/9f22806768ca6c0c4c58387843954ed9d275c857/data/model-onnx/test_softmax_axis_0/model.onnx -------------------------------------------------------------------------------- /data/model-tfjs/mediapipe-facemesh/group1-shard1of1.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/onnxruntime-web-benchmark/9f22806768ca6c0c4c58387843954ed9d275c857/data/model-tfjs/mediapipe-facemesh/group1-shard1of1.bin -------------------------------------------------------------------------------- /data/model-tfjs/mediapipe-facemesh/model.json: -------------------------------------------------------------------------------- 1 | {"format": "graph-model", "generatedBy": "1.15.0", "convertedBy": "TensorFlow.js Converter v1.5.2", "userDefinedMetadata": {"signature": {"inputs": {"input_1:0": {"name": "input_1:0", "dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "192"}, {"size": "192"}, {"size": "3"}]}}}, "outputs": {"Identity_1:0": {"name": "Identity_1:0", "dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "266"}]}}, "Identity_2:0": {"name": "Identity_2:0", "dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}]}}, "Identity:0": {"name": "Identity:0", "dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1404"}]}}}}}, "modelTopology": {"node": [{"name": "input_1", "op": "Placeholder", "attr": {"dtype": {"type": "DT_FLOAT"}, "shape": {"shape": {"dim": [{"size": "1"}, {"size": "192"}, {"size": "192"}, {"size": "3"}]}}}}, {"name": "StatefulPartitionedCall/model/conv2d/Conv2D_weights", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "3"}, {"size": "16"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d/Conv2D_bn_offset", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "16"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_1/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "16"}, {"size": "16"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_1/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "16"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_2/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "16"}, {"size": "16"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_2/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "16"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_3/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "16"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_19/Conv2D_weights", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}, {"size": "32"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_3/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_4/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_4/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_5/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_19/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_5/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_6/Conv2D_weights", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}, {"size": "64"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_6/Conv2D_bn_offset", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "64"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_7/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "64"}, {"size": "64"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_7/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "64"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_8/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "64"}, {"size": "64"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_8/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "64"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_9/Conv2D_weights", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "64"}, {"size": "128"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_9/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_10/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_10/Conv2D_bn_offset", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_11/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_11/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_12/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_12/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_13/Conv2D_weights", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_13/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_14/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_14/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_15/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_15/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_27/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_27/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_21/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_25/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_21/Conv2D_bn_offset", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_28/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_28/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_16/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_25/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_16/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_22/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_22/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_29/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_29/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_17/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_17/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_23/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_23/Conv2D_bn_offset", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "128"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_18/Conv2D_weights", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_18/Conv2D_bn_offset", "op": "Const", "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_24/Conv2D_weights", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}, {"size": "32"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_24/Conv2D_bn_offset", "op": "Const", "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "32"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "16"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "16"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_1/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "16"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "16"}, {"size": "1"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_2/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "16"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/channel_padding/Pad/paddings", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_INT32", "tensorShape": {"dim": [{"size": "4"}, {"size": "2"}]}}}, "dtype": {"type": "DT_INT32"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "16"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_3/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "32"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_4/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "32"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_5/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/channel_padding_1/Pad/paddings", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_INT32", "tensorShape": {"dim": [{"size": "4"}, {"size": "2"}]}}}, "dtype": {"type": "DT_INT32"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "32"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_6/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "64"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "64"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_7/Neg", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "64"}]}}}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "64"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_8/Neg", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "64"}]}}}}}, {"name": "StatefulPartitionedCall/model/channel_padding_2/Pad/paddings", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_INT32", "tensorShape": {"dim": [{"size": "4"}, {"size": "2"}]}}}, "dtype": {"type": "DT_INT32"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "64"}, {"size": "1"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_9/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_10/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_11/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_12/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_13/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_14/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_15/Neg", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_16/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_17/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_18/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "32"}, {"size": "1"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_19/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_20/Conv2D/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "32"}, {"size": "1404"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_20/BiasAdd/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1404"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/output_mesh/Reshape/shape", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_INT32", "tensorShape": {"dim": [{"size": "2"}]}}}, "dtype": {"type": "DT_INT32"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "32"}, {"size": "1"}]}}}}}, {"name": "StatefulPartitionedCall/model/conv2d_30/BiasAdd/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_30/Conv2D/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "32"}, {"size": "1"}]}}}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_27/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_20/Neg", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_26/Neg", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_21/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_26/BiasAdd/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "266"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "128"}, {"size": "1"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_22/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/conv2d_26/Conv2D/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "32"}, {"size": "266"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise/ReadVariableOp", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "3"}, {"size": "3"}, {"size": "32"}, {"size": "1"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_23/Neg", "op": "Const", "input": ["^input_1"], "attr": {"dtype": {"type": "DT_FLOAT"}, "value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}]}}}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_24/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "32"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_25/Neg", "op": "Const", "input": ["^input_1"], "attr": {"value": {"tensor": {"dtype": "DT_FLOAT", "tensorShape": {"dim": [{"size": "1"}, {"size": "1"}, {"size": "128"}]}}}, "dtype": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["input_1", "StatefulPartitionedCall/model/conv2d/Conv2D_weights", "StatefulPartitionedCall/model/conv2d/Conv2D_bn_offset", "StatefulPartitionedCall/model/p_re_lu/Neg"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "2"}, "epsilon": {"f": 0.0}, "padding": {"s": "U0FNRQ=="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA==", "UHJlbHU="]}}}}, {"name": "Func/StatefulPartitionedCall/output_control_node/_204", "op": "NoOp", "input": ["^StatefulPartitionedCall/model/conv2d_20/BiasAdd/ReadVariableOp", "^StatefulPartitionedCall/model/conv2d_20/Conv2D/ReadVariableOp", "^StatefulPartitionedCall/model/conv2d_26/BiasAdd/ReadVariableOp", "^StatefulPartitionedCall/model/conv2d_26/Conv2D/ReadVariableOp", "^StatefulPartitionedCall/model/conv2d_30/BiasAdd/ReadVariableOp", "^StatefulPartitionedCall/model/conv2d_30/Conv2D/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp", "^StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/batch_normalization_v1/FusedBatchNormV3", "StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp"], "attr": {"padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_1/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d/depthwise", "StatefulPartitionedCall/model/conv2d_1/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_1/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}}}, {"name": "StatefulPartitionedCall/model/add/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_1/FusedBatchNormV3", "StatefulPartitionedCall/model/batch_normalization_v1/FusedBatchNormV3"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_1/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add/add", "StatefulPartitionedCall/model/p_re_lu_1/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_1/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp"], "attr": {"data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_2/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise", "StatefulPartitionedCall/model/conv2d_2/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_2/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/add_1/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_2/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_1/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_2/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_1/add", "StatefulPartitionedCall/model/p_re_lu_2/Neg"]}, {"name": "StatefulPartitionedCall/model/max_pooling2d/MaxPool", "op": "MaxPool", "input": ["StatefulPartitionedCall/model/p_re_lu_2/Relu"], "attr": {"strides": {"list": {"i": ["1", "2", "2", "1"]}}, "data_format": {"s": "TkhXQw=="}, "ksize": {"list": {"i": ["1", "2", "2", "1"]}}, "padding": {"s": "VkFMSUQ="}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_2/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp"], "attr": {"strides": {"list": {"i": ["1", "2", "2", "1"]}}, "data_format": {"s": "TkhXQw=="}, "padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/channel_padding/Pad", "op": "Pad", "input": ["StatefulPartitionedCall/model/max_pooling2d/MaxPool", "StatefulPartitionedCall/model/channel_padding/Pad/paddings"], "attr": {"T": {"type": "DT_FLOAT"}, "Tpaddings": {"type": "DT_INT32"}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_3/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise", "StatefulPartitionedCall/model/conv2d_3/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_3/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/add_2/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_3/FusedBatchNormV3", "StatefulPartitionedCall/model/channel_padding/Pad"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_3/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_2/add", "StatefulPartitionedCall/model/p_re_lu_3/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_3/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp"], "attr": {"T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_4/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise", "StatefulPartitionedCall/model/conv2d_4/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_4/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}}}, {"name": "StatefulPartitionedCall/model/add_3/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_4/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_3/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_4/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_3/add", "StatefulPartitionedCall/model/p_re_lu_4/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_4/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp"], "attr": {"T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_5/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise", "StatefulPartitionedCall/model/conv2d_5/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_5/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/add_4/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_5/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_4/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_5/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_4/add", "StatefulPartitionedCall/model/p_re_lu_5/Neg"]}, {"name": "StatefulPartitionedCall/model/max_pooling2d_1/MaxPool", "op": "MaxPool", "input": ["StatefulPartitionedCall/model/p_re_lu_5/Relu"], "attr": {"T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}, "ksize": {"list": {"i": ["1", "2", "2", "1"]}}, "padding": {"s": "VkFMSUQ="}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_5/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp"], "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}}}, {"name": "StatefulPartitionedCall/model/channel_padding_1/Pad", "op": "Pad", "input": ["StatefulPartitionedCall/model/max_pooling2d_1/MaxPool", "StatefulPartitionedCall/model/channel_padding_1/Pad/paddings"], "attr": {"T": {"type": "DT_FLOAT"}, "Tpaddings": {"type": "DT_INT32"}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_6/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise", "StatefulPartitionedCall/model/conv2d_6/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_6/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}}}, {"name": "StatefulPartitionedCall/model/add_5/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_6/FusedBatchNormV3", "StatefulPartitionedCall/model/channel_padding_1/Pad"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_6/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_5/add", "StatefulPartitionedCall/model/p_re_lu_6/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_6/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp"], "attr": {"padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_7/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise", "StatefulPartitionedCall/model/conv2d_7/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_7/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}}}, {"name": "StatefulPartitionedCall/model/add_6/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_7/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_6/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_7/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_6/add", "StatefulPartitionedCall/model/p_re_lu_7/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_7/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp"], "attr": {"padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_8/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise", "StatefulPartitionedCall/model/conv2d_8/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_8/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/add_7/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_8/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_7/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_8/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_7/add", "StatefulPartitionedCall/model/p_re_lu_8/Neg"]}, {"name": "StatefulPartitionedCall/model/max_pooling2d_2/MaxPool", "op": "MaxPool", "input": ["StatefulPartitionedCall/model/p_re_lu_8/Relu"], "attr": {"ksize": {"list": {"i": ["1", "2", "2", "1"]}}, "padding": {"s": "VkFMSUQ="}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}, "data_format": {"s": "TkhXQw=="}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_8/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp"], "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}}}, {"name": "StatefulPartitionedCall/model/channel_padding_2/Pad", "op": "Pad", "input": ["StatefulPartitionedCall/model/max_pooling2d_2/MaxPool", "StatefulPartitionedCall/model/channel_padding_2/Pad/paddings"], "attr": {"T": {"type": "DT_FLOAT"}, "Tpaddings": {"type": "DT_INT32"}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_9/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise", "StatefulPartitionedCall/model/conv2d_9/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_9/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/add_8/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_9/FusedBatchNormV3", "StatefulPartitionedCall/model/channel_padding_2/Pad"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_9/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_8/add", "StatefulPartitionedCall/model/p_re_lu_9/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_9/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp"], "attr": {"T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_10/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise", "StatefulPartitionedCall/model/conv2d_10/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_10/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/add_9/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_10/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_9/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_10/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_9/add", "StatefulPartitionedCall/model/p_re_lu_10/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_10/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp"], "attr": {"T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_11/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise", "StatefulPartitionedCall/model/conv2d_11/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_11/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}}}, {"name": "StatefulPartitionedCall/model/add_10/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_11/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_10/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_11/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_10/add", "StatefulPartitionedCall/model/p_re_lu_11/Neg"]}, {"name": "StatefulPartitionedCall/model/max_pooling2d_3/MaxPool", "op": "MaxPool", "input": ["StatefulPartitionedCall/model/p_re_lu_11/Relu"], "attr": {"T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}, "data_format": {"s": "TkhXQw=="}, "ksize": {"list": {"i": ["1", "2", "2", "1"]}}, "padding": {"s": "VkFMSUQ="}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_11/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp"], "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}, "data_format": {"s": "TkhXQw=="}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_12/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise", "StatefulPartitionedCall/model/conv2d_12/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_12/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}}}, {"name": "StatefulPartitionedCall/model/add_11/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_12/FusedBatchNormV3", "StatefulPartitionedCall/model/max_pooling2d_3/MaxPool"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_12/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_11/add", "StatefulPartitionedCall/model/p_re_lu_12/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_12/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp"], "attr": {"data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_13/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise", "StatefulPartitionedCall/model/conv2d_13/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_13/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/add_12/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_13/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_12/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_13/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_12/add", "StatefulPartitionedCall/model/p_re_lu_13/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_13/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp"], "attr": {"T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_14/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise", "StatefulPartitionedCall/model/conv2d_14/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_14/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/add_13/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_14/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_13/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_14/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_13/add", "StatefulPartitionedCall/model/p_re_lu_14/Neg"]}, {"name": "StatefulPartitionedCall/model/max_pooling2d_4/MaxPool", "op": "MaxPool", "input": ["StatefulPartitionedCall/model/p_re_lu_14/Relu"], "attr": {"data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}, "ksize": {"list": {"i": ["1", "2", "2", "1"]}}, "padding": {"s": "VkFMSUQ="}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_14/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp"], "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}, "data_format": {"s": "TkhXQw=="}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_14/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise/ReadVariableOp"], "attr": {"T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_14/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise/ReadVariableOp"], "attr": {"T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "2", "2", "1"]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_15/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise", "StatefulPartitionedCall/model/conv2d_15/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_15/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_25/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise", "StatefulPartitionedCall/model/conv2d_27/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_27/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_20/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise", "StatefulPartitionedCall/model/conv2d_21/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_21/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/add_14/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_15/FusedBatchNormV3", "StatefulPartitionedCall/model/max_pooling2d_4/MaxPool"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/add_22/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_25/FusedBatchNormV3", "StatefulPartitionedCall/model/max_pooling2d_4/MaxPool"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/add_18/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_20/FusedBatchNormV3", "StatefulPartitionedCall/model/max_pooling2d_4/MaxPool"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_15/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_14/add", "StatefulPartitionedCall/model/p_re_lu_15/Neg"]}, {"name": "StatefulPartitionedCall/model/p_re_lu_25/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_22/add", "StatefulPartitionedCall/model/p_re_lu_25/Neg"]}, {"name": "StatefulPartitionedCall/model/p_re_lu_20/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_18/add", "StatefulPartitionedCall/model/p_re_lu_20/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_15/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp"], "attr": {"strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_26/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/p_re_lu_25/Relu", "StatefulPartitionedCall/model/conv2d_28/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_28/Conv2D_bn_offset", "StatefulPartitionedCall/model/p_re_lu_26/Neg"], "device": "/device:CPU:0", "attr": {"T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "2"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA==", "UHJlbHU="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_20/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise/ReadVariableOp"], "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_16/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise", "StatefulPartitionedCall/model/conv2d_16/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_16/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_21/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise", "StatefulPartitionedCall/model/conv2d_22/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_22/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/add_15/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_16/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_15/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/add_19/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_21/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_20/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_16/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_15/add", "StatefulPartitionedCall/model/p_re_lu_16/Neg"]}, {"name": "StatefulPartitionedCall/model/p_re_lu_21/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_19/add", "StatefulPartitionedCall/model/p_re_lu_21/Neg"]}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_26/FusedBatchNormV3", "StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise/ReadVariableOp"], "attr": {"padding": {"s": "U0FNRQ=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_27/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise", "StatefulPartitionedCall/model/conv2d_29/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_29/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_16/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise/ReadVariableOp"], "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}}}, {"name": "StatefulPartitionedCall/model/add_23/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_27/FusedBatchNormV3", "StatefulPartitionedCall/model/batch_normalization_v1_26/FusedBatchNormV3"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/p_re_lu_21/Relu", "StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise/ReadVariableOp"], "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_17/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise", "StatefulPartitionedCall/model/conv2d_17/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_17/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_27/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_23/add", "StatefulPartitionedCall/model/p_re_lu_27/Neg"]}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_22/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise", "StatefulPartitionedCall/model/conv2d_23/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_23/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/add_16/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_17/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_16/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/add_20/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_22/FusedBatchNormV3", "StatefulPartitionedCall/model/p_re_lu_21/Relu"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_17/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_16/add", "StatefulPartitionedCall/model/p_re_lu_17/Neg"]}, {"name": "StatefulPartitionedCall/model/p_re_lu_22/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_20/add", "StatefulPartitionedCall/model/p_re_lu_22/Neg"]}, {"name": "StatefulPartitionedCall/model/conv2d_30/BiasAdd", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/p_re_lu_27/Relu", "StatefulPartitionedCall/model/conv2d_30/Conv2D/ReadVariableOp", "StatefulPartitionedCall/model/conv2d_30/BiasAdd/ReadVariableOp"], "device": "/device:CPU:0", "attr": {"fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "3", "3", "1"]}}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}}}, {"name": "StatefulPartitionedCall/model/activation/Sigmoid", "op": "Sigmoid", "input": ["StatefulPartitionedCall/model/conv2d_30/BiasAdd"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_18/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/p_re_lu_17/Relu", "StatefulPartitionedCall/model/conv2d_18/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_18/Conv2D_bn_offset", "StatefulPartitionedCall/model/p_re_lu_18/Neg"], "device": "/device:CPU:0", "attr": {"strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "2"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA==", "UHJlbHU="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/output_faceflag/Reshape", "op": "Reshape", "input": ["StatefulPartitionedCall/model/activation/Sigmoid", "StatefulPartitionedCall/model/output_mesh/Reshape/shape"], "attr": {"T": {"type": "DT_FLOAT"}, "Tshape": {"type": "DT_INT32"}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_23/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/p_re_lu_22/Relu", "StatefulPartitionedCall/model/conv2d_24/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_24/Conv2D_bn_offset", "StatefulPartitionedCall/model/p_re_lu_23/Neg"], "device": "/device:CPU:0", "attr": {"epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA==", "UHJlbHU="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "2"}}}, {"name": "Identity_2", "op": "Identity", "input": ["StatefulPartitionedCall/model/output_faceflag/Reshape", "^Func/StatefulPartitionedCall/output_control_node/_204"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_18/FusedBatchNormV3", "StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise/ReadVariableOp"], "attr": {"T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}}}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise", "op": "DepthwiseConv2dNative", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_23/FusedBatchNormV3", "StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise/ReadVariableOp"], "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "padding": {"s": "U0FNRQ=="}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_19/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise", "StatefulPartitionedCall/model/conv2d_19/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_19/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/batch_normalization_v1_24/FusedBatchNormV3", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise", "StatefulPartitionedCall/model/conv2d_25/Conv2D_weights", "StatefulPartitionedCall/model/conv2d_25/Conv2D_bn_offset"], "device": "/device:CPU:0", "attr": {"epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}, "dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "1", "1", "1"]}}, "data_format": {"s": "TkhXQw=="}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}}}, {"name": "StatefulPartitionedCall/model/add_17/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_19/FusedBatchNormV3", "StatefulPartitionedCall/model/batch_normalization_v1_18/FusedBatchNormV3"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/add_21/add", "op": "AddV2", "input": ["StatefulPartitionedCall/model/batch_normalization_v1_24/FusedBatchNormV3", "StatefulPartitionedCall/model/batch_normalization_v1_23/FusedBatchNormV3"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "StatefulPartitionedCall/model/p_re_lu_19/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_17/add", "StatefulPartitionedCall/model/p_re_lu_19/Neg"]}, {"name": "StatefulPartitionedCall/model/p_re_lu_24/Relu", "op": "Prelu", "input": ["StatefulPartitionedCall/model/add_21/add", "StatefulPartitionedCall/model/p_re_lu_24/Neg"]}, {"name": "StatefulPartitionedCall/model/conv2d_20/BiasAdd", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/p_re_lu_19/Relu", "StatefulPartitionedCall/model/conv2d_20/Conv2D/ReadVariableOp", "StatefulPartitionedCall/model/conv2d_20/BiasAdd/ReadVariableOp"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "data_format": {"s": "TkhXQw=="}, "strides": {"list": {"i": ["1", "3", "3", "1"]}}, "use_cudnn_on_gpu": {"b": true}, "explicit_paddings": {"list": {}}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/conv2d_26/BiasAdd", "op": "_FusedConv2D", "input": ["StatefulPartitionedCall/model/p_re_lu_24/Relu", "StatefulPartitionedCall/model/conv2d_26/Conv2D/ReadVariableOp", "StatefulPartitionedCall/model/conv2d_26/BiasAdd/ReadVariableOp"], "device": "/device:CPU:0", "attr": {"dilations": {"list": {"i": ["1", "1", "1", "1"]}}, "T": {"type": "DT_FLOAT"}, "strides": {"list": {"i": ["1", "3", "3", "1"]}}, "data_format": {"s": "TkhXQw=="}, "explicit_paddings": {"list": {}}, "use_cudnn_on_gpu": {"b": true}, "num_args": {"i": "1"}, "epsilon": {"f": 0.0}, "padding": {"s": "VkFMSUQ="}, "fused_ops": {"list": {"s": ["Qmlhc0FkZA=="]}}}}, {"name": "StatefulPartitionedCall/model/output_mesh/Reshape", "op": "Reshape", "input": ["StatefulPartitionedCall/model/conv2d_20/BiasAdd", "StatefulPartitionedCall/model/output_mesh/Reshape/shape"], "attr": {"T": {"type": "DT_FLOAT"}, "Tshape": {"type": "DT_INT32"}}}, {"name": "StatefulPartitionedCall/model/output_contours/Reshape", "op": "Reshape", "input": ["StatefulPartitionedCall/model/conv2d_26/BiasAdd", "StatefulPartitionedCall/model/output_mesh/Reshape/shape"], "attr": {"T": {"type": "DT_FLOAT"}, "Tshape": {"type": "DT_INT32"}}}, {"name": "Identity", "op": "Identity", "input": ["StatefulPartitionedCall/model/output_mesh/Reshape", "^Func/StatefulPartitionedCall/output_control_node/_204"], "attr": {"T": {"type": "DT_FLOAT"}}}, {"name": "Identity_1", "op": "Identity", "input": ["StatefulPartitionedCall/model/output_contours/Reshape", "^Func/StatefulPartitionedCall/output_control_node/_204"], "attr": {"T": {"type": "DT_FLOAT"}}}], "versions": {"producer": 134}}, "weightsManifest": [{"paths": ["group1-shard1of1.bin"], "weights": [{"name": "StatefulPartitionedCall/model/conv2d/Conv2D_weights", "shape": [3, 3, 3, 16], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d/Conv2D_bn_offset", "shape": [16], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_1/Conv2D_weights", "shape": [1, 1, 16, 16], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_1/Conv2D_bn_offset", "shape": [16], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_2/Conv2D_weights", "shape": [1, 1, 16, 16], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_2/Conv2D_bn_offset", "shape": [16], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_3/Conv2D_weights", "shape": [1, 1, 16, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_19/Conv2D_weights", "shape": [1, 1, 32, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_3/Conv2D_bn_offset", "shape": [32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_4/Conv2D_weights", "shape": [1, 1, 32, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_4/Conv2D_bn_offset", "shape": [32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_5/Conv2D_weights", "shape": [1, 1, 32, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_19/Conv2D_bn_offset", "shape": [32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_5/Conv2D_bn_offset", "shape": [32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_6/Conv2D_weights", "shape": [1, 1, 32, 64], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_6/Conv2D_bn_offset", "shape": [64], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_7/Conv2D_weights", "shape": [1, 1, 64, 64], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_7/Conv2D_bn_offset", "shape": [64], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_8/Conv2D_weights", "shape": [1, 1, 64, 64], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_8/Conv2D_bn_offset", "shape": [64], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_9/Conv2D_weights", "shape": [1, 1, 64, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_9/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_10/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_10/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_11/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_11/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_12/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_12/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_13/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_13/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_14/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_14/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_15/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_15/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_27/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_27/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_21/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_25/Conv2D_weights", "shape": [1, 1, 32, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_21/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_28/Conv2D_weights", "shape": [1, 1, 128, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_28/Conv2D_bn_offset", "shape": [32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_16/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_25/Conv2D_bn_offset", "shape": [32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_16/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_22/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_22/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_29/Conv2D_weights", "shape": [1, 1, 32, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_29/Conv2D_bn_offset", "shape": [32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_17/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_17/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_23/Conv2D_weights", "shape": [1, 1, 128, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_23/Conv2D_bn_offset", "shape": [128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_18/Conv2D_weights", "shape": [1, 1, 128, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_18/Conv2D_bn_offset", "shape": [32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_24/Conv2D_weights", "shape": [1, 1, 128, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_24/Conv2D_bn_offset", "shape": [32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu/Neg", "shape": [1, 1, 16], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp", "shape": [3, 3, 16, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_1/Neg", "shape": [1, 1, 16], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp", "shape": [3, 3, 16, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_2/Neg", "shape": [1, 1, 16], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/channel_padding/Pad/paddings", "shape": [4, 2], "dtype": "int32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp", "shape": [3, 3, 16, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_3/Neg", "shape": [1, 1, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp", "shape": [3, 3, 32, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_4/Neg", "shape": [1, 1, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp", "shape": [3, 3, 32, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_5/Neg", "shape": [1, 1, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/channel_padding_1/Pad/paddings", "shape": [4, 2], "dtype": "int32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp", "shape": [3, 3, 32, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_6/Neg", "shape": [1, 1, 64], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp", "shape": [3, 3, 64, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_7/Neg", "shape": [1, 1, 64], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp", "shape": [3, 3, 64, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_8/Neg", "shape": [1, 1, 64], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/channel_padding_2/Pad/paddings", "shape": [4, 2], "dtype": "int32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp", "shape": [3, 3, 64, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_9/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_10/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_11/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_12/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_13/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_14/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_15/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_16/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_17/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_18/Neg", "shape": [1, 1, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise/ReadVariableOp", "shape": [3, 3, 32, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_19/Neg", "shape": [1, 1, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_20/Conv2D/ReadVariableOp", "shape": [3, 3, 32, 1404], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_20/BiasAdd/ReadVariableOp", "shape": [1404], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/output_mesh/Reshape/shape", "shape": [2], "dtype": "int32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise/ReadVariableOp", "shape": [3, 3, 32, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_30/BiasAdd/ReadVariableOp", "shape": [1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_30/Conv2D/ReadVariableOp", "shape": [3, 3, 32, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_27/Neg", "shape": [1, 1, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_20/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_26/Neg", "shape": [1, 1, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_21/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_26/BiasAdd/ReadVariableOp", "shape": [266], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise/ReadVariableOp", "shape": [3, 3, 128, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_22/Neg", "shape": [1, 1, 128], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/conv2d_26/Conv2D/ReadVariableOp", "shape": [3, 3, 32, 266], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise/ReadVariableOp", "shape": [3, 3, 32, 1], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_23/Neg", "shape": [1, 1, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_24/Neg", "shape": [1, 1, 32], "dtype": "float32"}, {"name": "StatefulPartitionedCall/model/p_re_lu_25/Neg", "shape": [1, 1, 128], "dtype": "float32"}]}]} -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft Corporation. All rights reserved. 2 | // Licensed under the MIT license. 3 | 4 | 'use strict'; 5 | 6 | // Karma configuration 7 | const path = require('path') 8 | const fs = require('fs'); 9 | 10 | module.exports = function(config) { 11 | let runConfigFile = config.run_config ? config.run_config : 'run_config.json'; 12 | if (!fs.existsSync(runConfigFile) && !fs.existsSync(path.resolve(__dirname, runConfigFile))){ 13 | runConfigFile = 'run_config.json'; 14 | if(!fs.existsSync(path.resolve(__dirname, runConfigFile))) { 15 | throw new Error("Couldn't find any configuration file. Set a configuration as '--run_config='or put run_config.json in root."); 16 | } 17 | } 18 | 19 | const configFileObj = require(path.resolve(__dirname, runConfigFile)); 20 | const runWebGpu = configFileObj && Array.isArray(configFileObj.backendsToTest) && configFileObj.backendsToTest.indexOf('webgpu') > -1; 21 | 22 | const chromeBrowserNameBase = runWebGpu ? 'ChromeCanary' : 'Chrome'; 23 | const chromeBrowserTestFlags = ['--window-size=1,1', '--enable-features=SharedArrayBuffer']; 24 | if (runWebGpu) { chromeBrowserTestFlags.push('--enable-unsafe-webgpu') } 25 | const chromeBrowserDebugFlags = ['--remote-debugging-port=9333', '--enable-features=SharedArrayBuffer']; 26 | if (runWebGpu) { chromeBrowserDebugFlags.push('--enable-unsafe-webgpu') } 27 | 28 | config.set({ 29 | basePath: './', 30 | frameworks: ['mocha'], 31 | files: [ 32 | { pattern: 'dist/tf.min.js' }, 33 | { pattern: 'dist/tf-backend-wasm.min.js' }, 34 | { pattern: 'dist/tf-backend-webgpu.min.js' }, 35 | { pattern: 'dist/ort-common.min.js' }, 36 | { pattern: 'dist/ort-web.min.js' }, 37 | { pattern: 'dist/main.js' }, 38 | { pattern: 'dist/ort-wasm.wasm', included: false}, 39 | { pattern: 'dist/ort-wasm-simd.wasm', included: false}, 40 | { pattern: 'dist/ort-wasm-threaded.wasm', included: false}, 41 | { pattern: 'dist/ort-wasm-threaded.worker.js', included: false}, 42 | { pattern: 'dist/ort-wasm-simd-threaded.wasm', included: false}, 43 | { pattern: 'dist/tfjs-backend-wasm-simd.wasm', included: false, nocache: true}, 44 | { pattern: 'dist/tfjs-backend-wasm-threaded-simd.wasm', included: false, nocache: true}, 45 | { pattern: 'dist/tfjs-backend-wasm.wasm', included: false, nocache: true}, 46 | { pattern: 'data/**/*', watched: false, included: false, served: true, nocache: true }, 47 | { pattern: runConfigFile, watched: false, included: false, served: true, nocache: true} 48 | ], 49 | proxies: { 50 | '/ort-wasm.wasm': '/base/dist/ort-wasm.wasm', 51 | '/ort-wasm-simd.wasm': '/base/dist/ort-wasm-simd.wasm', 52 | '/ort-wasm-threaded.wasm': '/base/dist/ort-wasm-threaded.wasm', 53 | '/ort-wasm-simd-threaded.wasm': '/base/dist/ort-wasm-simd-threaded.wasm', 54 | '/ort-wasm-threaded.worker.js': '/base/dist/ort-wasm-threaded.worker.js', 55 | '/tfjs-backend-wasm-simd.wasm': '/base/dist/tfjs-backend-wasm-simd.wasm', 56 | '/tfjs-backend-wasm-threaded-simd.wasm': '/base/dist/tfjs-backend-wasm-threaded-simd.wasm', 57 | '/tfjs-backend-wasm.wasm': '/base/dist/tfjs-backend-wasm.wasm' 58 | }, 59 | mime: { 60 | "text/x-typescript": ["ts"], 61 | }, 62 | exclude: [ 63 | ], 64 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 65 | preprocessors: { 66 | }, 67 | reporters: ['mocha'], 68 | captureTimeout: 120000, 69 | reportSlowerThan: 100, 70 | browserDisconnectTimeout: 600000, 71 | browserNoActivityTimeout: 300000, 72 | browserDisconnectTolerance: 0, 73 | browserSocketTimeout: 60000, 74 | logLevel: config.LOG_VERBOSE, 75 | customLaunchers: { 76 | ChromeTest: {base: chromeBrowserNameBase, flags: chromeBrowserTestFlags}, 77 | ChromeDebug: {debug: true, base: chromeBrowserNameBase, flags: chromeBrowserDebugFlags} 78 | }, 79 | client: { 80 | captureConsole: true, 81 | mocha: {expose: ['body'], timeout: 3000000}, 82 | browser: config.browsers, 83 | printMatches: false, 84 | // To use custom config, run 'npm run benchmark --run_config=config_file_name' 85 | runConfig: runConfigFile, 86 | profile: config.profile 87 | }, 88 | browsers: ['ChromeTest', 'ChromeDebug', 'Edge', 'Safari'], 89 | browserConsoleLogOptions: {level: "debug", format: "%b %T: %m", terminal: true} 90 | }); 91 | } 92 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ort-web-benchmarks", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "./src/index.js", 6 | "scripts": { 7 | "build": "tsc && webpack --config ./webpack.conf.js --mode production", 8 | "build-debug": "tsc && webpack --config ./webpack.conf.js --mode development", 9 | "benchmark": "cross-var karma start --browsers ChromeTest --single-run --run_config=$npm_config_run_config", 10 | "service": "cross-var karma start --no-browsers --run_config=$npm_config_run_config", 11 | "profile": "cross-var karma start --browsers ChromeTest --single-run --profile --run_config=$npm_config_run_config > output.txt && tsc && node utils/gen-chrome-trace < output.txt", 12 | "test-debug": "cross-var karma start --browsers ChromeDebug --run_config=$npm_config_run_config", 13 | "test-edge": "cross-var karma start --browsers Edge --single-run --run_config=$npm_config_run_config", 14 | "test-safari": "cross-var karma start --browsers Safari --single-run --run_config=$npm_config_run_config" 15 | }, 16 | "keywords": [ 17 | "benchmark" 18 | ], 19 | "author": "", 20 | "license": "ISC", 21 | "devDependencies": { 22 | "@types/flatbuffers": "^1.10.0", 23 | "@types/karma": "^6.3.1", 24 | "blueimp-load-image": "^2.19.0", 25 | "karma": "^6.3.2", 26 | "karma-chrome-launcher": "^3.1.0", 27 | "karma-edge-launcher": "^0.4.2", 28 | "karma-mocha": "^2.0.1", 29 | "karma-mocha-reporter": "^2.2.5", 30 | "karma-requirejs": "^1.1.0", 31 | "karma-safari-launcher": "^1.0.0", 32 | "mocha": "^10.0.0", 33 | "requirejs": "^2.3.6", 34 | "ts-loader": "^9.3.1", 35 | "webpack": "^5.81.0", 36 | "webpack-cli": "^4.10.0" 37 | }, 38 | "dependencies": { 39 | "@tensorflow/tfjs": "^3.19.0", 40 | "@tensorflow/tfjs-backend-wasm": "^3.19.0", 41 | "@tensorflow/tfjs-backend-webgpu": "^0.0.1-alpha.12", 42 | "cross-var": "^1.1.0", 43 | "flatbuffers": "^1.12.0", 44 | "lodash": "^4.17.11", 45 | "ndarray": "^1.0.18", 46 | "ndarray-ops": "^1.2.2", 47 | "onnx-proto": "^8.0.1", 48 | "onnxruntime-web": "^1.15.0", 49 | "typescript": "^4.4.2" 50 | }, 51 | "optionalDependencies": { 52 | "fsevents": "2.3.2" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /sample-configs/run_config_mediapipe_facemesh.json: -------------------------------------------------------------------------------- 1 | { 2 | "benchmarkName": "mediapipe facemesh", 3 | "frameworksToTest": ["tensorflow.js", "ort-web"], 4 | "backendsToTest": ["wasm", "webgl"], 5 | "warmupIteration": 5, 6 | "runIteration": 25, 7 | "logLevel": "error", 8 | "debug": false, 9 | "ortweb": { 10 | "path" : "data/model-onnx/mediapipe-facemesh/model.onnx", 11 | "webgl": { 12 | "pack": true, 13 | "textureCacheMode": "", 14 | "matmulMaxBatchSize": "", 15 | "contextId": "" 16 | }, 17 | "wasm": { 18 | "numThreads": 0, 19 | "initTimeout": 0, 20 | "simd": true 21 | } 22 | }, 23 | "tfjs": { 24 | "path" : "data/model-tfjs/mediapipe-facemesh/model.json", 25 | "shape": { 26 | "input_1": [1, 192, 192, 3] 27 | }, 28 | "webgl": { 29 | "pack": true 30 | }, 31 | "wasm": { 32 | "numThreads": 0, 33 | "simd": true 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /sample-configs/run_config_softmax_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "benchmarkName": "onnx-softmax", 3 | "frameworksToTest": ["ort-web"], 4 | "backendsToTest": ["wasm", "webgl"], 5 | "warmupIteration": 5, 6 | "runIteration": 25, 7 | "logLevel": "warning", 8 | "debug": false, 9 | "ortweb": { 10 | "path" : "data/model-onnx/test_softmax_axis_0/model.onnx", 11 | "webgl": { 12 | "pack": true, 13 | "textureCacheMode": "", 14 | "matmulMaxBatchSize": "", 15 | "contextId": "" 16 | }, 17 | "wasm": { 18 | "numThreads": 0, 19 | "initTimeout": 0, 20 | "simd": true 21 | } 22 | }, 23 | "tfjs": { 24 | "path" : "", 25 | "webgl": { 26 | "pack": true 27 | }, 28 | "wasm": { 29 | "numThreads": 0, 30 | "simd": true 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/benchmark-utils.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft Corporation. All rights reserved. 2 | // Licensed under the MIT license. 3 | 4 | 'use strict'; 5 | 6 | import {OrtWebBenchmark} from './ort-web-benchmark'; 7 | import {TensorFlowBenchmark} from './tfjs-benchmark'; 8 | 9 | export interface BenchmarkResult { 10 | framework: string; 11 | backend: string; 12 | actualBackend: string; 13 | avg: number; 14 | p50: number; 15 | p95: number; 16 | p99: number; 17 | min: number; 18 | max: number; 19 | webglPack: boolean; 20 | wasmThreads: boolean|number; 21 | wasmSimd: boolean; 22 | } 23 | 24 | export class EnvironmentFlags{ 25 | webglPack: boolean; 26 | wasmThreads: boolean|number; 27 | wasmSimd: boolean; 28 | actualBackend: string; 29 | } 30 | 31 | export const readTextFile = async (file: string): Promise => { 32 | var xhr = new XMLHttpRequest(); 33 | return new Promise(function(resolve) { 34 | xhr.overrideMimeType("application/json"); 35 | xhr.open("GET", file, true); 36 | xhr.onreadystatechange = function() { 37 | if (xhr.readyState === 4 && xhr.status === 200) { 38 | resolve(xhr.responseText); 39 | } 40 | } 41 | xhr.send(null) 42 | }); 43 | } 44 | 45 | const createBenchmark = (framework: string): TensorFlowBenchmark|OrtWebBenchmark => { 46 | switch (framework) { 47 | case 'tensorflow.js': 48 | return new TensorFlowBenchmark(); 49 | case 'ort-web': 50 | return new OrtWebBenchmark(); 51 | default: 52 | throw new Error("'tensorflow-js' and 'ort-web' are supported."); 53 | } 54 | } 55 | 56 | export const runBenchmark = async (config: any, framework: string, backend: string, profile: boolean): Promise => { 57 | console.log(`runBenchmark is being called on ${backend} of ${framework}`); 58 | 59 | const benchmark = createBenchmark(framework); 60 | await benchmark.init(config, backend, profile); 61 | const environmentFlags = await benchmark.getEnvironmentFlags(); 62 | const durations = []; 63 | 64 | if (config.warmupIteration && config.warmupIteration > 0) { 65 | console.log("Running warmup..."); 66 | for(let i = 0 ; i < config.warmupIteration; i++) { 67 | await benchmark.run(); 68 | } 69 | console.log("Warmup done"); 70 | } 71 | 72 | let end_time = 0; 73 | if (config.min_queries > 0 && config.min_duration > 0) { 74 | // mlperf style min_queries and min_duration number of iterations 75 | config.runIteration = Number.MAX_VALUE; 76 | end_time = performance.now() + config.min_duration * 1000; 77 | console.log(`Running for at least ${config.min_queries} iterations and ${config.min_duration} seconds.`); 78 | } else { 79 | console.log(`Running ${config.runIteration} iterations.`); 80 | } 81 | 82 | 83 | for (let i = 0 ; i < config.runIteration; i++) { 84 | const start = performance.now(); 85 | await benchmark.run(); 86 | const now = performance.now(); 87 | durations.push(now - start); 88 | if (now > end_time && i > config.min_queries) 89 | break; 90 | } 91 | 92 | if (profile) { 93 | benchmark.endProfiling(); 94 | } 95 | 96 | durations.shift(); 97 | const sum = durations.reduce((a, b) => a + b); 98 | const avg = sum / durations.length; 99 | const min = Math.min(...durations); 100 | const max = Math.max(...durations); 101 | const p50 = calculatePercentile(50, durations); 102 | const p95 = calculatePercentile(95, durations); 103 | const p99 = calculatePercentile(99, durations); 104 | console.log(`avg duration: ${avg}`); 105 | console.log(`min duration: ${min}`); 106 | console.log(`max duration: ${max}`); 107 | console.log(`p50 duration: ${p50}`); 108 | console.log(`p95 duration: ${p95}`); 109 | console.log(`p99 duration: ${p99}`); 110 | 111 | return { 112 | framework: framework, 113 | backend: backend, 114 | actualBackend: environmentFlags.actualBackend, 115 | avg: avg, 116 | p50: p50, 117 | p95: p95, 118 | p99: p99, 119 | min: min, 120 | max: max, 121 | webglPack: environmentFlags.webglPack, 122 | wasmThreads: environmentFlags.wasmThreads, 123 | wasmSimd: environmentFlags.wasmSimd 124 | }; 125 | } 126 | 127 | const calculatePercentile = (percentile: number, numbers: number[]) => { 128 | numbers.sort(function(a, b){return a - b}); // increasing. 129 | var pos = Math.ceil(percentile / 100.0 * numbers.length) - 1; 130 | return numbers[pos]; 131 | } -------------------------------------------------------------------------------- /src/benchmark.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft Corporation. All rights reserved. 2 | // Licensed under the MIT license. 3 | 4 | 'use strict'; 5 | 6 | import * as ort from 'onnxruntime-web'; 7 | import {EnvironmentFlags} from './benchmark-utils'; 8 | 9 | export const BenchmarkBasePath = '/base'; 10 | 11 | export interface Benchmark { 12 | init(config: any, backend: string, profile: boolean): Promise; 13 | run(): Promise; 14 | endProfiling(): void; 15 | getEnvironmentFlags(): Promise; 16 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft Corporation. All rights reserved. 2 | // Licensed under the MIT license. 3 | 4 | 'use strict'; 5 | 6 | import {BenchmarkBasePath} from './benchmark'; 7 | import {readTextFile, runBenchmark} from './benchmark-utils'; 8 | 9 | describe('Benchmark', ()=> { 10 | let config; 11 | const results = []; 12 | const profile = __karma__.config.profile; 13 | 14 | before('Prepare benchmark', async ()=> { 15 | const configFilePath = `${BenchmarkBasePath}/${__karma__.config.runConfig}`; 16 | const result = await readTextFile(configFilePath); 17 | config = JSON.parse(result); 18 | 19 | console.log(`browser: ${__karma__.config.browser[0]}`) 20 | if (profile) { 21 | console.log("Start profiling"); 22 | } 23 | 24 | console.log(`Start benchmark: ${config.benchmarkName}`); 25 | }); 26 | 27 | it('benchmark run ', async ()=> { 28 | await config.frameworksToTest.reduce(async (frameworkPromise, framework) => { 29 | await frameworkPromise; 30 | await config.backendsToTest.reduce(async (backendPromise, backend) => { 31 | await backendPromise; 32 | const result = await runBenchmark(config, framework, backend, profile); 33 | results.push(result); 34 | await new Promise(r => setTimeout(r, 1000)); 35 | }, Promise.resolve); 36 | }, Promise.resolve); 37 | }); 38 | 39 | after('printing results', ()=> { 40 | console.log(`Benchmark Results:${JSON.stringify(results)}`); 41 | }); 42 | }); -------------------------------------------------------------------------------- /src/ort-schema/README.md: -------------------------------------------------------------------------------- 1 | # ORT Format File 2 | This directory contains [the generated ts file](ort-generated.ts) neccessary to support the ORT file format. The file is generated from [the ORT file format schema](https://github.com/microsoft/onnxruntime/blob/d42399e1b07ce61e95aae88bc6b6ea5dcaae2011/onnxruntime/core/flatbuffers/schema/ort.fbs). Please do not directly modify [the generated ts header file](ort-generated.ts). 3 | 4 | [The ORT file format schema](https://github.com/microsoft/onnxruntime/blob/d42399e1b07ce61e95aae88bc6b6ea5dcaae2011/onnxruntime/core/flatbuffers/schema/ort.fbs) uses [FlatBuffers](https://github.com/google/flatbuffers) serialization library. To update [its generated ts file](ort-generated.ts), 5 | 6 | 1. Download or locate the [ort.fbs](https://github.com/microsoft/onnxruntime/blob/d42399e1b07ce61e95aae88bc6b6ea5dcaae2011/onnxruntime/core/flatbuffers/schema/ort.fbs) file. 7 | 2. Download FlatBuffers compiler: Download the latest flatc tool (flatc_windows.zip) from [Flatbuffers Release Page](https://github.com/google/flatbuffers/releases). Unzip and run 8 | 9 | `> flatc_windows.exe --ts ` 10 | 11 | This should result in ort-generated.ts being updated. 12 | -------------------------------------------------------------------------------- /src/ort-web-benchmark.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft Corporation. All rights reserved. 2 | // Licensed under the MIT license. 3 | 4 | 'use strict'; 5 | 6 | import {Benchmark, BenchmarkBasePath} from './benchmark'; 7 | import Long from 'long'; 8 | import {flatbuffers} from 'flatbuffers'; 9 | import {onnx} from 'onnx-proto'; 10 | import {onnxruntime} from './ort-schema/ort-generated'; 11 | import * as ort from 'onnxruntime-web'; 12 | import ortFbs = onnxruntime.experimental.fbs; 13 | import {EnvironmentFlags} from './benchmark-utils'; 14 | 15 | const typeToFunc: { [key: string]: any } = { 16 | "float32": Float32Array, 17 | "int32": Int32Array, 18 | "BigInt64Array": BigInt64Array 19 | }; 20 | 21 | export class OrtWebBenchmark implements Benchmark { 22 | #modelPath: string; 23 | #session: ort.InferenceSession; 24 | #input: ort.SessionHandler.FeedsType; 25 | #environmentFlags: EnvironmentFlags; 26 | 27 | async init(config: any, backend: string, profile: boolean): Promise { 28 | console.log(`Initializing session with ${backend} backend(s).`); 29 | ort.env.logLevel = profile ? 'verbose' : config.logLevel; 30 | 31 | if (config.ortweb?.webgl?.pack !== undefined) { 32 | ort.env.webgl.pack = config.ortweb.webgl.pack; 33 | console.log(`ort-web Pack mode enabled: ${ort.env.webgl.pack}`); 34 | } 35 | if (config.ortweb?.webgl?.contextId !== undefined) { 36 | ort.env.webgl.contextId = config.ortweb.webgl.contextId; 37 | } 38 | if (config.ortweb.wasm.numThreads !== undefined) { 39 | ort.env.wasm.numThreads = config.ortweb.wasm.numThreads; 40 | } 41 | if (config.ortweb.wasm.simd !== undefined) { 42 | ort.env.wasm.simd = config.ortweb.wasm.simd; 43 | } 44 | if (config.ortweb.wasm.proxy !== undefined) { 45 | ort.env.wasm.proxy = config.ortweb.wasm.proxy; 46 | } 47 | if (config.ortweb.wasm.initTimeout !== undefined) { 48 | ort.env.wasm.initTimeout = config.ortweb.wasm.initTimeout; 49 | } 50 | if (backend == "webnn") { 51 | ort.env.wasm.proxy = true; 52 | console.log(`ort-web using proxy for webnn`); 53 | } 54 | this.#modelPath= `${BenchmarkBasePath}/${config.ortweb.path}`; 55 | this.#session = await ort.InferenceSession.create(this.#modelPath, 56 | { 57 | executionProviders: [backend], 58 | enableProfiling: profile 59 | }); 60 | console.log(`Session initialized with: ${backend} backend(s).`); 61 | 62 | this.#environmentFlags = new EnvironmentFlags(); 63 | this.#environmentFlags.webglPack = Boolean(ort.env.webgl.pack); 64 | this.#environmentFlags.wasmThreads = Number(ort.env.wasm.numThreads); 65 | this.#environmentFlags.wasmSimd = Boolean(ort.env.wasm.simd); 66 | this.#environmentFlags.actualBackend = backend; // ONNXRuntime-Web will not change backend by itself. 67 | 68 | if (profile) { 69 | this.#session.startProfiling(); 70 | } 71 | 72 | this.#input = await generateInputs(this.#modelPath, config.ortweb.shape); 73 | 74 | await new Promise(r => setTimeout(r, 3000)); 75 | } 76 | 77 | cloneFeed(): ort.SessionHandler.FeedsType { 78 | let feed: ort.SessionHandler.FeedsType = {}; 79 | for (const [key, value] of Object.entries(this.#input)) { 80 | let func = typeToFunc[value.type]; 81 | feed[key] = new ort.Tensor(func.from(value.data), value.dims); 82 | } 83 | return feed; 84 | } 85 | 86 | async run(): Promise { 87 | const feed: ort.SessionHandler.FeedsType = (ort.env.wasm.proxy) ? this.cloneFeed() : this.#input; 88 | const outputData = await this.#session.run(feed); 89 | return outputData; 90 | } 91 | 92 | endProfiling() { 93 | this.#session.endProfiling(); 94 | } 95 | 96 | async getEnvironmentFlags(): Promise { 97 | return this.#environmentFlags; 98 | } 99 | } 100 | 101 | interface Metadata { 102 | name: string; 103 | dataType: number; 104 | shape: number[]; 105 | } 106 | 107 | type ShapeConfig = {[name: string]: number[]}; 108 | 109 | const generateInputs = async (uri: string, shapeConfig: ShapeConfig): Promise => { 110 | const metadata = await loadModel(uri); 111 | 112 | let inputs: ort.SessionHandler.FeedsType = {}; 113 | metadata.forEach(data => { 114 | let shape; 115 | if (shapeConfig !== undefined && shapeConfig.hasOwnProperty(data.name)) { 116 | shape = shapeConfig[data.name]; 117 | } else { 118 | shape = data.shape.map((value, index) => { 119 | if (value <= 0) { 120 | // Only batch size is allowed to set 121 | if (index !== 0) { 122 | throw new Error("Input shape must be manually defined."); 123 | } 124 | return 1; 125 | } else { 126 | return value; 127 | } 128 | }); 129 | } 130 | let size = 1; 131 | shape.map(i => size *= i); 132 | inputs[data.name] = generateTensor(data.dataType, size, shape); 133 | }); 134 | 135 | return inputs; 136 | } 137 | 138 | const loadModel = async (uri: string): Promise => { 139 | const response = await fetch(uri); 140 | const arrayBuffer = await response.arrayBuffer(); 141 | const buffer = new Uint8Array(arrayBuffer); 142 | if (uri.endsWith('.onnx')) { 143 | return loadOnnxModel(buffer); 144 | } else if (uri.endsWith('.ort')) { 145 | return loadOrtModel(buffer); 146 | } else { 147 | throw new Error('Unknown model: ' + uri); 148 | } 149 | } 150 | 151 | const loadOnnxModel = async (buffer: Uint8Array): Promise => { 152 | const modelProto = onnx.ModelProto.decode(buffer); 153 | const graph = modelProto.graph!; 154 | 155 | if (!graph.initializer) { 156 | throw new Error("Missing graph initializer"); 157 | } 158 | 159 | const initializers = new Set(); 160 | for (const initializer of graph.initializer!) { 161 | initializers.add(initializer.name!); 162 | } 163 | 164 | const metadata: Metadata[] = []; 165 | for (const input of graph.input!) { 166 | if (initializers.has(input.name!)) { 167 | continue; 168 | } 169 | const shape: number[] = input.type!.tensorType!.shape!.dim!.map((d, i) => { 170 | let value = d.dimValue!; 171 | return Long.isLong(value) ? value.toNumber(): value; 172 | }); 173 | metadata.push({ 174 | name: input.name!, 175 | dataType: input.type!.tensorType!.elemType!, 176 | shape 177 | }); 178 | } 179 | 180 | return metadata; 181 | } 182 | 183 | const loadOrtModel = async (buffer: Uint8Array): Promise => { 184 | const fb = new flatbuffers.ByteBuffer(buffer); 185 | const model = ortFbs.InferenceSession.getRootAsInferenceSession(fb).model()!; 186 | const graph = model.graph()!; 187 | 188 | const initializers = new Set(); 189 | for (let i = 0; i < graph.initializersLength(); i++) { 190 | const initializer = graph.initializers(i)!; 191 | initializers.add(initializer.name()!); 192 | } 193 | 194 | const metadata: Metadata[] = []; 195 | for (let i = 0; i < graph.inputsLength(); ++i) { 196 | const inputName = graph.inputs(i); 197 | if (initializers.has(inputName)) { 198 | continue; 199 | } 200 | 201 | for (let j = 0; j < graph.nodeArgsLength(); ++j) { 202 | if (graph.nodeArgs(j)?.name() === inputName) { 203 | const value = graph.nodeArgs(j)!.type()!.value(new ortFbs.TensorTypeAndShape())!; 204 | 205 | const shape = value.shape()!; 206 | const dims: number[] = []; 207 | for (let k = 0; k < shape.dimLength()!; k++) { 208 | const dim = shape.dim(k)!.value()!.dimValue()!; 209 | const value = Long.fromValue({low: dim.low, high: dim.high, unsigned: true}).toNumber(); 210 | dims.push(value); 211 | } 212 | 213 | metadata.push({ 214 | name: inputName, 215 | dataType: value.elemType(), 216 | shape: dims 217 | }); 218 | 219 | break; 220 | } 221 | } 222 | } 223 | 224 | return metadata; 225 | } 226 | 227 | const generateTensor = (dataType: number, size: number, shape: number[]): ort.Tensor => { 228 | switch (dataType) { 229 | case onnx.TensorProto.DataType.FLOAT: 230 | return new ort.Tensor(Float32Array.from({length: size}, () => 1), shape); 231 | case onnx.TensorProto.DataType.DOUBLE: 232 | return new ort.Tensor(Float64Array.from({length: size}, () => 1), shape); 233 | case onnx.TensorProto.DataType.UINT8: 234 | return new ort.Tensor(Uint8Array.from({length: size}, () => 1), shape); 235 | case onnx.TensorProto.DataType.INT8: 236 | return new ort.Tensor(Int8Array.from({length: size}, () => 1), shape); 237 | case onnx.TensorProto.DataType.UINT16: 238 | return new ort.Tensor(Uint16Array.from({length: size}, () => 1), shape); 239 | case onnx.TensorProto.DataType.INT16: 240 | return new ort.Tensor(Int16Array.from({length: size}, () => 1), shape); 241 | case onnx.TensorProto.DataType.UINT32: 242 | return new ort.Tensor(Uint32Array.from({length: size}, () => 1), shape); 243 | case onnx.TensorProto.DataType.INT32: 244 | return new ort.Tensor(Int32Array.from({length: size}, () => 1), shape); 245 | case onnx.TensorProto.DataType.UINT64: 246 | return new ort.Tensor(BigUint64Array.from({length: size}, () => BigInt(1)), shape); 247 | case onnx.TensorProto.DataType.INT64: 248 | return new ort.Tensor(BigInt64Array.from({length: size}, () => BigInt(1)), shape); 249 | case onnx.TensorProto.DataType.STRING: 250 | throw new Error("Can't support STRING tensor"); 251 | case onnx.TensorProto.DataType.FLOAT16: 252 | throw new Error("Can't support FLOAT16 tensor"); 253 | case onnx.TensorProto.DataType.BFLOAT16: 254 | throw new Error("Can't support BFLOAT16 tensor"); 255 | case onnx.TensorProto.DataType.COMPLEX64: 256 | throw new Error("Can't support COMPLEX64 tensor"); 257 | case onnx.TensorProto.DataType.COMPLEX128: 258 | throw new Error("Can't support COMPLEX128 tensor"); 259 | } 260 | 261 | throw new Error("Input tensor type is unknown"); 262 | } -------------------------------------------------------------------------------- /src/tfjs-benchmark.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft Corporation. All rights reserved. 2 | // Licensed under the MIT license. 3 | 4 | 'use strict'; 5 | 6 | import * as tf from '@tensorflow/tfjs'; 7 | import {setThreadsCount} from '@tensorflow/tfjs-backend-wasm'; 8 | import '@tensorflow/tfjs-backend-webgpu'; 9 | import {Benchmark, BenchmarkBasePath} from './benchmark'; 10 | import {EnvironmentFlags} from './benchmark-utils'; 11 | 12 | type TensorflowModelType = tf.GraphModel|tf.LayersModel; 13 | type TensorflowIOType = tf.Tensor|tf.Tensor[]; 14 | type TensorflowExecType = 'execute'|'executeAsync'|'predict'|undefined; 15 | 16 | export class TensorFlowBenchmark implements Benchmark { 17 | #model: TensorflowModelType; 18 | #input: TensorflowIOType; 19 | #execType: TensorflowExecType; 20 | #environmentFlags: EnvironmentFlags; 21 | 22 | #useAsyncRead: boolean; 23 | 24 | async init(config: any, backend: string, profile: boolean): Promise { 25 | tf.env().set('WEBGL_PACK', !!config.tfjs.webgl.pack); 26 | console.log(`Tfjs pack mode enabled: ${tf.env().getBool('WEBGL_PACK')}`); 27 | 28 | console.log(`Setting the backend to ${backend}`); 29 | if (config.tfjs.wasm.threading !== undefined || 30 | (config.tfjs.wasm.numThreads !== undefined && config.tfjs.wasm.numThreads !== 1)) { 31 | tf.env().set('WASM_HAS_MULTITHREAD_SUPPORT', config.tfjs.wasm.threading !== undefined ? config.tfjs.wasm.threading : true); 32 | if (config.tfjs.wasm.numThreads !== undefined && config.tfjs.wasm.numThreads > 1) { 33 | setThreadsCount(config.tfjs.wasm.numThreads); 34 | } 35 | } 36 | if (config.tfjs.wasm.simd !== undefined) { 37 | tf.env().set('WASM_HAS_SIMD_SUPPORT', config.tfjs.wasm.simd); 38 | } 39 | await tf.setBackend(backend); 40 | this.#useAsyncRead = backend === 'webgpu' ? true : false; 41 | await tf.ready(); 42 | console.log('Set the backend to' + JSON.stringify(tf.getBackend())); 43 | 44 | const modelPath = isHttpUrl(config.tfjs.path) ? config.tfjs.path : `${BenchmarkBasePath}/${config.tfjs.path}`; 45 | 46 | // first try to load it as layers model 47 | try { 48 | this.#model = await tf.loadLayersModel(modelPath); 49 | } 50 | catch (e) { 51 | // then try loading as graph model 52 | this.#model = await tf.loadGraphModel(modelPath); 53 | } 54 | 55 | this.#environmentFlags = new EnvironmentFlags(); 56 | this.#environmentFlags.webglPack = Boolean(tf.env().getBool('WEBGL_PACK')); 57 | this.#environmentFlags.wasmThreads = Boolean(tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT')); 58 | this.#environmentFlags.wasmSimd = Boolean(tf.env().getAsync('WASM_HAS_SIMD_SUPPORT')); 59 | this.#environmentFlags.actualBackend = String(tf.getBackend()); 60 | 61 | this.#input = generateInputs(this.#model, config.tfjs.shape); 62 | this.#execType = await getExecType(this.#model, this.#input); 63 | } 64 | 65 | async run(): Promise { 66 | const output = await run(this.#model, this.#input, this.#execType); 67 | let outputData; 68 | if (!Array.isArray(output)) { 69 | if (this.#useAsyncRead) { 70 | outputData = await output.data(); 71 | } else { 72 | outputData = output.dataSync(); 73 | } 74 | } else { 75 | outputData = new Array(output.length); 76 | for (const o of output) { 77 | if (this.#useAsyncRead) { 78 | outputData.push(await o.data()); 79 | } else { 80 | outputData.push(o.dataSync()); 81 | } 82 | } 83 | } 84 | return outputData; 85 | } 86 | 87 | endProfiling() {} 88 | 89 | async getEnvironmentFlags(): Promise { 90 | return this.#environmentFlags; 91 | } 92 | } 93 | 94 | type ShapeConfig = {[name: string]: number[]}; 95 | 96 | const getExecType = async(model: TensorflowModelType, input: TensorflowIOType): Promise => { 97 | if (model instanceof tf.GraphModel) { 98 | try { 99 | model.execute(input); 100 | return 'execute'; 101 | } catch (e) { 102 | await model.executeAsync(input); 103 | return 'executeAsync'; 104 | } 105 | } else if (model instanceof tf.LayersModel) { 106 | model.predict(input); 107 | return 'predict'; 108 | } else { 109 | throw new Error( 110 | 'Predict function was not found. Please provide a tf.GraphModel or ' + 111 | 'tf.LayersModel'); 112 | } 113 | } 114 | 115 | const run = async(model: TensorflowModelType, input: TensorflowIOType, execType: TensorflowExecType): Promise => { 116 | switch (execType) { 117 | case 'execute': 118 | return (model as tf.GraphModel).execute(input); 119 | case 'executeAsync': 120 | return await (model as tf.GraphModel).executeAsync(input); 121 | case 'predict': 122 | return (model as tf.LayersModel).predict(input); 123 | default: 124 | throw new Error('Wrong execution type is given: ' + execType) 125 | } 126 | } 127 | 128 | const generateInputs = (model: TensorflowModelType, shapeConfig: ShapeConfig): TensorflowIOType => { 129 | const inputs: tf.Tensor[] = []; 130 | 131 | model.inputs.forEach((node: any) => { 132 | let shape; 133 | if (shapeConfig !== undefined && shapeConfig.hasOwnProperty(node.name)) { 134 | shape = shapeConfig[node.name]; 135 | } else { 136 | shape = node.shape!.map((value: number, index: number) => { 137 | if (value === null || value <= 0) { 138 | // Only batch size is allowed to set 139 | if (index !== 0) { 140 | throw new Error("Input shape must be manually defined."); 141 | } 142 | return 1; 143 | } else { 144 | return value; 145 | } 146 | }); 147 | } 148 | 149 | const tensor = tf.ones(shape, node.dtype); 150 | inputs.push(tensor); 151 | }); 152 | 153 | return inputs; 154 | } 155 | 156 | const isHttpUrl = (path: string): boolean => { 157 | try { 158 | const uri = new URL(path); 159 | return uri.protocol === "http:" || uri.protocol === "https:"; 160 | } catch (_) { 161 | return false; 162 | } 163 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "src/", 4 | "utils/" 5 | ], 6 | "exclude": [ 7 | "node_modules/" 8 | ], 9 | "compileOnSave": true, 10 | "compilerOptions": { 11 | "module": "commonjs", 12 | "moduleResolution": "node", 13 | "esModuleInterop": true, 14 | "target": "es2015", 15 | "noImplicitAny": true, 16 | "declaration": true, 17 | "sourceMap": true, 18 | "preserveConstEnums": true, 19 | "lib": ["es2017", "dom"], 20 | "noUnusedLocals": true, 21 | "noImplicitReturns": true, 22 | "noImplicitThis": true, 23 | "alwaysStrict": true, 24 | "strictNullChecks": true, 25 | "noUnusedParameters": false, 26 | "pretty": true, 27 | "allowUnreachableCode": false, 28 | "experimentalDecorators": true, 29 | "declarationDir": "./types", 30 | "downlevelIteration": true, 31 | "skipLibCheck": true 32 | } 33 | } 34 | 35 | -------------------------------------------------------------------------------- /utils/gen-chrome-trace.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft Corporation. All rights reserved. 2 | // Licensed under the MIT license. 3 | 4 | // gen-chrome-trace 5 | // tslint:disable 6 | 7 | import * as readline from 'readline'; 8 | const int = readline.createInterface({input: process.stdin, output: process.stdout, terminal: false}); 9 | 10 | const matcher = /Profiler\.([^\[\s\x1b]+)(\x1b\[0m)? (\d.+Z)\|([\d\.]+)ms on event '([^']+)' at (\d*\.*\d*)/; 11 | let pid:number; 12 | const allEvents: any[] = []; 13 | int.on('line', input => { 14 | const matches = matcher.exec(input); 15 | if(input.indexOf(' with id ') >= 0) { 16 | let n = input.lastIndexOf(' '); 17 | let id = input.substring(n + 1); 18 | pid = id as unknown as number; 19 | } 20 | if (matches) { 21 | const category = matches[1]; 22 | const logTimeStamp = new Date(matches[3]); 23 | const ms = Number.parseFloat(matches[4]); 24 | const event = matches[5]; 25 | const endTimeInNumber = matches[6]; 26 | allEvents.push({event, ms, logTimeStamp, category, endTimeInNumber, pid}); 27 | } 28 | }); 29 | 30 | interface Event { 31 | cat: string; 32 | dur: number; 33 | name: string; 34 | ph: string; 35 | pid: number; 36 | ts: number; 37 | } 38 | 39 | let rawEvents : Event[] = []; 40 | 41 | int.on('close', () => { 42 | for (const i of allEvents) { 43 | rawEvents.push({ 44 | cat: i.category, 45 | dur: i.ms, 46 | name: i.event, 47 | ph: 'X', 48 | pid: i.pid, 49 | ts: (i.endTimeInNumber - i.ms) 50 | }); 51 | } 52 | 53 | let chromeTrace = {traceEvents: rawEvents}; 54 | 55 | var json = JSON.stringify(chromeTrace, null, 2); 56 | var fs = require('fs'); 57 | fs.writeFile('trace.json', json, 'utf8',()=>{}); 58 | }); 59 | -------------------------------------------------------------------------------- /webpack.conf.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft Corporation. All rights reserved. 2 | // Licensed under the MIT license. 3 | 4 | 'use strict'; 5 | 6 | const webpack = require("webpack"); 7 | const path = require('path'); 8 | const fs = require('fs'); 9 | const APP_DIR = path.resolve(__dirname, "./src/"); 10 | const DIST_DIR = path.resolve(__dirname, "./dist/"); 11 | 12 | if (!fs.existsSync('dist')){ 13 | fs.mkdirSync('dist'); 14 | } 15 | 16 | if (fs.existsSync('./node_modules/onnxruntime-common')) { 17 | fs.copyFileSync(path.resolve('./node_modules/onnxruntime-common/dist', 'ort-common.min.js'), path.resolve('./dist', 'ort-common.min.js')); 18 | } else { 19 | fs.copyFileSync(path.resolve('./node_modules/onnxruntime-web/node_modules/onnxruntime-common/dist', 'ort-common.min.js'), path.resolve('./dist', 'ort-common.min.js')); 20 | } 21 | fs.copyFileSync(path.resolve('./node_modules/onnxruntime-web/dist', 'ort-web.min.js'), path.resolve('./dist', 'ort-web.min.js')); 22 | fs.copyFileSync(path.resolve('./node_modules/onnxruntime-web/dist', 'ort-wasm-threaded.js'), path.resolve('./dist', 'ort-wasm-threaded.js')); 23 | fs.copyFileSync(path.resolve('./node_modules/onnxruntime-web/dist', 'ort-wasm-threaded.worker.js'), path.resolve('./dist', 'ort-wasm-threaded.worker.js')); 24 | fs.copyFileSync(path.resolve('./node_modules/onnxruntime-web/dist', 'ort-wasm.wasm'), path.resolve('./dist', 'ort-wasm.wasm')); 25 | fs.copyFileSync(path.resolve('./node_modules/onnxruntime-web/dist', 'ort-wasm-simd.wasm'), path.resolve('./dist', 'ort-wasm-simd.wasm')); 26 | fs.copyFileSync(path.resolve('./node_modules/onnxruntime-web/dist', 'ort-wasm-threaded.wasm'), path.resolve('./dist', 'ort-wasm-threaded.wasm')); 27 | fs.copyFileSync(path.resolve('./node_modules/onnxruntime-web/dist', 'ort-wasm-simd-threaded.wasm'), path.resolve('./dist', 'ort-wasm-simd-threaded.wasm')); 28 | 29 | fs.copyFileSync(path.resolve('./node_modules/@tensorflow/tfjs/dist', 'tf.min.js'), path.resolve('./dist', 'tf.min.js')); 30 | fs.copyFileSync(path.resolve('./node_modules/@tensorflow/tfjs-backend-wasm/dist', 'tf-backend-wasm.min.js'), path.resolve('./dist', 'tf-backend-wasm.min.js')); 31 | fs.copyFileSync(path.resolve('./node_modules/@tensorflow/tfjs-backend-wasm/dist', 'tfjs-backend-wasm.wasm'), path.resolve('./dist', 'tfjs-backend-wasm.wasm')); 32 | fs.copyFileSync(path.resolve('./node_modules/@tensorflow/tfjs-backend-wasm/dist', 'tfjs-backend-wasm-simd.wasm'), path.resolve('./dist', 'tfjs-backend-wasm-simd.wasm')); 33 | fs.copyFileSync(path.resolve('./node_modules/@tensorflow/tfjs-backend-wasm/dist', 'tfjs-backend-wasm-threaded-simd.wasm'), path.resolve('./dist', 'tfjs-backend-wasm-threaded-simd.wasm')); 34 | fs.copyFileSync(path.resolve('./node_modules/@tensorflow/tfjs-backend-webgpu/dist', 'tf-backend-webgpu.min.js'), path.resolve('./dist', 'tf-backend-webgpu.min.js')); 35 | 36 | module.exports = (env, argv) => { 37 | const config = { 38 | entry: [APP_DIR + "/index.js"], 39 | output : { 40 | path : DIST_DIR, 41 | filename: "main.js" 42 | }, 43 | resolve: { 44 | extensions: ['.js', '.ts'], 45 | fallback: { 46 | fs: false 47 | } 48 | }, 49 | externals: { 50 | }, 51 | plugins: [ 52 | new webpack.WatchIgnorePlugin({ paths: [/\.js$/, /\.d\.ts$/]}) 53 | ], 54 | module: { 55 | rules: [ 56 | { 57 | test: /\.wasm$/i, 58 | type: 'javascript/auto', 59 | use: [ 60 | { 61 | loader: 'file-loader', 62 | }, 63 | ], 64 | }, 65 | { 66 | test: /\.ts$/, 67 | exclude: /node_modules/, 68 | loader: 'ts-loader' 69 | } 70 | ], 71 | }, }; 72 | if (argv.mode === 'production') { 73 | config.mode = 'production'; 74 | config.devtool = 'source-map'; 75 | } else { 76 | config.mode = 'development'; 77 | config.devtool = 'inline-source-map'; 78 | } 79 | return config; 80 | }; 81 | --------------------------------------------------------------------------------