{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "_-GR0EDHM1SO" }, "source": [ "##### Copyright 2019 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2022-12-15T01:03:05.549195Z", "iopub.status.busy": "2022-12-15T01:03:05.548574Z", "iopub.status.idle": "2022-12-15T01:03:05.552823Z", "shell.execute_reply": "2022-12-15T01:03:05.552190Z" }, "id": "R3yYtBPkM2qZ" }, "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": [ "# 훈련 후 동적 범위 양자화" ] }, { "cell_type": "markdown", "metadata": { "id": "CIGrZZPTZVeO" }, "source": [ "\n", " \n", " \n", " \n", " \n", " \n", "
TensorFlow.org에서 보기Google Colab에서 실행GitHub에서 소스 보기노트북 다운로드TF 허브 모델 보기
" ] }, { "cell_type": "markdown", "metadata": { "id": "BTC1rDAuei_1" }, "source": [ "## 개요\n", "\n", "[TensorFlow Lite](https://www.tensorflow.org/lite/)은 이제 tensorflow graphdefs에서 TensorFlow Lite의 플랫 버퍼 형식으로의 모델 변환의 일부로써 가중치를 8bit 정밀도로 변환하는 것을 지원합니다. 동적 범위 양자화는 모델 크기를 4배 줄입니다. 또한 TFLite는 활성화의 즉석 양자화 및 역양자화를 지원하여 다음을 허용합니다.\n", "\n", "1. 가능한 경우 더 빠른 구현을 위해 양자화된 커널 사용하기\n", "2. 그래프의 다른 부분에 대해 부동 소수점 커널과 양자화된 커널을 혼합하기\n", "\n", "활성화는 항상 부동 소수점에 저장됩니다. 양자화된 커널을 지원하는 연산의 경우 활성화는 처리 전에 동적으로 8bit 정밀도로 양자화되고 처리 후 float 정밀도로 역양자화됩니다. 따라서 변환되는 모델에 따라 이 방식으로 순수한 부동 소수점 계산보다 속도를 높일 수 있습니다.\n", "\n", "[양자화 인식 훈련](https://github.com/tensorflow/tensorflow/tree/r1.14/tensorflow/contrib/quantize)과 달리 가중치는 훈련 후 양자화되고 활성화는 이 메서드의 추론에서 동적으로 양자화됩니다. 따라서 모델 가중치는 양자화로 인한 오류를 보상하기 위해 재훈련되지 않습니다. 저하가 허용 가능한지 확인하기 위해 양자화된 모델의 정확성을 확인하는 것이 중요합니다.\n", "\n", "이 가이드에서는 MNIST 모델을 처음부터 훈련하고 TensorFlow에서 정확성을 확인한 다음 동적 범위 양자화를 사용하여 모델을 Tensorflow Lite flatbuffer로 변환합니다. 마지막으로 변환된 모델의 정확성을 확인하고 원본 float 모델과 비교합니다." ] }, { "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-15T01:03:05.556890Z", "iopub.status.busy": "2022-12-15T01:03:05.556369Z", "iopub.status.idle": "2022-12-15T01:03:07.575620Z", "shell.execute_reply": "2022-12-15T01:03:07.574881Z" }, "id": "gyqAw1M9lyab" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 01:03:06.538625: 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 01:03:06.538748: 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 01:03:06.538759: 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": [ "### TensorFlow 모델 훈련하기" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:07.580180Z", "iopub.status.busy": "2022-12-15T01:03:07.579333Z", "iopub.status.idle": "2022-12-15T01:03:19.863558Z", "shell.execute_reply": "2022-12-15T01:03:19.862800Z" }, "id": "hWSAjQWagIHl" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/1875 [..............................] - ETA: 1:18:00 - loss: 2.2821 - 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", " 21/1875 [..............................] - ETA: 4s - loss: 2.1042 - accuracy: 0.3869 " ] }, { "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", " 43/1875 [..............................] - ETA: 4s - loss: 1.8275 - accuracy: 0.5494" ] }, { "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", " 65/1875 [>.............................] - ETA: 4s - loss: 1.5329 - accuracy: 0.6298" ] }, { "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", " 88/1875 [>.............................] - ETA: 4s - loss: 1.3056 - accuracy: 0.6797" ] }, { "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", " 110/1875 [>.............................] - ETA: 4s - loss: 1.1492 - accuracy: 0.7165" ] }, { "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", " 132/1875 [=>............................] - ETA: 4s - loss: 1.0298 - accuracy: 0.7443" ] }, { "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", " 155/1875 [=>............................] - ETA: 4s - loss: 0.9399 - accuracy: 0.7625" ] }, { "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", " 178/1875 [=>............................] - ETA: 3s - loss: 0.8732 - accuracy: 0.7776" ] }, { "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", " 201/1875 [==>...........................] - ETA: 3s - loss: 0.8223 - accuracy: 0.7887" ] }, { "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", " 224/1875 [==>...........................] - ETA: 3s - loss: 0.7750 - accuracy: 0.7997" ] }, { "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", " 247/1875 [==>...........................] - ETA: 3s - loss: 0.7379 - accuracy: 0.8088" ] }, { "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", " 269/1875 [===>..........................] - ETA: 3s - loss: 0.7054 - accuracy: 0.8174" ] }, { "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", " 291/1875 [===>..........................] - ETA: 3s - loss: 0.6765 - accuracy: 0.8247" ] }, { "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", " 314/1875 [====>.........................] - ETA: 3s - loss: 0.6455 - accuracy: 0.8318" ] }, { "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", " 337/1875 [====>.........................] - ETA: 3s - loss: 0.6222 - accuracy: 0.8373" ] }, { "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", " 359/1875 [====>.........................] - ETA: 3s - loss: 0.6015 - accuracy: 0.8419" ] }, { "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", " 381/1875 [=====>........................] - ETA: 3s - loss: 0.5818 - accuracy: 0.8462" ] }, { "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", " 403/1875 [=====>........................] - ETA: 3s - loss: 0.5650 - accuracy: 0.8503" ] }, { "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.5500 - accuracy: 0.8537" ] }, { "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", " 446/1875 [======>.......................] - ETA: 3s - loss: 0.5341 - accuracy: 0.8580" ] }, { "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", " 467/1875 [======>.......................] - ETA: 3s - loss: 0.5231 - accuracy: 0.8607" ] }, { "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", " 489/1875 [======>.......................] - ETA: 3s - loss: 0.5097 - accuracy: 0.8641" ] }, { "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", " 511/1875 [=======>......................] - ETA: 3s - loss: 0.4972 - accuracy: 0.8669" ] }, { "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", " 533/1875 [=======>......................] - ETA: 3s - loss: 0.4871 - accuracy: 0.8691" ] }, { "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", " 555/1875 [=======>......................] - ETA: 3s - loss: 0.4790 - accuracy: 0.8714" ] }, { "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", " 577/1875 [========>.....................] - ETA: 3s - loss: 0.4700 - 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", " 599/1875 [========>.....................] - ETA: 2s - loss: 0.4616 - accuracy: 0.8752" ] }, { "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", " 621/1875 [========>.....................] - ETA: 2s - loss: 0.4542 - accuracy: 0.8768" ] }, { "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", " 643/1875 [=========>....................] - ETA: 2s - loss: 0.4464 - accuracy: 0.8788" ] }, { "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", " 665/1875 [=========>....................] - ETA: 2s - loss: 0.4398 - accuracy: 0.8801" ] }, { "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", " 688/1875 [==========>...................] - ETA: 2s - loss: 0.4325 - 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", " 710/1875 [==========>...................] - ETA: 2s - loss: 0.4251 - accuracy: 0.8840" ] }, { "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", " 732/1875 [==========>...................] - ETA: 2s - loss: 0.4192 - 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", " 754/1875 [===========>..................] - ETA: 2s - loss: 0.4120 - accuracy: 0.8875" ] }, { "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", " 776/1875 [===========>..................] - ETA: 2s - loss: 0.4084 - accuracy: 0.8882" ] }, { "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", " 798/1875 [===========>..................] - ETA: 2s - loss: 0.4036 - 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", " 820/1875 [============>.................] - ETA: 2s - loss: 0.3995 - accuracy: 0.8904" ] }, { "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", " 842/1875 [============>.................] - ETA: 2s - loss: 0.3950 - accuracy: 0.8916" ] }, { "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", " 864/1875 [============>.................] - ETA: 2s - loss: 0.3896 - accuracy: 0.8932" ] }, { "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", " 886/1875 [=============>................] - ETA: 2s - loss: 0.3849 - 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", " 908/1875 [=============>................] - ETA: 2s - loss: 0.3813 - accuracy: 0.8957" ] }, { "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", " 930/1875 [=============>................] - ETA: 2s - loss: 0.3774 - accuracy: 0.8968" ] }, { "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", " 952/1875 [==============>...............] - ETA: 2s - loss: 0.3730 - 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", " 975/1875 [==============>...............] - ETA: 2s - loss: 0.3686 - accuracy: 0.8990" ] }, { "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", " 996/1875 [==============>...............] - ETA: 2s - loss: 0.3638 - accuracy: 0.9003" ] }, { "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", "1019/1875 [===============>..............] - ETA: 1s - loss: 0.3590 - accuracy: 0.9015" ] }, { "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", "1041/1875 [===============>..............] - ETA: 1s - loss: 0.3558 - accuracy: 0.9021" ] }, { "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", "1063/1875 [================>.............] - ETA: 1s - loss: 0.3518 - accuracy: 0.9033" ] }, { "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", "1085/1875 [================>.............] - ETA: 1s - loss: 0.3480 - accuracy: 0.9042" ] }, { "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", "1107/1875 [================>.............] - ETA: 1s - loss: 0.3451 - 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", "1129/1875 [=================>............] - ETA: 1s - loss: 0.3424 - accuracy: 0.9056" ] }, { "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", "1150/1875 [=================>............] - ETA: 1s - loss: 0.3393 - accuracy: 0.9065" ] }, { "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.3363 - accuracy: 0.9073" ] }, { "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", "1194/1875 [==================>...........] - ETA: 1s - loss: 0.3339 - accuracy: 0.9077" ] }, { "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", "1216/1875 [==================>...........] - ETA: 1s - loss: 0.3312 - accuracy: 0.9084" ] }, { "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", "1238/1875 [==================>...........] - ETA: 1s - loss: 0.3279 - accuracy: 0.9094" ] }, { "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", "1260/1875 [===================>..........] - ETA: 1s - loss: 0.3248 - accuracy: 0.9103" ] }, { "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", "1282/1875 [===================>..........] - ETA: 1s - loss: 0.3222 - accuracy: 0.9111" ] }, { "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", "1304/1875 [===================>..........] - ETA: 1s - loss: 0.3200 - accuracy: 0.9118" ] }, { "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", "1326/1875 [====================>.........] - ETA: 1s - loss: 0.3170 - accuracy: 0.9126" ] }, { "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.3143 - 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", "1372/1875 [====================>.........] - ETA: 1s - loss: 0.3116 - accuracy: 0.9139" ] }, { "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", "1394/1875 [=====================>........] - ETA: 1s - loss: 0.3091 - accuracy: 0.9145" ] }, { "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", "1416/1875 [=====================>........] - ETA: 1s - loss: 0.3067 - accuracy: 0.9151" ] }, { "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", "1438/1875 [======================>.......] - ETA: 1s - loss: 0.3035 - accuracy: 0.9160" ] }, { "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", "1460/1875 [======================>.......] - ETA: 0s - loss: 0.3012 - accuracy: 0.9168" ] }, { "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", "1482/1875 [======================>.......] - ETA: 0s - loss: 0.2990 - accuracy: 0.9174" ] }, { "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", "1504/1875 [=======================>......] - ETA: 0s - loss: 0.2967 - accuracy: 0.9180" ] }, { "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", "1526/1875 [=======================>......] - ETA: 0s - loss: 0.2946 - accuracy: 0.9184" ] }, { "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", "1547/1875 [=======================>......] - ETA: 0s - loss: 0.2929 - 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", "1569/1875 [========================>.....] - ETA: 0s - loss: 0.2908 - accuracy: 0.9196" ] }, { "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", "1591/1875 [========================>.....] - ETA: 0s - loss: 0.2889 - accuracy: 0.9201" ] }, { "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", "1613/1875 [========================>.....] - ETA: 0s - loss: 0.2869 - accuracy: 0.9206" ] }, { "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", "1636/1875 [=========================>....] - ETA: 0s - loss: 0.2847 - accuracy: 0.9212" ] }, { "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", "1658/1875 [=========================>....] - ETA: 0s - loss: 0.2824 - accuracy: 0.9219" ] }, { "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.2810 - accuracy: 0.9222" ] }, { "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", "1704/1875 [==========================>...] - ETA: 0s - loss: 0.2789 - accuracy: 0.9228" ] }, { "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", "1726/1875 [==========================>...] - ETA: 0s - loss: 0.2771 - accuracy: 0.9233" ] }, { "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", "1748/1875 [==========================>...] - ETA: 0s - loss: 0.2755 - accuracy: 0.9237" ] }, { "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", "1770/1875 [===========================>..] - ETA: 0s - loss: 0.2733 - accuracy: 0.9244" ] }, { "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", "1792/1875 [===========================>..] - ETA: 0s - loss: 0.2716 - accuracy: 0.9248" ] }, { "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", "1814/1875 [============================>.] - ETA: 0s - loss: 0.2696 - accuracy: 0.9254" ] }, { "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", "1837/1875 [============================>.] - ETA: 0s - loss: 0.2682 - accuracy: 0.9258" ] }, { "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", "1860/1875 [============================>.] - ETA: 0s - loss: 0.2663 - accuracy: 0.9263" ] }, { "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.2650 - accuracy: 0.9266 - val_loss: 0.1233 - val_accuracy: 0.9642\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%의 정확성으로만 훈련됩니다.\n" ] }, { "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-15T01:03:19.867536Z", "iopub.status.busy": "2022-12-15T01:03:19.866897Z", "iopub.status.idle": "2022-12-15T01:03:20.907919Z", "shell.execute_reply": "2022-12-15T01:03:20.907222Z" }, "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/tmpq7400iyt/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmpq7400iyt/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 01:03:20.786774: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:362] Ignored output_format.\n", "2022-12-15 01:03:20.786817: 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-15T01:03:20.911260Z", "iopub.status.busy": "2022-12-15T01:03:20.911004Z", "iopub.status.idle": "2022-12-15T01:03:20.914644Z", "shell.execute_reply": "2022-12-15T01:03:20.913987Z" }, "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-15T01:03:20.917976Z", "iopub.status.busy": "2022-12-15T01:03:20.917572Z", "iopub.status.idle": "2022-12-15T01:03:20.922359Z", "shell.execute_reply": "2022-12-15T01:03:20.921751Z" }, "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": [ "내보낼 때 모델을 양자화하려면 `optimizations` 플래그를 지정하여 크기를 최적화합니다." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:20.925762Z", "iopub.status.busy": "2022-12-15T01:03:20.925191Z", "iopub.status.idle": "2022-12-15T01:03:21.851026Z", "shell.execute_reply": "2022-12-15T01:03:21.850165Z" }, "id": "g8PUvLWDlmmz" }, "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/tmp5povdt1q/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmp5povdt1q/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 01:03:21.721141: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:362] Ignored output_format.\n", "2022-12-15 01:03:21.721182: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:365] Ignored drop_control_dependency.\n" ] }, { "data": { "text/plain": [ "24064" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", "tflite_quant_model = converter.convert()\n", "tflite_model_quant_file = tflite_models_dir/\"mnist_model_quant.tflite\"\n", "tflite_model_quant_file.write_bytes(tflite_quant_model)" ] }, { "cell_type": "markdown", "metadata": { "id": "PhMmUTl4sbkz" }, "source": [ "결과 파일의 약 `1/4` 크기인지 확인하세요." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:21.855157Z", "iopub.status.busy": "2022-12-15T01:03:21.854910Z", "iopub.status.idle": "2022-12-15T01:03:22.053461Z", "shell.execute_reply": "2022-12-15T01:03:22.052228Z" }, "id": "JExfcfLDscu4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total 180K\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 83K Dec 15 01:03 mnist_model.tflite\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 24K Dec 15 01:03 mnist_model_quant.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": [ "## TFLite 모델 실행하기\n", "\n", "Python TensorFlow Lite 인터프리터를 사용하여 TensorFlow Lite 모델을 실행합니다.\n" ] }, { "cell_type": "markdown", "metadata": { "id": "Ap_jE7QRvhPf" }, "source": [ "### 인터프리터에 모델 로드하기" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:22.057811Z", "iopub.status.busy": "2022-12-15T01:03:22.057507Z", "iopub.status.idle": "2022-12-15T01:03:22.064303Z", "shell.execute_reply": "2022-12-15T01:03:22.063453Z" }, "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": 10, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:22.067687Z", "iopub.status.busy": "2022-12-15T01:03:22.067225Z", "iopub.status.idle": "2022-12-15T01:03:22.071208Z", "shell.execute_reply": "2022-12-15T01:03:22.070354Z" }, "id": "J8Pztk1mvNVL" }, "outputs": [], "source": [ "interpreter_quant = tf.lite.Interpreter(model_path=str(tflite_model_quant_file))\n", "interpreter_quant.allocate_tensors()" ] }, { "cell_type": "markdown", "metadata": { "id": "2opUt_JTdyEu" }, "source": [ "### 하나의 이미지에서 모델 테스트하기" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:22.074771Z", "iopub.status.busy": "2022-12-15T01:03:22.074151Z", "iopub.status.idle": "2022-12-15T01:03:22.079234Z", "shell.execute_reply": "2022-12-15T01:03:22.078561Z" }, "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": 12, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:22.082159Z", "iopub.status.busy": "2022-12-15T01:03:22.081712Z", "iopub.status.idle": "2022-12-15T01:03:22.777036Z", "shell.execute_reply": "2022-12-15T01:03:22.776172Z" }, "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": "markdown", "metadata": { "id": "LwN7uIdCd8Gw" }, "source": [ "### 모델 평가하기" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:22.781155Z", "iopub.status.busy": "2022-12-15T01:03:22.780498Z", "iopub.status.idle": "2022-12-15T01:03:22.787821Z", "shell.execute_reply": "2022-12-15T01:03:22.786911Z" }, "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": 14, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:22.791054Z", "iopub.status.busy": "2022-12-15T01:03:22.790811Z", "iopub.status.idle": "2022-12-15T01:03:24.033187Z", "shell.execute_reply": "2022-12-15T01:03:24.032256Z" }, "id": "DqXBnDfJ7qxL" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9642\n" ] } ], "source": [ "print(evaluate_model(interpreter))" ] }, { "cell_type": "markdown", "metadata": { "id": "Km3cY9ry8ZlG" }, "source": [ "다음을 얻기 위해 동적 범위 양자화 모델에 대한 평가를 반복합니다.\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:24.037205Z", "iopub.status.busy": "2022-12-15T01:03:24.036558Z", "iopub.status.idle": "2022-12-15T01:03:25.307130Z", "shell.execute_reply": "2022-12-15T01:03:25.306122Z" }, "id": "-9cnwiPp6EGm" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9638\n" ] } ], "source": [ "print(evaluate_model(interpreter_quant))" ] }, { "cell_type": "markdown", "metadata": { "id": "L7lfxkor8pgv" }, "source": [ "이 예에서 압축된 모델은 정확성에 차이가 없습니다." ] }, { "cell_type": "markdown", "metadata": { "id": "M0o1FtmWeKZm" }, "source": [ "## 기존 모델 최적화하기\n", "\n", "사전 활성화 레이어 (Resnet-v2)가 있는 Resnet은 비전 애플리케이션에 널리 사용됩니다. resnet-v2-101에 대해 사전 훈련된 고정 그래프는 [Tensorflow Hub](https://tfhub.dev/google/imagenet/resnet_v2_101/classification/4)에서 사용할 수 있습니다.\n", "\n", "다음과 같이 양자화를 사용하여 고정된 그래프를 TensorFLow Lite flatbuffer로 변환할 수 있습니다.\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:25.310922Z", "iopub.status.busy": "2022-12-15T01:03:25.310429Z", "iopub.status.idle": "2022-12-15T01:03:30.113776Z", "shell.execute_reply": "2022-12-15T01:03:30.113018Z" }, "id": "jrXZxSJiJfYN" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:Please fix your imports. Module tensorflow.python.training.tracking.data_structures has been moved to tensorflow.python.trackable.data_structures. The old module will be deleted in version 2.11.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:tensorflow:Please fix your imports. Module tensorflow.python.training.tracking.data_structures has been moved to tensorflow.python.trackable.data_structures. The old module will be deleted in version 2.11.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.9/site-packages/tensorflow/python/autograph/pyct/static_analysis/liveness.py:83: Analyzer.lamba_check (from tensorflow.python.autograph.pyct.static_analysis.liveness) is deprecated and will be removed after 2023-09-23.\n", "Instructions for updating:\n", "Lambda fuctions will be no more assumed to be used in the statement where they are used, or at least in the same block. https://github.com/tensorflow/tensorflow/issues/56089\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.9/site-packages/tensorflow/python/autograph/pyct/static_analysis/liveness.py:83: Analyzer.lamba_check (from tensorflow.python.autograph.pyct.static_analysis.liveness) is deprecated and will be removed after 2023-09-23.\n", "Instructions for updating:\n", "Lambda fuctions will be no more assumed to be used in the statement where they are used, or at least in the same block. https://github.com/tensorflow/tensorflow/issues/56089\n" ] } ], "source": [ "import tensorflow_hub as hub\n", "\n", "resnet_v2_101 = tf.keras.Sequential([\n", " keras.layers.InputLayer(input_shape=(224, 224, 3)),\n", " hub.KerasLayer(\"https://tfhub.dev/google/imagenet/resnet_v2_101/classification/4\")\n", "])\n", "\n", "converter = tf.lite.TFLiteConverter.from_keras_model(resnet_v2_101)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:30.118081Z", "iopub.status.busy": "2022-12-15T01:03:30.117569Z", "iopub.status.idle": "2022-12-15T01:03:56.689039Z", "shell.execute_reply": "2022-12-15T01:03:56.688075Z" }, "id": "LwnV4KxwVEoG" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmpsvt1tisp/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmpsvt1tisp/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 01:03:49.703095: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:362] Ignored output_format.\n", "2022-12-15 01:03:49.703150: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:365] Ignored drop_control_dependency.\n" ] }, { "data": { "text/plain": [ "178422328" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Convert to TF Lite without quantization\n", "resnet_tflite_file = tflite_models_dir/\"resnet_v2_101.tflite\"\n", "resnet_tflite_file.write_bytes(converter.convert())" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:03:56.693183Z", "iopub.status.busy": "2022-12-15T01:03:56.692478Z", "iopub.status.idle": "2022-12-15T01:04:32.895827Z", "shell.execute_reply": "2022-12-15T01:04:32.894928Z" }, "id": "2qkZD0VoVExe" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmpsfg1r109/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: /tmpfs/tmp/tmpsfg1r109/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-12-15 01:04:16.044587: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:362] Ignored output_format.\n", "2022-12-15 01:04:16.044638: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:365] Ignored drop_control_dependency.\n" ] }, { "data": { "text/plain": [ "45733968" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Convert to TF Lite with quantization\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", "resnet_quantized_tflite_file = tflite_models_dir/\"resnet_v2_101_quantized.tflite\"\n", "resnet_quantized_tflite_file.write_bytes(converter.convert())" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2022-12-15T01:04:32.899690Z", "iopub.status.busy": "2022-12-15T01:04:32.899029Z", "iopub.status.idle": "2022-12-15T01:04:33.148264Z", "shell.execute_reply": "2022-12-15T01:04:33.147286Z" }, "id": "vhOjeg1x9Knp" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-rw-rw-r-- 1 kbuilder kbuilder 83K Dec 15 01:03 /tmp/mnist_tflite_models/mnist_model.tflite\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 24K Dec 15 01:03 /tmp/mnist_tflite_models/mnist_model_quant.tflite\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 25K Dec 15 00:58 /tmp/mnist_tflite_models/mnist_model_quant_16x8.tflite\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 44K Dec 15 00:56 /tmp/mnist_tflite_models/mnist_model_quant_f16.tflite\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 171M Dec 15 01:03 /tmp/mnist_tflite_models/resnet_v2_101.tflite\r\n", "-rw-rw-r-- 1 kbuilder kbuilder 44M Dec 15 01:04 /tmp/mnist_tflite_models/resnet_v2_101_quantized.tflite\r\n" ] } ], "source": [ "!ls -lh {tflite_models_dir}/*.tflite" ] }, { "cell_type": "markdown", "metadata": { "id": "qqHLaqFMCjRZ" }, "source": [ "모델 크기가 171MB에서 43MB로 줄어듭니다. imagenet에서 이 모델의 정확성은 [TFLite 정확성 측정](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/tools/evaluation/tasks/imagenet_image_classification)을 위해 제공된 스크립트를 사용하여 평가할 수 있습니다.\n", "\n", "최적화된 모델 상위 1개 정확성은 부동 소수점 모델과 같은 76.8입니다." ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "post_training_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 }