{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "c8Cx-rUMVX25" }, "source": [ "##### Copyright 2020 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2022-12-15T00:58:12.697017Z", "iopub.status.busy": "2022-12-15T00:58:12.696370Z", "iopub.status.idle": "2022-12-15T00:58:12.700639Z", "shell.execute_reply": "2022-12-15T00:58:12.700038Z" }, "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": [ "# int16 활성화를 사용한 훈련 후 정수 양자화" ] }, { "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의 플랫 버퍼 형식으로 모델을 변환하는 동안 활성화를 16bit 정수 값으로, 가중치를 8bit 정수 값으로 변환하는 작업을 지원합니다. 이 모드를 \"16x8 양자화 모드\"라고 합니다. 이 모드는 활성화가 양자화에 민감할 때 양자화된 모델의 정확성을 크게 향상시키면서도 모델 크기를 거의 3 ~ 4배 줄일 수 있습니다. 또한 이 완전 양자화된 모델은 정수 전용 하드웨어 가속기에서 사용할 수 있습니다.\n", "\n", "이 훈련 후 양자화 모드의 이점을 얻는 모델의 몇 가지 예는 다음과 같습니다.\n", "\n", "- 초고해상도\n", "- 소음 상쇄 및 빔포밍과 같은 오디오 신호 처리\n", "- 이미지 노이즈 제거\n", "- 단일 이미지에서 HDR 재구성\n", "\n", "이 튜토리얼에서는 MNIST 모델을 처음부터 학습시키고 TensorFlow에서 정확성을 확인한 다음, 이 모드를 사용하여 모델을 Tensorflow Lite 플랫 버퍼로 변환합니다. 마지막으로, 변환된 모델의 정확성을 확인하고 원래 float32 모델과 비교합니다. 이 예제는 이 모드의 사용법을 보여주는 것이며 TensorFlow Lite에서 사용 가능한 다른 양자화 기술과 비교한 이점을 보여주지는 않습니다." ] }, { "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:58:12.704504Z", "iopub.status.busy": "2022-12-15T00:58:12.703980Z", "iopub.status.idle": "2022-12-15T00:58:14.716983Z", "shell.execute_reply": "2022-12-15T00:58:14.716206Z" }, "id": "gyqAw1M9lyab" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 00:58:13.702544: 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:58:13.702639: 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:58:13.702648: 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": "srTSFKjn1tMp" }, "source": [ "16x8 양자화 모드를 사용할 수 있는지 확인합니다. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:14.721411Z", "iopub.status.busy": "2022-12-15T00:58:14.720732Z", "iopub.status.idle": "2022-12-15T00:58:14.727699Z", "shell.execute_reply": "2022-12-15T00:58:14.727077Z" }, "id": "c6nb7OPlXs_3" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8" ] }, { "cell_type": "markdown", "metadata": { "id": "eQ6Q0qqKZogR" }, "source": [ "### 모델 훈련 및 내보내기" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:14.731335Z", "iopub.status.busy": "2022-12-15T00:58:14.730840Z", "iopub.status.idle": "2022-12-15T00:58:27.077800Z", "shell.execute_reply": "2022-12-15T00:58:27.076788Z" }, "id": "hWSAjQWagIHl" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/1875 [..............................] - ETA: 1:17:48 - loss: 2.3468 - accuracy: 0.0312" ] }, { "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.1178 - accuracy: 0.3266 " ] }, { "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", " 40/1875 [..............................] - ETA: 4s - loss: 1.8337 - accuracy: 0.5102" ] }, { "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", " 60/1875 [..............................] - ETA: 4s - loss: 1.5593 - accuracy: 0.5974" ] }, { "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", " 81/1875 [>.............................] - ETA: 4s - loss: 1.3492 - accuracy: 0.6512" ] }, { "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", " 103/1875 [>.............................] - ETA: 4s - loss: 1.1769 - accuracy: 0.6936" ] }, { "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", " 125/1875 [=>............................] - ETA: 4s - loss: 1.0659 - accuracy: 0.7185" ] }, { "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", " 146/1875 [=>............................] - ETA: 4s - loss: 0.9814 - accuracy: 0.7369" ] }, { "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.9075 - accuracy: 0.7545" ] }, { "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.8596 - accuracy: 0.7657" ] }, { "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", " 210/1875 [==>...........................] - ETA: 4s - loss: 0.8099 - accuracy: 0.7781" ] }, { "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", " 232/1875 [==>...........................] - ETA: 4s - loss: 0.7668 - accuracy: 0.7893" ] }, { "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", " 254/1875 [===>..........................] - ETA: 3s - loss: 0.7369 - accuracy: 0.7970" ] }, { "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", " 275/1875 [===>..........................] - ETA: 3s - loss: 0.7085 - accuracy: 0.8040" ] }, { "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", " 297/1875 [===>..........................] - ETA: 3s - loss: 0.6852 - accuracy: 0.8110" ] }, { "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", " 319/1875 [====>.........................] - ETA: 3s - loss: 0.6611 - accuracy: 0.8171" ] }, { "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", " 340/1875 [====>.........................] - ETA: 3s - loss: 0.6410 - accuracy: 0.8214" ] }, { "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", " 361/1875 [====>.........................] - ETA: 3s - loss: 0.6246 - accuracy: 0.8255" ] }, { "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", " 383/1875 [=====>........................] - ETA: 3s - loss: 0.6105 - accuracy: 0.8290" ] }, { "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", " 404/1875 [=====>........................] - ETA: 3s - loss: 0.5967 - accuracy: 0.8328" ] }, { "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", " 425/1875 [=====>........................] - ETA: 3s - loss: 0.5834 - accuracy: 0.8366" ] }, { "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", " 445/1875 [======>.......................] - ETA: 3s - loss: 0.5705 - accuracy: 0.8400" ] }, { "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", " 466/1875 [======>.......................] - ETA: 3s - loss: 0.5583 - accuracy: 0.8435" ] }, { "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", " 488/1875 [======>.......................] - ETA: 3s - loss: 0.5500 - accuracy: 0.8448" ] }, { "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", " 510/1875 [=======>......................] - ETA: 3s - loss: 0.5402 - accuracy: 0.8467" ] }, { "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", " 532/1875 [=======>......................] - ETA: 3s - loss: 0.5320 - accuracy: 0.8490" ] }, { "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", " 553/1875 [=======>......................] - ETA: 3s - loss: 0.5220 - accuracy: 0.8514" ] }, { "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", " 575/1875 [========>.....................] - ETA: 3s - loss: 0.5154 - accuracy: 0.8535" ] }, { "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", " 596/1875 [========>.....................] - ETA: 3s - loss: 0.5083 - accuracy: 0.8560" ] }, { "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", " 617/1875 [========>.....................] - ETA: 3s - loss: 0.5014 - accuracy: 0.8576" ] }, { "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", " 637/1875 [=========>....................] - ETA: 2s - loss: 0.4965 - accuracy: 0.8591" ] }, { "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", " 658/1875 [=========>....................] - ETA: 2s - loss: 0.4893 - accuracy: 0.8610" ] }, { "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", " 679/1875 [=========>....................] - ETA: 2s - loss: 0.4831 - accuracy: 0.8624" ] }, { "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", " 699/1875 [==========>...................] - ETA: 2s - loss: 0.4773 - accuracy: 0.8639" ] }, { "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", " 720/1875 [==========>...................] - ETA: 2s - loss: 0.4714 - 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", " 742/1875 [==========>...................] - ETA: 2s - loss: 0.4656 - accuracy: 0.8670" ] }, { "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", " 763/1875 [===========>..................] - ETA: 2s - loss: 0.4610 - accuracy: 0.8682" ] }, { "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", " 784/1875 [===========>..................] - ETA: 2s - loss: 0.4571 - 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", " 805/1875 [===========>..................] - ETA: 2s - loss: 0.4515 - 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", " 825/1875 [============>.................] - ETA: 2s - loss: 0.4468 - accuracy: 0.8722" ] }, { "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", " 845/1875 [============>.................] - ETA: 2s - loss: 0.4426 - accuracy: 0.8735" ] }, { "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", " 866/1875 [============>.................] - ETA: 2s - loss: 0.4383 - 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", " 887/1875 [=============>................] - ETA: 2s - loss: 0.4342 - 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", " 908/1875 [=============>................] - ETA: 2s - loss: 0.4305 - 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", " 929/1875 [=============>................] - ETA: 2s - loss: 0.4259 - accuracy: 0.8783" ] }, { "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", " 951/1875 [==============>...............] - ETA: 2s - loss: 0.4214 - accuracy: 0.8795" ] }, { "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", " 972/1875 [==============>...............] - ETA: 2s - loss: 0.4174 - accuracy: 0.8807" ] }, { "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", " 992/1875 [==============>...............] - ETA: 2s - loss: 0.4132 - accuracy: 0.8819" ] }, { "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", "1012/1875 [===============>..............] - ETA: 2s - loss: 0.4104 - accuracy: 0.8827" ] }, { "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", "1033/1875 [===============>..............] - ETA: 2s - loss: 0.4078 - 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", "1054/1875 [===============>..............] - ETA: 1s - loss: 0.4043 - accuracy: 0.8845" ] }, { "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", "1075/1875 [================>.............] - ETA: 1s - loss: 0.4014 - accuracy: 0.8853" ] }, { "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", "1096/1875 [================>.............] - ETA: 1s - loss: 0.3984 - 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", "1117/1875 [================>.............] - ETA: 1s - loss: 0.3959 - accuracy: 0.8870" ] }, { "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", "1138/1875 [=================>............] - ETA: 1s - loss: 0.3923 - accuracy: 0.8879" ] }, { "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", "1159/1875 [=================>............] - ETA: 1s - loss: 0.3903 - accuracy: 0.8883" ] }, { "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", "1180/1875 [=================>............] - ETA: 1s - loss: 0.3877 - accuracy: 0.8892" ] }, { "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", "1201/1875 [==================>...........] - ETA: 1s - loss: 0.3854 - accuracy: 0.8898" ] }, { "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", "1222/1875 [==================>...........] - ETA: 1s - loss: 0.3828 - accuracy: 0.8905" ] }, { "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", "1242/1875 [==================>...........] - ETA: 1s - loss: 0.3794 - accuracy: 0.8915" ] }, { "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", "1263/1875 [===================>..........] - ETA: 1s - loss: 0.3764 - accuracy: 0.8924" ] }, { "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", "1284/1875 [===================>..........] - ETA: 1s - loss: 0.3740 - 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", "1306/1875 [===================>..........] - ETA: 1s - loss: 0.3709 - accuracy: 0.8938" ] }, { "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", "1327/1875 [====================>.........] - ETA: 1s - loss: 0.3692 - accuracy: 0.8945" ] }, { "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", "1349/1875 [====================>.........] - ETA: 1s - loss: 0.3673 - 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", "1371/1875 [====================>.........] - ETA: 1s - loss: 0.3644 - accuracy: 0.8959" ] }, { "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", "1393/1875 [=====================>........] - ETA: 1s - loss: 0.3617 - accuracy: 0.8967" ] }, { "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", "1414/1875 [=====================>........] - ETA: 1s - loss: 0.3595 - accuracy: 0.8972" ] }, { "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", "1435/1875 [=====================>........] - ETA: 1s - loss: 0.3568 - accuracy: 0.8979" ] }, { "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", "1456/1875 [======================>.......] - ETA: 1s - loss: 0.3542 - accuracy: 0.8988" ] }, { "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", "1477/1875 [======================>.......] - ETA: 0s - loss: 0.3523 - accuracy: 0.8993" ] }, { "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", "1499/1875 [======================>.......] - ETA: 0s - loss: 0.3501 - accuracy: 0.8999" ] }, { "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", "1521/1875 [=======================>......] - ETA: 0s - loss: 0.3475 - 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", "1542/1875 [=======================>......] - ETA: 0s - loss: 0.3453 - 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", "1563/1875 [========================>.....] - ETA: 0s - loss: 0.3431 - accuracy: 0.9019" ] }, { "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", "1584/1875 [========================>.....] - ETA: 0s - loss: 0.3404 - 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", "1605/1875 [========================>.....] - ETA: 0s - loss: 0.3381 - 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", "1627/1875 [=========================>....] - ETA: 0s - loss: 0.3362 - accuracy: 0.9040" ] }, { "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", "1648/1875 [=========================>....] - ETA: 0s - loss: 0.3345 - accuracy: 0.9046" ] }, { "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", "1669/1875 [=========================>....] - ETA: 0s - loss: 0.3330 - accuracy: 0.9051" ] }, { "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", "1691/1875 [==========================>...] - ETA: 0s - loss: 0.3312 - accuracy: 0.9055" ] }, { "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", "1712/1875 [==========================>...] - ETA: 0s - loss: 0.3288 - accuracy: 0.9062" ] }, { "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", "1734/1875 [==========================>...] - ETA: 0s - loss: 0.3272 - accuracy: 0.9066" ] }, { "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", "1756/1875 [===========================>..] - ETA: 0s - loss: 0.3252 - accuracy: 0.9071" ] }, { "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", "1778/1875 [===========================>..] - ETA: 0s - loss: 0.3235 - accuracy: 0.9075" ] }, { "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", "1799/1875 [===========================>..] - ETA: 0s - loss: 0.3219 - accuracy: 0.9080" ] }, { "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", "1820/1875 [============================>.] - ETA: 0s - loss: 0.3205 - 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", "1841/1875 [============================>.] - ETA: 0s - loss: 0.3192 - accuracy: 0.9088" ] }, { "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", "1862/1875 [============================>.] - ETA: 0s - loss: 0.3174 - accuracy: 0.9092" ] }, { "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 [==============================] - 8s 3ms/step - loss: 0.3165 - accuracy: 0.9095 - val_loss: 0.1584 - val_accuracy: 0.9553\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 4, "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`를 사용하여 모델을 기본 float32 형식으로 변환합니다." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:27.081780Z", "iopub.status.busy": "2022-12-15T00:58:27.081093Z", "iopub.status.idle": "2022-12-15T00:58:28.143103Z", "shell.execute_reply": "2022-12-15T00:58:28.142180Z" }, "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/tmplvt0uukx/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmplvt0uukx/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 00:58:28.021632: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:362] Ignored output_format.\n", "2022-12-15 00:58:28.021671: 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": 6, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:28.147372Z", "iopub.status.busy": "2022-12-15T00:58:28.146755Z", "iopub.status.idle": "2022-12-15T00:58:28.150861Z", "shell.execute_reply": "2022-12-15T00:58:28.150048Z" }, "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": 7, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:28.154503Z", "iopub.status.busy": "2022-12-15T00:58:28.153916Z", "iopub.status.idle": "2022-12-15T00:58:28.159497Z", "shell.execute_reply": "2022-12-15T00:58:28.158771Z" }, "id": "Ie9pQaQrn5ue" }, "outputs": [ { "data": { "text/plain": [ "84820" ] }, "execution_count": 7, "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": [ "대신 모델을 16x8 양자화 모드로 양자화하려면 먼저 기본 최적화를 사용하도록 `optimizations` 플래그를 설정합니다. 그런 다음 16x8 양자화 모드가 대상 사양에서 지원되는 필수 연산임을 지정합니다." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:28.163062Z", "iopub.status.busy": "2022-12-15T00:58:28.162504Z", "iopub.status.idle": "2022-12-15T00:58:28.166282Z", "shell.execute_reply": "2022-12-15T00:58:28.165367Z" }, "id": "HEZ6ET1AHAS3" }, "outputs": [], "source": [ "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", "converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8]" ] }, { "cell_type": "markdown", "metadata": { "id": "zLxQwZq9CpN7" }, "source": [ "int8 훈련 후 양자화의 경우와 마찬가지로, 변환기 옵션 `inference_input(output)_type`을 tf.int16으로 설정하여 완전히 정수 양자화된 모델을 생성할 수 있습니다." ] }, { "cell_type": "markdown", "metadata": { "id": "yZekFJC5-fOG" }, "source": [ "보정 데이터를 설정합니다." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:28.170026Z", "iopub.status.busy": "2022-12-15T00:58:28.169477Z", "iopub.status.idle": "2022-12-15T00:58:28.659849Z", "shell.execute_reply": "2022-12-15T00:58:28.659098Z" }, "id": "Y3a6XFqvHbYM" }, "outputs": [], "source": [ "mnist_train, _ = tf.keras.datasets.mnist.load_data()\n", "images = tf.cast(mnist_train[0], tf.float32) / 255.0\n", "mnist_ds = tf.data.Dataset.from_tensor_slices((images)).batch(1)\n", "def representative_data_gen():\n", " for input_value in mnist_ds.take(100):\n", " # Model has only one input so each data point has one element.\n", " yield [input_value]\n", "converter.representative_dataset = representative_data_gen" ] }, { "cell_type": "markdown", "metadata": { "id": "xW84iMYjHd9t" }, "source": [ "마지막으로, 평소와 같이 모델을 변환합니다. 기본적으로 변환된 모델은 호출 편의를 위해 여전히 float 입력 및 출력을 사용합니다." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:28.664273Z", "iopub.status.busy": "2022-12-15T00:58:28.663975Z", "iopub.status.idle": "2022-12-15T00:58:30.163359Z", "shell.execute_reply": "2022-12-15T00:58:30.162511Z" }, "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/tmpiqja0kzc/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmpiqja0kzc/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 00:58:29.502394: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:362] Ignored output_format.\n", "2022-12-15 00:58:29.502436: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:365] Ignored drop_control_dependency.\n" ] }, { "data": { "text/plain": [ "24960" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tflite_16x8_model = converter.convert()\n", "tflite_model_16x8_file = tflite_models_dir/\"mnist_model_quant_16x8.tflite\"\n", "tflite_model_16x8_file.write_bytes(tflite_16x8_model)" ] }, { "cell_type": "markdown", "metadata": { "id": "PhMmUTl4sbkz" }, "source": [ "결과 파일이 약 `1/3` 크기인 것에 주목합니다." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:30.167248Z", "iopub.status.busy": "2022-12-15T00:58:30.166580Z", "iopub.status.idle": "2022-12-15T00:58:30.370181Z", "shell.execute_reply": "2022-12-15T00:58:30.368995Z" }, "id": "JExfcfLDscu4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total 156K\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 83K Dec 15 00:58 mnist_model.tflite\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 25K Dec 15 00:58 mnist_model_quant_16x8.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": 12, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:30.374722Z", "iopub.status.busy": "2022-12-15T00:58:30.374439Z", "iopub.status.idle": "2022-12-15T00:58:30.381032Z", "shell.execute_reply": "2022-12-15T00:58:30.380405Z" }, "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": 13, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:30.384334Z", "iopub.status.busy": "2022-12-15T00:58:30.383796Z", "iopub.status.idle": "2022-12-15T00:58:30.387721Z", "shell.execute_reply": "2022-12-15T00:58:30.387071Z" }, "id": "J8Pztk1mvNVL" }, "outputs": [], "source": [ "interpreter_16x8 = tf.lite.Interpreter(model_path=str(tflite_model_16x8_file))\n", "interpreter_16x8.allocate_tensors()" ] }, { "cell_type": "markdown", "metadata": { "id": "2opUt_JTdyEu" }, "source": [ "### 하나의 이미지에서 모델 테스트하기" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:30.390905Z", "iopub.status.busy": "2022-12-15T00:58:30.390678Z", "iopub.status.idle": "2022-12-15T00:58:30.395298Z", "shell.execute_reply": "2022-12-15T00:58:30.394748Z" }, "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": 15, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:30.398765Z", "iopub.status.busy": "2022-12-15T00:58:30.398160Z", "iopub.status.idle": "2022-12-15T00:58:31.095932Z", "shell.execute_reply": "2022-12-15T00:58:31.095249Z" }, "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": 16, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:31.099257Z", "iopub.status.busy": "2022-12-15T00:58:31.099004Z", "iopub.status.idle": "2022-12-15T00:58:31.103258Z", "shell.execute_reply": "2022-12-15T00:58:31.102674Z" }, "id": "3gwhv4lKbYZ4" }, "outputs": [], "source": [ "test_image = np.expand_dims(test_images[0], axis=0).astype(np.float32)\n", "\n", "input_index = interpreter_16x8.get_input_details()[0][\"index\"]\n", "output_index = interpreter_16x8.get_output_details()[0][\"index\"]\n", "\n", "interpreter_16x8.set_tensor(input_index, test_image)\n", "interpreter_16x8.invoke()\n", "predictions = interpreter_16x8.get_tensor(output_index)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:31.106327Z", "iopub.status.busy": "2022-12-15T00:58:31.105857Z", "iopub.status.idle": "2022-12-15T00:58:31.258756Z", "shell.execute_reply": "2022-12-15T00:58:31.258014Z" }, "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": 18, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:31.261952Z", "iopub.status.busy": "2022-12-15T00:58:31.261710Z", "iopub.status.idle": "2022-12-15T00:58:31.267303Z", "shell.execute_reply": "2022-12-15T00:58:31.266628Z" }, "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": 19, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:31.270267Z", "iopub.status.busy": "2022-12-15T00:58:31.269768Z", "iopub.status.idle": "2022-12-15T00:58:32.554366Z", "shell.execute_reply": "2022-12-15T00:58:32.553535Z" }, "id": "T5mWkSbMcU5z" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9553\n" ] } ], "source": [ "print(evaluate_model(interpreter))" ] }, { "cell_type": "markdown", "metadata": { "id": "Km3cY9ry8ZlG" }, "source": [ "16x8 양자화된 모델에 대해 평가를 반복합니다." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T00:58:32.557959Z", "iopub.status.busy": "2022-12-15T00:58:32.557697Z", "iopub.status.idle": "2022-12-15T00:58:36.220486Z", "shell.execute_reply": "2022-12-15T00:58:36.219726Z" }, "id": "-9cnwiPp6EGm" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9554\n" ] } ], "source": [ "# NOTE: This quantization mode is an experimental post-training mode,\n", "# it does not have any optimized kernels implementations or\n", "# specialized machine learning hardware accelerators. Therefore,\n", "# it could be slower than the float interpreter.\n", "print(evaluate_model(interpreter_16x8))" ] }, { "cell_type": "markdown", "metadata": { "id": "L7lfxkor8pgv" }, "source": [ "이 예에서는 정확성에 차이가 없지만 3배 축소된 크기로 모델을 16x8로 양자화했습니다.\n" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "post_training_integer_quant_16x8.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 }