{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "c8Cx-rUMVX25" }, "source": [ "##### Copyright 2019 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2022-12-15T00:55:58.585786Z", "iopub.status.busy": "2022-12-15T00:55:58.585221Z", "iopub.status.idle": "2022-12-15T00:55:58.589494Z", "shell.execute_reply": "2022-12-15T00:55:58.588932Z" }, "id": "I9sUhVL_VZNO" }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "id": "6Y8E0lw5eYWm" }, "source": [ "# 훈련 후 float16 양자화" ] }, { "cell_type": "markdown", "metadata": { "id": "CGuqeuPSVNo-" }, "source": [ "\n", " \n", " \n", " \n", " \n", "
TensorFlow.org에서 보기Google Colab에서 실행GitHub에서 소스보기노트북 다운로드
" ] }, { "cell_type": "markdown", "metadata": { "id": "BTC1rDAuei_1" }, "source": [ "## 개요\n", "\n", "[TensorFlow Lite는](https://www.tensorflow.org/lite/) 이제 TensorFlow에서 TensorFlow Lite의 flat buffer 형식으로 모델을 변환하는 동안 가중치를 16bit 부동 소수점 값으로 변환하는 것을 지원합니다. 그 결과 모델 크기가 2배 감소합니다. GPU와 같은 일부 하드웨어는 감소한 정밀도 산술로 기본적으로 계산할 수 있으므로 기존 부동 소수점 실행보다 속도가 향상됩니다. Tensorflow Lite GPU 대리자는 이러한 방식으로 실행되도록 구성될 수 있습니다. 그러나 float16 가중치로 변환된 모델은 추가 수정없이도 CPU에서 계속 실행될 수 있습니다. float16 가중치는 첫 번째 추론 이전에 float32로 업 샘플링됩니다. 이를 통해 지연 시간과 정확성에 미치는 영향을 최소화하는 대신 모델 크기를 크게 줄일 수 있습니다.\n", "\n", "이 가이드에서는 MNIST 모델을 처음부터 훈련하고 TensorFlow에서 정확성을 확인한 다음 모델을 float16 양자화를 사용하여 Tensorflow Lite flatbuffer로 변환합니다. 마지막으로 변환된 모델의 정확성을 확인하고 원래 float32 모델과 비교합니다." ] }, { "cell_type": "markdown", "metadata": { "id": "2XsEP17Zelz9" }, "source": [ "## MNIST 모델 빌드하기" ] }, { "cell_type": "markdown", "metadata": { "id": "dDqqUIZjZjac" }, "source": [ "### 설정" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:55:58.593264Z", "iopub.status.busy": "2022-12-15T00:55:58.592744Z", "iopub.status.idle": "2022-12-15T00:56:00.634708Z", "shell.execute_reply": "2022-12-15T00:56:00.633921Z" }, "id": "gyqAw1M9lyab" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 00:55:59.580016: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory\n", "2022-12-15 00:55:59.580120: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory\n", "2022-12-15 00:55:59.580130: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n" ] } ], "source": [ "import logging\n", "logging.getLogger(\"tensorflow\").setLevel(logging.DEBUG)\n", "\n", "import tensorflow as tf\n", "from tensorflow import keras\n", "import numpy as np\n", "import pathlib" ] }, { "cell_type": "markdown", "metadata": { "id": "eQ6Q0qqKZogR" }, "source": [ "### 모델 훈련 및 내보내기" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:00.639774Z", "iopub.status.busy": "2022-12-15T00:56:00.638819Z", "iopub.status.idle": "2022-12-15T00:56:13.863371Z", "shell.execute_reply": "2022-12-15T00:56:13.862615Z" }, "id": "hWSAjQWagIHl" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/1875 [..............................] - ETA: 1:42:52 - loss: 2.2809 - accuracy: 0.0938" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 20/1875 [..............................] - ETA: 5s - loss: 2.1006 - accuracy: 0.3688 " ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 41/1875 [..............................] - ETA: 4s - loss: 1.8007 - accuracy: 0.5587" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 62/1875 [..............................] - ETA: 4s - loss: 1.5109 - accuracy: 0.6326" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 84/1875 [>.............................] - ETA: 4s - loss: 1.2884 - accuracy: 0.6849" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 105/1875 [>.............................] - ETA: 4s - loss: 1.1476 - accuracy: 0.7143" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 126/1875 [=>............................] - ETA: 4s - loss: 1.0405 - accuracy: 0.7383" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 147/1875 [=>............................] - ETA: 4s - loss: 0.9526 - accuracy: 0.7587" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 168/1875 [=>............................] - ETA: 4s - loss: 0.8860 - accuracy: 0.7736" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 189/1875 [==>...........................] - ETA: 4s - loss: 0.8277 - accuracy: 0.7865" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 209/1875 [==>...........................] - ETA: 4s - loss: 0.7895 - accuracy: 0.7962" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 229/1875 [==>...........................] - ETA: 4s - loss: 0.7567 - accuracy: 0.8043" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 250/1875 [===>..........................] - ETA: 4s - loss: 0.7170 - accuracy: 0.8141" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 271/1875 [===>..........................] - ETA: 3s - loss: 0.6864 - accuracy: 0.8208" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 292/1875 [===>..........................] - ETA: 3s - loss: 0.6602 - accuracy: 0.8269" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 313/1875 [====>.........................] - ETA: 3s - loss: 0.6404 - accuracy: 0.8314" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 334/1875 [====>.........................] - ETA: 3s - loss: 0.6227 - accuracy: 0.8353" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 356/1875 [====>.........................] - ETA: 3s - loss: 0.6053 - accuracy: 0.8388" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 377/1875 [=====>........................] - ETA: 3s - loss: 0.5911 - accuracy: 0.8421" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 399/1875 [=====>........................] - ETA: 3s - loss: 0.5744 - accuracy: 0.8459" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 420/1875 [=====>........................] - ETA: 3s - loss: 0.5590 - accuracy: 0.8492" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 441/1875 [======>.......................] - ETA: 3s - loss: 0.5477 - accuracy: 0.8525" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 462/1875 [======>.......................] - ETA: 3s - loss: 0.5358 - accuracy: 0.8553" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 483/1875 [======>.......................] - ETA: 3s - loss: 0.5246 - accuracy: 0.8584" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 504/1875 [=======>......................] - ETA: 3s - loss: 0.5157 - accuracy: 0.8609" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 525/1875 [=======>......................] - ETA: 3s - loss: 0.5071 - accuracy: 0.8631" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 546/1875 [=======>......................] - ETA: 3s - loss: 0.4968 - accuracy: 0.8653" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 567/1875 [========>.....................] - ETA: 3s - loss: 0.4907 - accuracy: 0.8668" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 589/1875 [========>.....................] - ETA: 3s - loss: 0.4811 - accuracy: 0.8695" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 611/1875 [========>.....................] - ETA: 3s - loss: 0.4756 - accuracy: 0.8710" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 632/1875 [=========>....................] - ETA: 3s - loss: 0.4673 - accuracy: 0.8732" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 654/1875 [=========>....................] - ETA: 2s - loss: 0.4606 - accuracy: 0.8747" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 676/1875 [=========>....................] - ETA: 2s - loss: 0.4559 - accuracy: 0.8760" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 696/1875 [==========>...................] - ETA: 2s - loss: 0.4510 - accuracy: 0.8771" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 716/1875 [==========>...................] - ETA: 2s - loss: 0.4454 - accuracy: 0.8784" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 737/1875 [==========>...................] - ETA: 2s - loss: 0.4400 - accuracy: 0.8798" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 758/1875 [===========>..................] - ETA: 2s - loss: 0.4339 - accuracy: 0.8814" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 779/1875 [===========>..................] - ETA: 2s - loss: 0.4284 - accuracy: 0.8833" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 800/1875 [===========>..................] - ETA: 2s - loss: 0.4237 - accuracy: 0.8843" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 820/1875 [============>.................] - ETA: 2s - loss: 0.4183 - accuracy: 0.8855" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 840/1875 [============>.................] - ETA: 2s - loss: 0.4156 - accuracy: 0.8864" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 860/1875 [============>.................] - ETA: 2s - loss: 0.4113 - accuracy: 0.8876" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 880/1875 [=============>................] - ETA: 2s - loss: 0.4066 - accuracy: 0.8889" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 900/1875 [=============>................] - ETA: 2s - loss: 0.4047 - accuracy: 0.8895" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 921/1875 [=============>................] - ETA: 2s - loss: 0.4003 - accuracy: 0.8907" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 942/1875 [==============>...............] - ETA: 2s - loss: 0.3958 - accuracy: 0.8918" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 963/1875 [==============>...............] - ETA: 2s - loss: 0.3912 - accuracy: 0.8930" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 984/1875 [==============>...............] - ETA: 2s - loss: 0.3873 - accuracy: 0.8941" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1005/1875 [===============>..............] - ETA: 2s - loss: 0.3838 - accuracy: 0.8950" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1025/1875 [===============>..............] - ETA: 2s - loss: 0.3799 - accuracy: 0.8962" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1046/1875 [===============>..............] - ETA: 2s - loss: 0.3774 - accuracy: 0.8969" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1067/1875 [================>.............] - ETA: 1s - loss: 0.3742 - accuracy: 0.8978" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1088/1875 [================>.............] - ETA: 1s - loss: 0.3706 - accuracy: 0.8987" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1109/1875 [================>.............] - ETA: 1s - loss: 0.3664 - accuracy: 0.8998" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1130/1875 [=================>............] - ETA: 1s - loss: 0.3628 - accuracy: 0.9006" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1151/1875 [=================>............] - ETA: 1s - loss: 0.3602 - accuracy: 0.9012" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1172/1875 [=================>............] - ETA: 1s - loss: 0.3571 - accuracy: 0.9020" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1193/1875 [==================>...........] - ETA: 1s - loss: 0.3545 - accuracy: 0.9028" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1214/1875 [==================>...........] - ETA: 1s - loss: 0.3520 - accuracy: 0.9035" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1235/1875 [==================>...........] - ETA: 1s - loss: 0.3484 - accuracy: 0.9044" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1256/1875 [===================>..........] - ETA: 1s - loss: 0.3468 - accuracy: 0.9050" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1276/1875 [===================>..........] - ETA: 1s - loss: 0.3441 - accuracy: 0.9057" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1296/1875 [===================>..........] - ETA: 1s - loss: 0.3427 - accuracy: 0.9061" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1317/1875 [====================>.........] - ETA: 1s - loss: 0.3397 - accuracy: 0.9068" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1338/1875 [====================>.........] - ETA: 1s - loss: 0.3372 - accuracy: 0.9076" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1359/1875 [====================>.........] - ETA: 1s - loss: 0.3347 - accuracy: 0.9083" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1379/1875 [=====================>........] - ETA: 1s - loss: 0.3325 - accuracy: 0.9087" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1400/1875 [=====================>........] - ETA: 1s - loss: 0.3304 - accuracy: 0.9093" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1421/1875 [=====================>........] - ETA: 1s - loss: 0.3283 - accuracy: 0.9097" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1443/1875 [======================>.......] - ETA: 1s - loss: 0.3259 - accuracy: 0.9101" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1464/1875 [======================>.......] - ETA: 1s - loss: 0.3244 - accuracy: 0.9105" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1485/1875 [======================>.......] - ETA: 0s - loss: 0.3222 - accuracy: 0.9110" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1507/1875 [=======================>......] - ETA: 0s - loss: 0.3202 - accuracy: 0.9117" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1529/1875 [=======================>......] - ETA: 0s - loss: 0.3178 - accuracy: 0.9123" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1551/1875 [=======================>......] - ETA: 0s - loss: 0.3157 - accuracy: 0.9128" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1573/1875 [========================>.....] - ETA: 0s - loss: 0.3139 - accuracy: 0.9133" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1595/1875 [========================>.....] - ETA: 0s - loss: 0.3120 - accuracy: 0.9138" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1617/1875 [========================>.....] - ETA: 0s - loss: 0.3100 - accuracy: 0.9143" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1638/1875 [=========================>....] - ETA: 0s - loss: 0.3082 - accuracy: 0.9148" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1659/1875 [=========================>....] - ETA: 0s - loss: 0.3062 - accuracy: 0.9153" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1681/1875 [=========================>....] - ETA: 0s - loss: 0.3045 - accuracy: 0.9159" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1702/1875 [==========================>...] - ETA: 0s - loss: 0.3034 - accuracy: 0.9161" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1723/1875 [==========================>...] - ETA: 0s - loss: 0.3015 - accuracy: 0.9166" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1744/1875 [==========================>...] - ETA: 0s - loss: 0.2996 - accuracy: 0.9171" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1765/1875 [===========================>..] - ETA: 0s - loss: 0.2979 - accuracy: 0.9175" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1785/1875 [===========================>..] - ETA: 0s - loss: 0.2961 - accuracy: 0.9179" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1806/1875 [===========================>..] - ETA: 0s - loss: 0.2944 - accuracy: 0.9185" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1827/1875 [============================>.] - ETA: 0s - loss: 0.2928 - accuracy: 0.9190" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1847/1875 [============================>.] - ETA: 0s - loss: 0.2918 - accuracy: 0.9192" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1867/1875 [============================>.] - ETA: 0s - loss: 0.2905 - accuracy: 0.9195" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "1875/1875 [==============================] - 9s 3ms/step - loss: 0.2901 - accuracy: 0.9197 - val_loss: 0.1384 - val_accuracy: 0.9614\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load MNIST dataset\n", "mnist = keras.datasets.mnist\n", "(train_images, train_labels), (test_images, test_labels) = mnist.load_data()\n", "\n", "# Normalize the input image so that each pixel value is between 0 to 1.\n", "train_images = train_images / 255.0\n", "test_images = test_images / 255.0\n", "\n", "# Define the model architecture\n", "model = keras.Sequential([\n", " keras.layers.InputLayer(input_shape=(28, 28)),\n", " keras.layers.Reshape(target_shape=(28, 28, 1)),\n", " keras.layers.Conv2D(filters=12, kernel_size=(3, 3), activation=tf.nn.relu),\n", " keras.layers.MaxPooling2D(pool_size=(2, 2)),\n", " keras.layers.Flatten(),\n", " keras.layers.Dense(10)\n", "])\n", "\n", "# Train the digit classification model\n", "model.compile(optimizer='adam',\n", " loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " metrics=['accuracy'])\n", "model.fit(\n", " train_images,\n", " train_labels,\n", " epochs=1,\n", " validation_data=(test_images, test_labels)\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "5NMaNZQCkW9X" }, "source": [ "예를 들어, 단일 epoch에 대해서만 모델을 훈련시켰으므로 ~96% 정확성으로만 훈련합니다." ] }, { "cell_type": "markdown", "metadata": { "id": "xl8_fzVAZwOh" }, "source": [ "### TensorFlow Lite 모델로 변환하기\n", "\n", "TensorFlow Lite [Converter](https://www.tensorflow.org/lite/models/convert)를 사용하여 이제 훈련된 모델을 TensorFlow Lite 모델로 변환할 수 있습니다.\n", "\n", "`TFLiteConverter`를 사용하여 모델을 로드합니다." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:13.867366Z", "iopub.status.busy": "2022-12-15T00:56:13.866864Z", "iopub.status.idle": "2022-12-15T00:56:14.972324Z", "shell.execute_reply": "2022-12-15T00:56:14.971552Z" }, "id": "_i8B2nDZmAgQ" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op while saving (showing 1 of 1). These functions will not be directly callable after loading.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmp6lyb31lw/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmp6lyb31lw/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 00:56:14.848472: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:362] Ignored output_format.\n", "2022-12-15 00:56:14.848515: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:365] Ignored drop_control_dependency.\n" ] } ], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", "tflite_model = converter.convert()" ] }, { "cell_type": "markdown", "metadata": { "id": "F2o2ZfF0aiCx" }, "source": [ "`.tflite` 파일에 작성합니다." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:14.976574Z", "iopub.status.busy": "2022-12-15T00:56:14.975910Z", "iopub.status.idle": "2022-12-15T00:56:14.979696Z", "shell.execute_reply": "2022-12-15T00:56:14.979041Z" }, "id": "vptWZq2xnclo" }, "outputs": [], "source": [ "tflite_models_dir = pathlib.Path(\"/tmp/mnist_tflite_models/\")\n", "tflite_models_dir.mkdir(exist_ok=True, parents=True)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:14.982567Z", "iopub.status.busy": "2022-12-15T00:56:14.982325Z", "iopub.status.idle": "2022-12-15T00:56:14.986876Z", "shell.execute_reply": "2022-12-15T00:56:14.986282Z" }, "id": "Ie9pQaQrn5ue" }, "outputs": [ { "data": { "text/plain": [ "84820" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tflite_model_file = tflite_models_dir/\"mnist_model.tflite\"\n", "tflite_model_file.write_bytes(tflite_model)" ] }, { "cell_type": "markdown", "metadata": { "id": "7BONhYtYocQY" }, "source": [ "대신 모델을 내보낼 때 float16으로 양자화하려면 먼저 기본 최적화를 사용하도록 `optimizations` 플래그를 지정합니다. 그런 다음 float16이 대상 플랫폼에서 지원되는 유형임을 지정합니다." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:14.990125Z", "iopub.status.busy": "2022-12-15T00:56:14.989544Z", "iopub.status.idle": "2022-12-15T00:56:14.992716Z", "shell.execute_reply": "2022-12-15T00:56:14.992143Z" }, "id": "HEZ6ET1AHAS3" }, "outputs": [], "source": [ "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", "converter.target_spec.supported_types = [tf.float16]" ] }, { "cell_type": "markdown", "metadata": { "id": "xW84iMYjHd9t" }, "source": [ "마지막으로 평소와 같이 모델을 변환합니다. 기본적으로 변환된 모델은 호출 편의를 위해 여전히 float 입력 및 출력을 사용합니다." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:14.996064Z", "iopub.status.busy": "2022-12-15T00:56:14.995542Z", "iopub.status.idle": "2022-12-15T00:56:15.955497Z", "shell.execute_reply": "2022-12-15T00:56:15.954794Z" }, "id": "yuNfl3CoHNK3" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op while saving (showing 1 of 1). These functions will not be directly callable after loading.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmpb6hmdxdl/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmpb6hmdxdl/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 00:56:15.826625: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:362] Ignored output_format.\n", "2022-12-15 00:56:15.826673: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:365] Ignored drop_control_dependency.\n" ] }, { "data": { "text/plain": [ "44624" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tflite_fp16_model = converter.convert()\n", "tflite_model_fp16_file = tflite_models_dir/\"mnist_model_quant_f16.tflite\"\n", "tflite_model_fp16_file.write_bytes(tflite_fp16_model)" ] }, { "cell_type": "markdown", "metadata": { "id": "PhMmUTl4sbkz" }, "source": [ "결과 파일이 약 `1/2` 크기인지 확인하세요." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:15.959373Z", "iopub.status.busy": "2022-12-15T00:56:15.958831Z", "iopub.status.idle": "2022-12-15T00:56:16.160415Z", "shell.execute_reply": "2022-12-15T00:56:16.159397Z" }, "id": "JExfcfLDscu4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total 128K\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 83K Dec 15 00:56 mnist_model.tflite\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 44K Dec 15 00:56 mnist_model_quant_f16.tflite\r\n" ] } ], "source": [ "!ls -lh {tflite_models_dir}" ] }, { "cell_type": "markdown", "metadata": { "id": "L8lQHMp_asCq" }, "source": [ "## TensorFlow Lite 모델 실행하기" ] }, { "cell_type": "markdown", "metadata": { "id": "-5l6-ciItvX6" }, "source": [ "Python TensorFlow Lite 인터프리터를 사용하여 TensorFlow Lite 모델을 실행합니다." ] }, { "cell_type": "markdown", "metadata": { "id": "Ap_jE7QRvhPf" }, "source": [ "### 인터프리터에 모델 로드하기" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:16.165472Z", "iopub.status.busy": "2022-12-15T00:56:16.164739Z", "iopub.status.idle": "2022-12-15T00:56:16.171392Z", "shell.execute_reply": "2022-12-15T00:56:16.170726Z" }, "id": "Jn16Rc23zTss" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO: Created TensorFlow Lite XNNPACK delegate for CPU.\n" ] } ], "source": [ "interpreter = tf.lite.Interpreter(model_path=str(tflite_model_file))\n", "interpreter.allocate_tensors()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:16.174734Z", "iopub.status.busy": "2022-12-15T00:56:16.174248Z", "iopub.status.idle": "2022-12-15T00:56:16.178057Z", "shell.execute_reply": "2022-12-15T00:56:16.177408Z" }, "id": "J8Pztk1mvNVL" }, "outputs": [], "source": [ "interpreter_fp16 = tf.lite.Interpreter(model_path=str(tflite_model_fp16_file))\n", "interpreter_fp16.allocate_tensors()" ] }, { "cell_type": "markdown", "metadata": { "id": "2opUt_JTdyEu" }, "source": [ "### 하나의 이미지에서 모델 테스트하기" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:16.181411Z", "iopub.status.busy": "2022-12-15T00:56:16.180941Z", "iopub.status.idle": "2022-12-15T00:56:16.185958Z", "shell.execute_reply": "2022-12-15T00:56:16.185325Z" }, "id": "AKslvo2kwWac" }, "outputs": [], "source": [ "test_image = np.expand_dims(test_images[0], axis=0).astype(np.float32)\n", "\n", "input_index = interpreter.get_input_details()[0][\"index\"]\n", "output_index = interpreter.get_output_details()[0][\"index\"]\n", "\n", "interpreter.set_tensor(input_index, test_image)\n", "interpreter.invoke()\n", "predictions = interpreter.get_tensor(output_index)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:16.189170Z", "iopub.status.busy": "2022-12-15T00:56:16.188683Z", "iopub.status.idle": "2022-12-15T00:56:16.939117Z", "shell.execute_reply": "2022-12-15T00:56:16.938229Z" }, "id": "XZClM2vo3_bm" }, "outputs": [ { "data": { "image/png": "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3tGePXvUq1eva45NTEyUJOXn5zcYQG63W263uyltAABaMUcBZIzRj3/8Y7311lvKzs5WXFzcdWsOHjwoSYqKimpSgwCAtslRAKWmpiozM1Pbt29XUFCQiouLJUkhISHq1KmTCgoKlJmZqR/84Afq0aOHDh06pMWLF2vMmDEaPHiwX14AAKB1chRAL7/8sqTLHzb9pg0bNmj27NkKDAzUe++9p7Vr16q6uloxMTGaNm2ann76aZ81DABoGxy/BXctMTExysnJuamGAAC3Bu6GDXxDeum3HNfkTujjuMYUfe64BmhruBkpAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFjBzUjR4vV9KtdxzQ+e+o4fOmlMcTOuC2g7OAICAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWtLh7wRljJEkXVSsZy80AABy7qFpJf/t93pgWF0CVlZWSpA/0ruVOAAA3o7KyUiEhIY0ud5nrRVQzq6ur0+nTpxUUFCSXy+W1rKKiQjExMTp58qSCg4MtdWgf2+EytsNlbIfL2A6XtYTtYIxRZWWloqOjFRDQ+JmeFncEFBAQoF69el1zTHBw8C29g13BdriM7XAZ2+EytsNltrfDtY58ruAiBACAFQQQAMCKVhVAbrdby5cvl9vttt2KVWyHy9gOl7EdLmM7XNaatkOLuwgBAHBraFVHQACAtoMAAgBYQQABAKwggAAAVhBAAAArWk0ArVu3Tn369FHHjh2VmJiojz/+2HZLzW7FihVyuVxeU79+/Wy35Xd79uzRpEmTFB0dLZfLpW3btnktN8bo2WefVVRUlDp16qTk5GQdPXrUTrN+dL3tMHv27Hr7x8SJE+006yfp6ekaNmyYgoKCFB4erilTpigvL89rzPnz55WamqoePXqoa9eumjZtmkpKSix17B83sh2SkpLq7Q8LFiyw1HHDWkUAvfbaa1qyZImWL1+uTz/9VEOGDNGECRN05swZ2601uwEDBqioqMgzffDBB7Zb8rvq6moNGTJE69ata3D5qlWr9MILL2j9+vXat2+funTpogkTJuj8+fPN3Kl/XW87SNLEiRO99o/Nmzc3Y4f+l5OTo9TUVO3du1e7du1SbW2txo8fr+rqas+YxYsX649//KO2bt2qnJwcnT59WlOnTrXYte/dyHaQpHnz5nntD6tWrbLUcSNMKzB8+HCTmprqeXzp0iUTHR1t0tPTLXbV/JYvX26GDBliuw2rJJm33nrL87iurs5ERkaaX/3qV555ZWVlxu12m82bN1vosHlcvR2MMWbWrFlm8uTJVvqx5cyZM0aSycnJMcZc/rfv0KGD2bp1q2fMl19+aSSZ3NxcW2363dXbwRhjxo4da37605/aa+oGtPgjoAsXLmj//v1KTk72zAsICFBycrJyc3MtdmbH0aNHFR0drb59++qhhx7SiRMnbLdkVWFhoYqLi732j5CQECUmJt6S+0d2drbCw8N155136rHHHlNpaantlvyqvLxckhQaGipJ2r9/v2pra732h379+ql3795ten+4ejtcsWnTJoWFhWngwIFKS0vT2bNnbbTXqBZ3N+yrff3117p06ZIiIiK85kdEROjIkSOWurIjMTFRGRkZuvPOO1VUVKSVK1fqrrvu0uHDhxUUFGS7PSuKi4slqcH948qyW8XEiRM1depUxcXFqaCgQMuWLVNKSopyc3PVrl072+35XF1dnRYtWqRRo0Zp4MCBki7vD4GBgerWrZvX2La8PzS0HSRp5syZio2NVXR0tA4dOqQnn3xSeXl5evPNNy12663FBxD+JiUlxfPz4MGDlZiYqNjYWL3++ut69NFHLXaGlmD69OmenwcNGqTBgwcrPj5e2dnZGjdunMXO/CM1NVWHDx++Jc6DXktj22H+/PmenwcNGqSoqCiNGzdOBQUFio+Pb+42G9Ti34ILCwtTu3bt6l3FUlJSosjISEtdtQzdunXTHXfcofz8fNutWHNlH2D/qK9v374KCwtrk/vHwoUL9c4772j37t1e3x8WGRmpCxcuqKyszGt8W90fGtsODUlMTJSkFrU/tPgACgwM1NChQ5WVleWZV1dXp6ysLI0YMcJiZ/ZVVVWpoKBAUVFRtluxJi4uTpGRkV77R0VFhfbt23fL7x+nTp1SaWlpm9o/jDFauHCh3nrrLb3//vuKi4vzWj506FB16NDBa3/Iy8vTiRMn2tT+cL3t0JCDBw9KUsvaH2xfBXEjtmzZYtxut8nIyDBffPGFmT9/vunWrZspLi623Vqz+tnPfmays7NNYWGh+fDDD01ycrIJCwszZ86csd2aX1VWVpoDBw6YAwcOGElm9erV5sCBA+b48ePGGGP+9V//1XTr1s1s377dHDp0yEyePNnExcWZc+fOWe7ct661HSorK83Pf/5zk5ubawoLC817771nvvOd75jbb7/dnD9/3nbrPvPYY4+ZkJAQk52dbYqKijzT2bNnPWMWLFhgevfubd5//33zySefmBEjRpgRI0ZY7Nr3rrcd8vPzzT/90z+ZTz75xBQWFprt27ebvn37mjFjxlju3FurCCBjjHnxxRdN7969TWBgoBk+fLjZu3ev7Zaa3YMPPmiioqJMYGCgue2228yDDz5o8vPzbbfld7t37zaS6k2zZs0yxly+FPuZZ54xERERxu12m3Hjxpm8vDy7TfvBtbbD2bNnzfjx403Pnj1Nhw4dTGxsrJk3b16b+yOtodcvyWzYsMEz5ty5c+bxxx833bt3N507dzY//OEPTVFRkb2m/eB62+HEiRNmzJgxJjQ01LjdbpOQkGCeeOIJU15ebrfxq/B9QAAAK1r8OSAAQNtEAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABW/H/g6VUawyy/UwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pylab as plt\n", "\n", "plt.imshow(test_images[0])\n", "template = \"True:{true}, predicted:{predict}\"\n", "_ = plt.title(template.format(true= str(test_labels[0]),\n", " predict=str(np.argmax(predictions[0]))))\n", "plt.grid(False)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:16.942964Z", "iopub.status.busy": "2022-12-15T00:56:16.942300Z", "iopub.status.idle": "2022-12-15T00:56:16.947667Z", "shell.execute_reply": "2022-12-15T00:56:16.946931Z" }, "id": "3gwhv4lKbYZ4" }, "outputs": [], "source": [ "test_image = np.expand_dims(test_images[0], axis=0).astype(np.float32)\n", "\n", "input_index = interpreter_fp16.get_input_details()[0][\"index\"]\n", "output_index = interpreter_fp16.get_output_details()[0][\"index\"]\n", "\n", "interpreter_fp16.set_tensor(input_index, test_image)\n", "interpreter_fp16.invoke()\n", "predictions = interpreter_fp16.get_tensor(output_index)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:16.951272Z", "iopub.status.busy": "2022-12-15T00:56:16.950652Z", "iopub.status.idle": "2022-12-15T00:56:17.102693Z", "shell.execute_reply": "2022-12-15T00:56:17.101986Z" }, "id": "CIH7G_MwbY2x" }, "outputs": [ { "data": { "image/png": "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3tGePXvUq1eva45NTEyUJOXn5zcYQG63W263uyltAABaMUcBZIzRj3/8Y7311lvKzs5WXFzcdWsOHjwoSYqKimpSgwCAtslRAKWmpiozM1Pbt29XUFCQiouLJUkhISHq1KmTCgoKlJmZqR/84Afq0aOHDh06pMWLF2vMmDEaPHiwX14AAKB1chRAL7/8sqTLHzb9pg0bNmj27NkKDAzUe++9p7Vr16q6uloxMTGaNm2ann76aZ81DABoGxy/BXctMTExysnJuamGAAC3Bu6GDXxDeum3HNfkTujjuMYUfe64BmhruBkpAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFjBzUjR4vV9KtdxzQ+e+o4fOmlMcTOuC2g7OAICAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWtLh7wRljJEkXVSsZy80AABy7qFpJf/t93pgWF0CVlZWSpA/0ruVOAAA3o7KyUiEhIY0ud5nrRVQzq6ur0+nTpxUUFCSXy+W1rKKiQjExMTp58qSCg4MtdWgf2+EytsNlbIfL2A6XtYTtYIxRZWWloqOjFRDQ+JmeFncEFBAQoF69el1zTHBw8C29g13BdriM7XAZ2+EytsNltrfDtY58ruAiBACAFQQQAMCKVhVAbrdby5cvl9vttt2KVWyHy9gOl7EdLmM7XNaatkOLuwgBAHBraFVHQACAtoMAAgBYQQABAKwggAAAVhBAAAArWk0ArVu3Tn369FHHjh2VmJiojz/+2HZLzW7FihVyuVxeU79+/Wy35Xd79uzRpEmTFB0dLZfLpW3btnktN8bo2WefVVRUlDp16qTk5GQdPXrUTrN+dL3tMHv27Hr7x8SJE+006yfp6ekaNmyYgoKCFB4erilTpigvL89rzPnz55WamqoePXqoa9eumjZtmkpKSix17B83sh2SkpLq7Q8LFiyw1HHDWkUAvfbaa1qyZImWL1+uTz/9VEOGDNGECRN05swZ2601uwEDBqioqMgzffDBB7Zb8rvq6moNGTJE69ata3D5qlWr9MILL2j9+vXat2+funTpogkTJuj8+fPN3Kl/XW87SNLEiRO99o/Nmzc3Y4f+l5OTo9TUVO3du1e7du1SbW2txo8fr+rqas+YxYsX649//KO2bt2qnJwcnT59WlOnTrXYte/dyHaQpHnz5nntD6tWrbLUcSNMKzB8+HCTmprqeXzp0iUTHR1t0tPTLXbV/JYvX26GDBliuw2rJJm33nrL87iurs5ERkaaX/3qV555ZWVlxu12m82bN1vosHlcvR2MMWbWrFlm8uTJVvqx5cyZM0aSycnJMcZc/rfv0KGD2bp1q2fMl19+aSSZ3NxcW2363dXbwRhjxo4da37605/aa+oGtPgjoAsXLmj//v1KTk72zAsICFBycrJyc3MtdmbH0aNHFR0drb59++qhhx7SiRMnbLdkVWFhoYqLi732j5CQECUmJt6S+0d2drbCw8N155136rHHHlNpaantlvyqvLxckhQaGipJ2r9/v2pra732h379+ql3795ten+4ejtcsWnTJoWFhWngwIFKS0vT2bNnbbTXqBZ3N+yrff3117p06ZIiIiK85kdEROjIkSOWurIjMTFRGRkZuvPOO1VUVKSVK1fqrrvu0uHDhxUUFGS7PSuKi4slqcH948qyW8XEiRM1depUxcXFqaCgQMuWLVNKSopyc3PVrl072+35XF1dnRYtWqRRo0Zp4MCBki7vD4GBgerWrZvX2La8PzS0HSRp5syZio2NVXR0tA4dOqQnn3xSeXl5evPNNy12663FBxD+JiUlxfPz4MGDlZiYqNjYWL3++ut69NFHLXaGlmD69OmenwcNGqTBgwcrPj5e2dnZGjdunMXO/CM1NVWHDx++Jc6DXktj22H+/PmenwcNGqSoqCiNGzdOBQUFio+Pb+42G9Ti34ILCwtTu3bt6l3FUlJSosjISEtdtQzdunXTHXfcofz8fNutWHNlH2D/qK9v374KCwtrk/vHwoUL9c4772j37t1e3x8WGRmpCxcuqKyszGt8W90fGtsODUlMTJSkFrU/tPgACgwM1NChQ5WVleWZV1dXp6ysLI0YMcJiZ/ZVVVWpoKBAUVFRtluxJi4uTpGRkV77R0VFhfbt23fL7x+nTp1SaWlpm9o/jDFauHCh3nrrLb3//vuKi4vzWj506FB16NDBa3/Iy8vTiRMn2tT+cL3t0JCDBw9KUsvaH2xfBXEjtmzZYtxut8nIyDBffPGFmT9/vunWrZspLi623Vqz+tnPfmays7NNYWGh+fDDD01ycrIJCwszZ86csd2aX1VWVpoDBw6YAwcOGElm9erV5sCBA+b48ePGGGP+9V//1XTr1s1s377dHDp0yEyePNnExcWZc+fOWe7ct661HSorK83Pf/5zk5ubawoLC817771nvvOd75jbb7/dnD9/3nbrPvPYY4+ZkJAQk52dbYqKijzT2bNnPWMWLFhgevfubd5//33zySefmBEjRpgRI0ZY7Nr3rrcd8vPzzT/90z+ZTz75xBQWFprt27ebvn37mjFjxlju3FurCCBjjHnxxRdN7969TWBgoBk+fLjZu3ev7Zaa3YMPPmiioqJMYGCgue2228yDDz5o8vPzbbfld7t37zaS6k2zZs0yxly+FPuZZ54xERERxu12m3Hjxpm8vDy7TfvBtbbD2bNnzfjx403Pnj1Nhw4dTGxsrJk3b16b+yOtodcvyWzYsMEz5ty5c+bxxx833bt3N507dzY//OEPTVFRkb2m/eB62+HEiRNmzJgxJjQ01LjdbpOQkGCeeOIJU15ebrfxq/B9QAAAK1r8OSAAQNtEAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABW/H/g6VUawyy/UwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(test_images[0])\n", "template = \"True:{true}, predicted:{predict}\"\n", "_ = plt.title(template.format(true= str(test_labels[0]),\n", " predict=str(np.argmax(predictions[0]))))\n", "plt.grid(False)" ] }, { "cell_type": "markdown", "metadata": { "id": "LwN7uIdCd8Gw" }, "source": [ "### 모델 평가하기" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:17.106326Z", "iopub.status.busy": "2022-12-15T00:56:17.106055Z", "iopub.status.idle": "2022-12-15T00:56:17.111775Z", "shell.execute_reply": "2022-12-15T00:56:17.111174Z" }, "id": "05aeAuWjvjPx" }, "outputs": [], "source": [ "# A helper function to evaluate the TF Lite model using \"test\" dataset.\n", "def evaluate_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", " output_index = interpreter.get_output_details()[0][\"index\"]\n", "\n", " # Run predictions on every image in the \"test\" dataset.\n", " prediction_digits = []\n", " for test_image in test_images:\n", " # Pre-processing: add batch dimension and convert to float32 to match with\n", " # the model's input data format.\n", " test_image = np.expand_dims(test_image, axis=0).astype(np.float32)\n", " interpreter.set_tensor(input_index, test_image)\n", "\n", " # Run inference.\n", " interpreter.invoke()\n", "\n", " # Post-processing: remove batch dimension and find the digit with highest\n", " # probability.\n", " output = interpreter.tensor(output_index)\n", " digit = np.argmax(output()[0])\n", " prediction_digits.append(digit)\n", "\n", " # Compare prediction results with ground truth labels to calculate accuracy.\n", " accurate_count = 0\n", " for index in range(len(prediction_digits)):\n", " if prediction_digits[index] == test_labels[index]:\n", " accurate_count += 1\n", " accuracy = accurate_count * 1.0 / len(prediction_digits)\n", "\n", " return accuracy" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:17.115170Z", "iopub.status.busy": "2022-12-15T00:56:17.114619Z", "iopub.status.idle": "2022-12-15T00:56:18.409912Z", "shell.execute_reply": "2022-12-15T00:56:18.409179Z" }, "id": "T5mWkSbMcU5z" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9614\n" ] } ], "source": [ "print(evaluate_model(interpreter))" ] }, { "cell_type": "markdown", "metadata": { "id": "Km3cY9ry8ZlG" }, "source": [ "float16 양자화된 모델에 대한 평가를 반복하여 다음을 얻습니다." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:56:18.413565Z", "iopub.status.busy": "2022-12-15T00:56:18.413178Z", "iopub.status.idle": "2022-12-15T00:56:19.730797Z", "shell.execute_reply": "2022-12-15T00:56:19.730089Z" }, "id": "-9cnwiPp6EGm" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9614\n" ] } ], "source": [ "# NOTE: Colab runs on server CPUs. At the time of writing this, TensorFlow Lite\n", "# doesn't have super optimized server CPU kernels. For this reason this may be\n", "# slower than the above float interpreter. But for mobile CPUs, considerable\n", "# speedup can be observed.\n", "print(evaluate_model(interpreter_fp16))" ] }, { "cell_type": "markdown", "metadata": { "id": "L7lfxkor8pgv" }, "source": [ "이 예에서는 정확성 차이가 없이 모델을 float16으로 양자화했습니다.\n", "\n", "GPU에서 fp16 양자화 모델을 평가하는 것도 가능합니다. 감소된 정밀도 값으로 모든 산술을 수행하려면 다음과 같이 앱에서 `TfLiteGPUDelegateOptions` 구조체를 만들고 `precision_loss_allowed`를 `1`로 설정해야 합니다.\n", "\n", "```\n", "//Prepare GPU delegate.\n", "const TfLiteGpuDelegateOptions options = {\n", " .metadata = NULL,\n", " .compile_options = {\n", " .precision_loss_allowed = 1, // FP16\n", " .preferred_gl_object_type = TFLITE_GL_OBJECT_TYPE_FASTEST,\n", " .dynamic_batch_enabled = 0, // Not fully functional yet\n", " },\n", "};\n", "```\n", "\n", "TFLite GPU 대리자 및 애플리케이션에서 사용하는 방법에 대한 자세한 설명서는 [여기에서](https://www.tensorflow.org/lite/performance/gpu_advanced?source=post_page---------------------------) 찾을 수 있습니다" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "post_training_float16_quant.ipynb", "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.16" } }, "nbformat": 4, "nbformat_minor": 0 }