jonesmarquelle
commited on
Commit
·
b7895c0
1
Parent(s):
35f966b
Upload 4 files
Browse files- huggingface/classify_nums.py +43 -0
- model.ipynb +1 -0
- test drawings/3.png +0 -0
- test drawings/4.png +0 -0
huggingface/classify_nums.py
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# -*- coding: utf-8 -*-
|
2 |
+
"""classify_nums.ipynb
|
3 |
+
|
4 |
+
Partially generated by Colaboratory.
|
5 |
+
|
6 |
+
Original file is located at
|
7 |
+
https://colab.research.google.com/drive/1UlXGnv-1ivfoGQp4c0k-xONsC5kUjSNm
|
8 |
+
"""
|
9 |
+
|
10 |
+
# Commented out IPython magic to ensure Python compatibility.
|
11 |
+
# %pip install huggingface_hub["tensorflow"]
|
12 |
+
|
13 |
+
import tensorflow as tf
|
14 |
+
from tensorflow import image, expand_dims, math
|
15 |
+
from tensorflow.keras import backend
|
16 |
+
|
17 |
+
from huggingface_hub import from_pretrained_keras
|
18 |
+
|
19 |
+
model = from_pretrained_keras("jonesmarquelle/classify-nums")
|
20 |
+
|
21 |
+
import tkinter as tk
|
22 |
+
from tkinter import filedialog
|
23 |
+
|
24 |
+
root = tk.Tk()
|
25 |
+
root.withdraw()
|
26 |
+
|
27 |
+
print("Open image file...")
|
28 |
+
filename = filedialog.askopenfilename()
|
29 |
+
|
30 |
+
from PIL import Image
|
31 |
+
im = Image.open(filename)
|
32 |
+
|
33 |
+
im = tf.image.rgb_to_grayscale(im)
|
34 |
+
#print(im.shape)
|
35 |
+
|
36 |
+
x_image = tf.image.resize(im, (28, 28))
|
37 |
+
x_image = tf.expand_dims(x_image, 0)
|
38 |
+
#print(x_image.shape)
|
39 |
+
|
40 |
+
out_tensor = model.predict(x_image, verbose=0)
|
41 |
+
res = tf.math.argmax(out_tensor[0])
|
42 |
+
res = tf.keras.backend.eval(res)
|
43 |
+
print("Prediction: ", res)
|
model.ipynb
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"gpuType":"T4","authorship_tag":"ABX9TyN7QQmqz6rQQd8wOTnaHKtz"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"accelerator":"GPU","widgets":{"application/vnd.jupyter.widget-state+json":{"b00001db191e491ca4bb6cace0dd75ad":{"model_module":"@jupyter-widgets/output","model_name":"OutputModel","model_module_version":"1.0.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/output","_model_module_version":"1.0.0","_model_name":"OutputModel","_view_count":null,"_view_module":"@jupyter-widgets/output","_view_module_version":"1.0.0","_view_name":"OutputView","layout":"IPY_MODEL_3aea818fc01d4d9e871d4fa6272c99e4","msg_id":"","outputs":[]}},"3aea818fc01d4d9e871d4fa6272c99e4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9c5c98ab8673478ebf46f95ff46f58a1":{"model_module":"ipycanvas","model_name":"CanvasModel","model_module_version":"^0.13","state":{"_canvas_manager":"IPY_MODEL_4fe44d0a3cbc445194f5b916faf00dd4","_dom_classes":[],"_model_module":"ipycanvas","_model_module_version":"^0.13","_model_name":"CanvasModel","_send_client_ready_event":true,"_view_count":null,"_view_module":"ipycanvas","_view_module_version":"^0.13","_view_name":"CanvasView","height":56,"image_data":null,"layout":"IPY_MODEL_80990f5105f34cc99418a66f9595a931","sync_image_data":true,"width":56}},"80990f5105f34cc99418a66f9595a931":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}}}}},"cells":[{"cell_type":"code","source":["# @title Setup Environment\n","\n","MOUNT_DRIVE = False # @param {type:\"boolean\"}\n","MODEL_DIR_NAME = \"mnist_model\" # @param {type:\"string\"}\n","TUNING_DIR_NAME = \"tuning\"\n","\n","if MOUNT_DRIVE:\n"," from google.colab import drive\n"," drive.mount('/content/drive')\n"," MODEL_FILEPATH = f'/content/drive/MyDrive/{MODEL_DIR_NAME}'\n"," TUNING_DIR = f'/content/drive/MyDrive/{TUNING_DIR_NAME}'\n","else:\n"," MODEL_FILEPATH = f'./{MODEL_DIR_NAME}'\n"," TUNING_DIR = f'./{TUNING_DIR_NAME}'"],"metadata":{"id":"Q32cdI0x0U1W"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# @title Check for Google Colab\n","\n","import sys\n","IN_COLAB = 'google.colab' in sys.modules\n","\n","if IN_COLAB:\n"," from google.colab import output\n"," output.enable_custom_widget_manager()"],"metadata":{"id":"oBtPTXNEpDE6","executionInfo":{"status":"ok","timestamp":1694462888877,"user_tz":240,"elapsed":143,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":105,"outputs":[]},{"cell_type":"code","source":["# @title Install dependencies\n","\n","#!pip install keras-tuner\n","!pip install ipycanvas"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"QgsSPQRpHvAo","outputId":"06bef49b-237e-42f7-a0ca-dddaf211926b","executionInfo":{"status":"ok","timestamp":1694458729168,"user_tz":240,"elapsed":14602,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Requirement already satisfied: tensorflow-io in /usr/local/lib/python3.10/dist-packages (0.34.0)\n","Requirement already satisfied: tensorflow-io-gcs-filesystem==0.34.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow-io) (0.34.0)\n","Requirement already satisfied: keras-tuner in /usr/local/lib/python3.10/dist-packages (1.3.5)\n","Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from keras-tuner) (23.1)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from keras-tuner) (2.31.0)\n","Requirement already satisfied: kt-legacy in /usr/local/lib/python3.10/dist-packages (from keras-tuner) (1.0.5)\n","Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->keras-tuner) (3.2.0)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->keras-tuner) (3.4)\n","Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->keras-tuner) (2.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->keras-tuner) (2023.7.22)\n","Collecting ipycanvas\n"," Downloading ipycanvas-0.13.1-py2.py3-none-any.whl (255 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m255.7/255.7 kB\u001b[0m \u001b[31m5.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: ipywidgets<9,>=7.6.0 in /usr/local/lib/python3.10/dist-packages (from ipycanvas) (7.7.1)\n","Requirement already satisfied: pillow>=6.0 in /usr/local/lib/python3.10/dist-packages (from ipycanvas) (9.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from ipycanvas) (1.23.5)\n","Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets<9,>=7.6.0->ipycanvas) (5.5.6)\n","Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets<9,>=7.6.0->ipycanvas) (0.2.0)\n","Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets<9,>=7.6.0->ipycanvas) (5.7.1)\n","Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets<9,>=7.6.0->ipycanvas) (3.6.5)\n","Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets<9,>=7.6.0->ipycanvas) (7.34.0)\n","Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets<9,>=7.6.0->ipycanvas) (3.0.8)\n","Requirement already satisfied: jupyter-client in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets<9,>=7.6.0->ipycanvas) (6.1.12)\n","Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets<9,>=7.6.0->ipycanvas) (6.3.2)\n","Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (67.7.2)\n","Collecting jedi>=0.16 (from ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas)\n"," Downloading jedi-0.19.0-py2.py3-none-any.whl (1.6 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m43.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: decorator in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (4.4.2)\n","Requirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.7.5)\n","Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (3.0.39)\n","Requirement already satisfied: pygments in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (2.16.1)\n","Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.2.0)\n","Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.1.6)\n","Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (4.8.0)\n","Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (6.5.5)\n","Requirement already satisfied: parso<0.9.0,>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.8.3)\n","Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (3.1.2)\n","Requirement already satisfied: pyzmq<25,>=17 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (23.2.1)\n","Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (23.1.0)\n","Requirement already satisfied: jupyter-core>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (5.3.1)\n","Requirement already satisfied: nbformat in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (5.9.2)\n","Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (6.5.4)\n","Requirement already satisfied: nest-asyncio>=1.5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.5.7)\n","Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.8.2)\n","Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.17.1)\n","Requirement already satisfied: prometheus-client in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.17.1)\n","Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.0.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.10/dist-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets<9,>=7.6.0->ipycanvas) (2.8.2)\n","Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.7.0)\n","Requirement already satisfied: wcwidth in /usr/local/lib/python3.10/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.2.6)\n","Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.10/dist-packages (from jupyter-core>=4.6.1->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (3.10.0)\n","Requirement already satisfied: jupyter-server>=1.8 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.24.0)\n","Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.2.3)\n","Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (4.9.3)\n","Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (4.11.2)\n","Requirement already satisfied: bleach in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (6.0.0)\n","Requirement already satisfied: defusedxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.7.1)\n","Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.4)\n","Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.2.2)\n","Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (2.1.3)\n","Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.8.4)\n","Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.8.0)\n","Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (23.1)\n","Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.5.0)\n","Requirement already satisfied: tinycss2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.2.1)\n","Requirement already satisfied: fastjsonschema in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (2.18.0)\n","Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (4.19.0)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.1->jupyter-client->ipykernel>=4.5.1->ipywidgets<9,>=7.6.0->ipycanvas) (1.16.0)\n","Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.10/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (21.2.0)\n","Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (23.1.0)\n","Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (2023.7.1)\n","Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.30.2)\n","Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.10.2)\n","Requirement already satisfied: anyio<4,>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (3.7.1)\n","Requirement already satisfied: websocket-client in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.6.2)\n","Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.15.1)\n","Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (2.5)\n","Requirement already satisfied: webencodings in /usr/local/lib/python3.10/dist-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (0.5.1)\n","Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (3.4)\n","Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.3.0)\n","Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (1.1.3)\n","Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.6.0->ipycanvas) (2.21)\n","Installing collected packages: jedi, ipycanvas\n","Successfully installed ipycanvas-0.13.1 jedi-0.19.0\n"]}]},{"cell_type":"markdown","source":["Read in dataset"],"metadata":{"id":"-ksboZoiKPyH"}},{"cell_type":"code","source":["import tensorflow as tf\n","import os\n","\n","(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()"],"metadata":{"id":"Q1JzFbN_Djj1","executionInfo":{"status":"ok","timestamp":1694461471001,"user_tz":240,"elapsed":535,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":87,"outputs":[]},{"cell_type":"code","source":["from PIL import Image\n","import numpy as np\n","\n","display(Image.fromarray(np.hstack(x_train[:10])))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":45},"id":"tTjNyyz7se4_","executionInfo":{"status":"ok","timestamp":1694461471002,"user_tz":240,"elapsed":27,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}},"outputId":"0e91ba5c-c52a-42ae-a3aa-02a38b8070f8"},"execution_count":88,"outputs":[{"output_type":"display_data","data":{"text/plain":["<PIL.Image.Image image mode=L size=280x28>"],"image/png":"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\n"},"metadata":{}}]},{"cell_type":"code","source":["print(x_test.shape)\n","print(y_test.shape)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"8kBIco1bWh3e","executionInfo":{"status":"ok","timestamp":1694461471002,"user_tz":240,"elapsed":20,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}},"outputId":"92bc5a04-d126-4e96-e6ce-4dc34ba46cb1"},"execution_count":89,"outputs":[{"output_type":"stream","name":"stdout","text":["(10000, 28, 28)\n","(10000,)\n"]}]},{"cell_type":"markdown","source":["Train Model"],"metadata":{"id":"FaP43HL6Mdn6"}},{"cell_type":"code","source":["# @title Training Constants { run: \"auto\" }\n","# @markdown Number of iterations over whole dataset\n","EPOCHS = 3 # @param {type:\"integer\"}"],"metadata":{"id":"L5Qs3w7Et50H","executionInfo":{"status":"ok","timestamp":1694461471003,"user_tz":240,"elapsed":14,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":90,"outputs":[]},{"cell_type":"code","source":["import tensorflow as tf\n","from tensorflow.keras.layers import Input, Conv2D, Flatten, Dense\n","from tensorflow.keras.models import Model\n","from keras.optimizers import Adam\n","\n","#Pass in hp to tune hyperparameters (# of nodes, activation function)\n","def build_model(hp):\n"," # Define input layers for each type of input\n"," cnn_input = Input((28,28,1))\n","\n"," x = Conv2D(hp.Int('cnn_units_1', min_value=32, max_value=512, step=32), (5, 5), strides=(5,5), padding=\"same\", activation=hp.Choice('activation', values=['relu', 'sigmoid', 'tanh']))(cnn_input)\n"," x = Conv2D(hp.Int('cnn_units_3', min_value=32, max_value=512, step=32), (3, 3), padding=\"same\", activation=hp.Choice('activation', values=['relu', 'sigmoid', 'tanh']))(x)\n"," x = Flatten()(x)\n","\n"," # Add more layers if needed\n"," combined = Dense(hp.Int('dense_units_4', min_value=32, max_value=512, step=32), activation=hp.Choice('activation', values=['relu', 'sigmoid', 'tanh']))(x)\n"," combined = Dense(hp.Int('dense_units_6', min_value=32, max_value=512, step=32), activation=hp.Choice('activation', values=['relu', 'sigmoid', 'tanh']))(combined)\n"," output = Dense(10, activation='softmax')(combined)\n","\n"," # Create the model\n"," model = Model(inputs=[cnn_input], outputs=output)\n","\n"," # Compile the model\n"," model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n","\n"," return model\n"],"metadata":{"id":"Gb_3AdfIYCt5","executionInfo":{"status":"ok","timestamp":1694461471003,"user_tz":240,"elapsed":13,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":91,"outputs":[]},{"cell_type":"markdown","source":["Search for best hyperparameters"],"metadata":{"id":"pjQyt-i0nh2V"}},{"cell_type":"code","source":["# @title { form-width: \"256px\" }\n","# @title { form-width: \"128px\" }\n","# @title { run: \"auto\", form-width: \"30px\" }\n","from keras_tuner.tuners import Hyperband\n","\n","tune_parameters = False # @param {type:\"boolean\"}\n","overwrite = False # @param {type:\"boolean\"}\n","\n","if tune_parameters:\n"," tuner = Hyperband(\n"," hypermodel=build_model,\n"," objective='val_accuracy',\n"," overwrite=overwrite,\n"," max_epochs=EPOCHS,\n"," directory=TUNING_DIR, # Directory to save the results\n"," project_name='tune_mnist'\n"," )"],"metadata":{"id":"ot8jz9zqXjbf","executionInfo":{"status":"ok","timestamp":1694461471004,"user_tz":240,"elapsed":14,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":92,"outputs":[]},{"cell_type":"code","source":["if tune_parameters:\n"," tuner.search(\n"," x=x_train, y=y_train,\\\n"," epochs=EPOCHS,\\\n"," batch_size=100,\\\n"," validation_data=(x_test, y_test),\\\n"," use_multiprocessing=True\n"," )"],"metadata":{"id":"lRbh8Z_wfr9K","executionInfo":{"status":"ok","timestamp":1694461471004,"user_tz":240,"elapsed":13,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":93,"outputs":[]},{"cell_type":"code","source":["#Build model using optimal hyperparameters\n","best_hps = tuner.get_best_hyperparameters(num_trials=1)[0]\n","best_model = build_model(best_hps)"],"metadata":{"id":"K4t2tXM_cmvK","executionInfo":{"status":"ok","timestamp":1694462017635,"user_tz":240,"elapsed":105,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":102,"outputs":[]},{"cell_type":"code","source":["history = best_model.fit(\n"," x=x_train, y=y_train,\\\n"," epochs=EPOCHS,\\\n"," validation_data=(x_test, y_test),\\\n"," use_multiprocessing=True,\\\n"," callbacks=[tf.keras.callbacks.EarlyStopping(monitor='accuracy', patience=3)]\n",")"],"metadata":{"id":"sRvJerT4nqyY","colab":{"base_uri":"https://localhost:8080/","height":459},"executionInfo":{"status":"error","timestamp":1694462062555,"user_tz":240,"elapsed":43112,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}},"outputId":"c8768559-25ae-476f-aa9f-40c997a3eba3"},"execution_count":103,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/3\n","1875/1875 [==============================] - 14s 6ms/step - loss: 0.2214 - accuracy: 0.9475 - val_loss: 0.1343 - val_accuracy: 0.9614\n","Epoch 2/3\n","1875/1875 [==============================] - 11s 6ms/step - loss: 0.0923 - accuracy: 0.9732 - val_loss: 0.0926 - val_accuracy: 0.9741\n","Epoch 3/3\n","1875/1875 [==============================] - 12s 6ms/step - loss: 0.0787 - accuracy: 0.9789 - val_loss: 0.0969 - val_accuracy: 0.9753\n"]},{"output_type":"error","ename":"UnimplementedError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mUnimplementedError\u001b[0m Traceback (most recent call last)","\u001b[0;32m<ipython-input-103-aef4cc750c4d>\u001b[0m in \u001b[0;36m<cell line: 9>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 7\u001b[0m )\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mbest_model\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'/content/drive/mnist_model'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/keras/src/utils/traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;31m# To get the full stack trace, call:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0;31m# `tf.debugging.disable_traceback_filtering()`\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 70\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwith_traceback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiltered_tb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mfiltered_tb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/tensorflow/python/lib/io/file_io.py\u001b[0m in \u001b[0;36mrecursive_create_dir_v2\u001b[0;34m(path)\u001b[0m\n\u001b[1;32m 511\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mIf\u001b[0m \u001b[0mthe\u001b[0m \u001b[0moperation\u001b[0m \u001b[0mfails\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 512\u001b[0m \"\"\"\n\u001b[0;32m--> 513\u001b[0;31m \u001b[0m_pywrap_file_io\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mRecursivelyCreateDir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath_to_bytes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 514\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 515\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mUnimplementedError\u001b[0m: /content/drive/mnist_model; Operation not supported"]}]},{"cell_type":"code","source":["best_model.save(MODEL_FILEPATH)"],"metadata":{"id":"iQHjUcbL0ADj","executionInfo":{"status":"ok","timestamp":1694462160074,"user_tz":240,"elapsed":1107,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":104,"outputs":[]},{"cell_type":"code","source":["model = tf.keras.models.load_model(MODEL_FILEPATH)"],"metadata":{"id":"d8RuK5_Guofs","executionInfo":{"status":"ok","timestamp":1694461566538,"user_tz":240,"elapsed":409,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":96,"outputs":[]},{"cell_type":"code","source":["from matplotlib import pyplot as plt\n","\n","plt.plot(history.history['loss'])\n","plt.plot(history.history['val_loss'])\n","plt.title('model loss')\n","plt.ylabel('loss')\n","plt.xlabel('epoch')\n","plt.legend(['train', 'val'], loc='upper left')\n","plt.show()"],"metadata":{"id":"fjPZJa9OyrnS","colab":{"base_uri":"https://localhost:8080/","height":472},"executionInfo":{"status":"ok","timestamp":1694461566941,"user_tz":240,"elapsed":407,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}},"outputId":"34d89646-0721-4b76-94fa-8b2f97914042"},"execution_count":97,"outputs":[{"output_type":"display_data","data":{"text/plain":["<Figure size 640x480 with 1 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAkgAAAHHCAYAAABEEKc/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxLElEQVR4nO3dd3xUVf7/8dfMpJFOEtIgEJp0Qg+InWgQwYYKiF+K7bcuqBjdVfyq2L6GVXSxoOy6FlxhRVFQQVFAwFVDMYj03kkjQDqkzfz+uGRCQjGETG7K+/l43AeTO3fu/dwoyZtzzj3H4nA4HIiIiIiIk9XsAkRERETqGgUkERERkUoUkEREREQqUUASERERqUQBSURERKQSBSQRERGRShSQRERERCpRQBIRERGpRAFJREREpBIFJBFpFPbt24fFYuHDDz+84M+uWLECi8XCihUrznvchx9+iMViYd++fdWqUUTqDgUkERERkUoUkEREREQqUUASERERqUQBSURqxbPPPovFYmHHjh3cddddBAQE0KxZM55++mkcDgcHDx7kpptuwt/fn/DwcF599dUzzpGRkcE999xDWFgYXl5exMTEMGvWrDOOy8rKYty4cQQEBBAYGMjYsWPJyso6a13btm3jtttuIygoCC8vL/r06cNXX31Vo/f+9ttv06VLFzw9PYmMjGTChAln1LNz506GDx9OeHg4Xl5etGjRgpEjR5Kdne08ZsmSJVx22WUEBgbi6+tLhw4dePLJJ2u0VhExuJldgIg0LiNGjKBTp05MnTqVRYsW8eKLLxIUFMQ//vEPrrnmGv72t78xe/ZsHnvsMfr27csVV1wBwIkTJ7jqqqvYtWsXEydOpHXr1nz22WeMGzeOrKwsHn74YQAcDgc33XQTP/30E3/605/o1KkT8+fPZ+zYsWfUsnnzZgYOHEjz5s154okn8PHx4dNPP+Xmm2/m888/55Zbbrno+3322Wd57rnniIuL44EHHmD79u288847rF27lp9//hl3d3eKioqIj4+nsLCQBx98kPDwcA4fPszChQvJysoiICCAzZs3M3ToULp3787zzz+Pp6cnu3bt4ueff77oGkXkLBwiIrVgypQpDsBx//33O/eVlJQ4WrRo4bBYLI6pU6c69x8/ftzRpEkTx9ixY537pk+f7gAcH3/8sXNfUVGRY8CAAQ5fX19HTk6Ow+FwOBYsWOAAHC+//HKF61x++eUOwPHBBx849w8aNMjRrVs3x8mTJ5377Ha749JLL3W0b9/euW/58uUOwLF8+fLz3uMHH3zgABx79+51OBwOR0ZGhsPDw8Nx3XXXOUpLS53HvfXWWw7A8f777zscDofjt99+cwCOzz777Jzn/vvf/+4AHEeOHDlvDSJSM9TFJiK16t5773W+ttls9OnTB4fDwT333OPcHxgYSIcOHdizZ49z3zfffEN4eDijRo1y7nN3d+ehhx4iLy+PlStXOo9zc3PjgQceqHCdBx98sEIdx44d44cffuCOO+4gNzeXzMxMMjMzOXr0KPHx8ezcuZPDhw9f1L0uXbqUoqIiJk2ahNVa/uP2vvvuw9/fn0WLFgEQEBAAwHfffUdBQcFZzxUYGAjAl19+id1uv6i6ROSPKSCJSK1q2bJlha8DAgLw8vIiJCTkjP3Hjx93fr1//37at29fIWgAdOrUyfl+2Z8RERH4+vpWOK5Dhw4Vvt61axcOh4Onn36aZs2aVdimTJkCGGOeLkZZTZWv7eHhQZs2bZzvt27dmoSEBP71r38REhJCfHw8M2bMqDD+aMSIEQwcOJB7772XsLAwRo4cyaeffqqwJOIiGoMkIrXKZrNVaR8Y44lcpSxYPPbYY8THx5/1mHbt2rns+pW9+uqrjBs3ji+//JLvv/+ehx56iMTERFatWkWLFi1o0qQJP/74I8uXL2fRokUsXryYuXPncs011/D999+f83soItWjFiQRqRdatWrFzp07z2gx2bZtm/P9sj9TU1PJy8urcNz27dsrfN2mTRvA6KaLi4s76+bn53fRNZ/t2kVFRezdu9f5fplu3brx1FNP8eOPP/Lf//6Xw4cPM3PmTOf7VquVQYMG8dprr7Flyxb+7//+jx9++IHly5dfVJ0iciYFJBGpF4YMGUJaWhpz58517ispKeHNN9/E19eXK6+80nlcSUkJ77zzjvO40tJS3nzzzQrnCw0N5aqrruIf//gHqampZ1zvyJEjF11zXFwcHh4evPHGGxVaw9577z2ys7O54YYbAMjJyaGkpKTCZ7t164bVaqWwsBAwxkxV1qNHDwDnMSJSc9TFJiL1wv33388//vEPxo0bR3JyMtHR0cybN4+ff/6Z6dOnO1t7hg0bxsCBA3niiSfYt28fnTt35osvvqgwnqfMjBkzuOyyy+jWrRv33Xcfbdq0IT09naSkJA4dOsTvv/9+UTU3a9aMyZMn89xzzzF48GBuvPFGtm/fzttvv03fvn256667APjhhx+YOHEit99+O5dccgklJSX8+9//xmazMXz4cACef/55fvzxR2644QZatWpFRkYGb7/9Ni1atOCyyy67qDpF5EwKSCJSLzRp0oQVK1bwxBNPMGvWLHJycujQoQMffPAB48aNcx5ntVr56quvmDRpEh9//DEWi4Ubb7yRV199lZ49e1Y4Z+fOnfn111957rnn+PDDDzl69CihoaH07NmTZ555pkbqfvbZZ2nWrBlvvfUWjzzyCEFBQdx///289NJLuLu7AxATE0N8fDxff/01hw8fxtvbm5iYGL799lv69+8PwI033si+fft4//33yczMJCQkhCuvvJLnnnvO+RSciNQci8OVoyBFRERE6iGNQRIRERGpRAFJREREpBIFJBEREZFKFJBEREREKlFAEhEREalEAUlERESkEs2DVE12u52UlBT8/PywWCxmlyMiIiJV4HA4yM3NJTIy8ozFr0+ngFRNKSkpREVFmV2GiIiIVMPBgwdp0aLFOd9XQKqmsmUNDh48iL+/v8nViIiISFXk5OQQFRX1h4tRKyBVU1m3mr+/vwKSiIhIPfNHw2M0SFtERESkEgUkERERkUoUkEREREQq0RgkFystLaW4uNjsMuodd3d3bDab2WWIiEgjpYDkIg6Hg7S0NLKysswupd4KDAwkPDxc80yJiEitU0BykbJwFBoaire3t37JXwCHw0FBQQEZGRkAREREmFyRiIg0NgpILlBaWuoMR8HBwWaXUy81adIEgIyMDEJDQ9XdJiIitUqDtF2gbMyRt7e3yZXUb2XfP43hEhGR2qaA5ELqVrs4+v6JiIhZFJBEREREKlFAEpeJjo5m+vTpZpchIiJywTRIWyq46qqr6NGjR40Em7Vr1+Lj43PxRYmIiNQyBaQ6xuFwcLK4FA83GzZr3RuD43A4KC0txc3tj//XadasWS1UJCIiUvPUxVbH7MrIY2dGHvmFJbV+7XHjxrFy5Upef/11LBYLFouFDz/8EIvFwrfffkvv3r3x9PTkp59+Yvfu3dx0002EhYXh6+tL3759Wbp0aYXzVe5is1gs/Otf/+KWW27B29ub9u3b89VXX9XyXYqIiPwxBaRa4HA4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91dAEhEROR8FpEakbF22VXuO4XBoHJKIiMi5mB6QZsyYQXR0NF5eXsTGxrJmzZpzHrt582aGDx9OdHQ0FouF6dOnn3FM2XuVtwkTJjiPueqqq854/09/+pMrbq9O6d4iEC93q8YhiYiI/AFTA9LcuXNJSEhgypQprFu3jpiYGOLj48nIyDjr8QUFBbRp04apU6cSHh5+1mPWrl1Lamqqc1uyZAkAt99+e4Xj7rvvvgrHvfzyyzV7c3WQh5uVPq1OrcumcUgiIiLnZGpAeu2117jvvvsYP348nTt3ZubMmXh7e/P++++f9fi+ffvyyiuvMHLkSDw9Pc96TLNmzQgPD3duCxcupG3btlx55ZUVjvP29q5wnL+/f43fX110ejebiIiInJ1pAamoqIjk5GTi4uLKi7FaiYuLIykpqcau8fHHH3P33XdjsVgqvDd79mxCQkLo2rUrkydPpqCg4LznKiwsJCcnp8JWH/VvWz5QW+OQREREzs7NrAtnZmZSWlpKWFhYhf1hYWFs27atRq6xYMECsrKyGDduXIX9d955J61atSIyMpINGzbw+OOPs337dr744otznisxMZHnnnuuRuoyU/cWAXi5W8nMK2L3kTzahfqZXZKIiEidY1pAqg3vvfce119/PZGRkRX233///c7X3bp1IyIigkGDBrF7927atm171nNNnjyZhIQE59c5OTlERUW5pnAX8nSz0atlU37ZfZSkPccUkERERM7CtC62kJAQbDYb6enpFfanp6efcwD2hdi/fz9Lly7l3nvv/cNjY2NjAdi1a9c5j/H09MTf37/CVl+Vr8umgdoiIiJnY1pA8vDwoHfv3ixbtsy5z263s2zZMgYMGHDR5//ggw8IDQ3lhhtu+MNj169fD0BERMRFX7c+cE4YqfmQREREzsrULraEhATGjh1Lnz596NevH9OnTyc/P5/x48cDMGbMGJo3b05iYiJgDLresmWL8/Xhw4dZv349vr6+tGvXznleu93OBx98wNixY3Fzq3iLu3fvZs6cOQwZMoTg4GA2bNjAI488whVXXEH37t1r6c7NFRMVgKeblcy8QnYfyaddqK/ZJYmIiNQppgakESNGcOTIEZ555hnS0tLo0aMHixcvdg7cPnDgAFZreSNXSkoKPXv2dH49bdo0pk2bxpVXXsmKFSuc+5cuXcqBAwe4++67z7im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\n"},"metadata":{}}]},{"cell_type":"code","source":["from ipycanvas import Canvas\n","\n","canvas = Canvas(width=56, height=56, sync_image_data=True)\n","canvas.fill_style = 'black'\n","canvas.fill_rect(0, 0, canvas.width, canvas.height)"],"metadata":{"id":"Jre3qj5pgZLk","executionInfo":{"status":"ok","timestamp":1694461566941,"user_tz":240,"elapsed":28,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}}},"execution_count":98,"outputs":[]},{"cell_type":"code","source":["from ipywidgets import Output\n","\n","out = Output()\n","drawing = False\n","\n","@out.capture()\n","def handle_mouse_down(x, y):\n"," drawing = True\n"," canvas.begin_path()\n"," canvas.move_to(x, y)\n","\n","@out.capture()\n","def handle_mouse_move(x, y):\n"," if drawing:\n"," canvas.line_to(x, y)\n"," canvas.stroke()\n","\n","@out.capture()\n","def handle_mouse_up(x, y):\n"," drawing = False\n"," arr = canvas.get_image_data()\n"," image_in = tf.image.resize(arr, (28, 28))\n"," model.predict(image_in)\n","\n","canvas.on_mouse_down(handle_mouse_down)\n","canvas.on_mouse_move(handle_mouse_move)\n","canvas.on_mouse_up(handle_mouse_up)\n","\n","display(out)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":17,"referenced_widgets":["b00001db191e491ca4bb6cace0dd75ad","3aea818fc01d4d9e871d4fa6272c99e4"]},"id":"WDKQhEqnqir8","executionInfo":{"status":"ok","timestamp":1694461566942,"user_tz":240,"elapsed":19,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}},"outputId":"d89bc31f-d9ce-4bee-c553-42d41e656f08"},"execution_count":99,"outputs":[{"output_type":"display_data","data":{"text/plain":["Output()"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"b00001db191e491ca4bb6cace0dd75ad"}},"metadata":{"application/vnd.jupyter.widget-view+json":{"colab":{"custom_widget_manager":{"url":"https://ssl.gstatic.com/colaboratory-static/widgets/colab-cdn-widget-manager/b3e629b1971e1542/manager.min.js"}}}}}]},{"cell_type":"code","source":["canvas"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":17,"referenced_widgets":["9c5c98ab8673478ebf46f95ff46f58a1","4fe44d0a3cbc445194f5b916faf00dd4","80990f5105f34cc99418a66f9595a931"]},"id":"mOhcbprwp0is","executionInfo":{"status":"ok","timestamp":1694461566943,"user_tz":240,"elapsed":17,"user":{"displayName":"Marquelle Jones","userId":"11558922971657613969"}},"outputId":"1fae1611-a727-4de7-e315-50f6dc0db816"},"execution_count":100,"outputs":[{"output_type":"display_data","data":{"text/plain":["Canvas(height=56, sync_image_data=True, width=56)"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"9c5c98ab8673478ebf46f95ff46f58a1"}},"metadata":{"application/vnd.jupyter.widget-view+json":{"colab":{"custom_widget_manager":{"url":"https://ssl.gstatic.com/colaboratory-static/widgets/colab-cdn-widget-manager/b3e629b1971e1542/manager.min.js"}}}}}]}]}
|
test drawings/3.png
ADDED
test drawings/4.png
ADDED