{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "KwORmaB27LPx" }, "source": [ "# Simple MNIST convnet\n", "\n", "This example shows how to push your Keras model to the Hugging Face Hub and load the model from Hub.\n", "\n", "**Original Author of Example:** [fchollet](https://twitter.com/fchollet)
\n", "**Description:** A simple convnet that achieves ~99% test accuracy on MNIST." ] }, { "cell_type": "markdown", "metadata": { "id": "860CEXn27LP1" }, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "id": "7Msic2JB7LP1" }, "outputs": [], "source": [ "import numpy as np\n", "from tensorflow import keras\n", "from tensorflow.keras import layers" ] }, { "cell_type": "markdown", "source": [ "🤗 Install Hugging Face Hub" ], "metadata": { "id": "4s6WujK7ILKt" } }, { "cell_type": "code", "source": [ "!pip install huggingface_hub" ], "metadata": { "id": "JNzv7-Cg_cgu" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "import huggingface_hub\n", "from huggingface_hub import notebook_login, push_to_hub_keras, from_pretrained_keras" ], "metadata": { "id": "HS4vW65V_-G-" }, "execution_count": 21, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "00LCkZPt7LP3" }, "source": [ "## Prepare the data" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "j6tx7Fkh7LP3", "outputId": "48ae4179-4665-4938-9a10-2652cc464bdf" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "x_train shape: (60000, 28, 28, 1)\n", "60000 train samples\n", "10000 test samples\n" ] } ], "source": [ "# Model / data parameters\n", "num_classes = 10\n", "input_shape = (28, 28, 1)\n", "\n", "# the data, split between train and test sets\n", "(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()\n", "\n", "# Scale images to the [0, 1] range\n", "x_train = x_train.astype(\"float32\") / 255\n", "x_test = x_test.astype(\"float32\") / 255\n", "# Make sure images have shape (28, 28, 1)\n", "x_train = np.expand_dims(x_train, -1)\n", "x_test = np.expand_dims(x_test, -1)\n", "print(\"x_train shape:\", x_train.shape)\n", "print(x_train.shape[0], \"train samples\")\n", "print(x_test.shape[0], \"test samples\")\n", "\n", "\n", "# convert class vectors to binary class matrices\n", "y_train = keras.utils.to_categorical(y_train, num_classes)\n", "y_test = keras.utils.to_categorical(y_test, num_classes)" ] }, { "cell_type": "markdown", "metadata": { "id": "5bpZgm6n7LP4" }, "source": [ "## Build the model" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "QI34HRui7LP4", "outputId": "a0a91950-828e-45a9-d10c-bc7f05cb742e" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", " Layer (type) Output Shape Param # \n", "=================================================================\n", " conv2d (Conv2D) (None, 26, 26, 32) 320 \n", " \n", " max_pooling2d (MaxPooling2D (None, 13, 13, 32) 0 \n", " ) \n", " \n", " conv2d_1 (Conv2D) (None, 11, 11, 64) 18496 \n", " \n", " max_pooling2d_1 (MaxPooling (None, 5, 5, 64) 0 \n", " 2D) \n", " \n", " flatten (Flatten) (None, 1600) 0 \n", " \n", " dropout (Dropout) (None, 1600) 0 \n", " \n", " dense (Dense) (None, 10) 16010 \n", " \n", "=================================================================\n", "Total params: 34,826\n", "Trainable params: 34,826\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "model = keras.Sequential(\n", " [\n", " keras.Input(shape=input_shape),\n", " layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\"),\n", " layers.MaxPooling2D(pool_size=(2, 2)),\n", " layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"),\n", " layers.MaxPooling2D(pool_size=(2, 2)),\n", " layers.Flatten(),\n", " layers.Dropout(0.5),\n", " layers.Dense(num_classes, activation=\"softmax\"),\n", " ]\n", ")\n", "\n", "model.summary()" ] }, { "cell_type": "markdown", "metadata": { "id": "0hwLCbr-7LP5" }, "source": [ "## Train the model" ] }, { "cell_type": "code", "source": [ "# Load the TensorBoard notebook extension\n", "%load_ext tensorboard" ], "metadata": { "id": "w_Q7X180AYbB" }, "execution_count": 12, "outputs": [] }, { "cell_type": "code", "source": [ "log_dir = \"logs/fit/\"\n", "tensorboard_callback = keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)" ], "metadata": { "id": "vRhyg5W-AbLU" }, "execution_count": 14, "outputs": [] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "AEXgbiWZ7LP5", "outputId": "45222492-a30b-4a64-e53f-1a7d5ee3652c" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/5\n", "422/422 [==============================] - 47s 109ms/step - loss: 0.0274 - accuracy: 0.9909 - val_loss: 0.0292 - val_accuracy: 0.9923\n", "Epoch 2/5\n", "422/422 [==============================] - 44s 105ms/step - loss: 0.0273 - accuracy: 0.9907 - val_loss: 0.0280 - val_accuracy: 0.9917\n", "Epoch 3/5\n", "422/422 [==============================] - 43s 102ms/step - loss: 0.0263 - accuracy: 0.9913 - val_loss: 0.0262 - val_accuracy: 0.9937\n", "Epoch 4/5\n", "422/422 [==============================] - 42s 100ms/step - loss: 0.0242 - accuracy: 0.9916 - val_loss: 0.0260 - val_accuracy: 0.9927\n", "Epoch 5/5\n", "422/422 [==============================] - 43s 102ms/step - loss: 0.0242 - accuracy: 0.9917 - val_loss: 0.0311 - val_accuracy: 0.9917\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 15 } ], "source": [ "batch_size = 128\n", "epochs = 5\n", "\n", "model.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n", "\n", "model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1,\n", " callbacks = [tensorboard_callback])" ] }, { "cell_type": "markdown", "source": [ "We will push our model to the Hugging Face Hub with tensorboard logs.\n", "\n", "If you already have access to keras-io organization, you can give \"keras-io/{model-name}\" as the model ID. If not, you can push model to your own account and then carry it to the keras-io organization later. 🥳\n", "\n", "To push your models to the Hub, you need authentication. To authenticate, you can log using notebook_login. You can get your token from https://huggingface.co/settings/tokens 🙌🏻" ], "metadata": { "id": "cIYC7UnFBjHR" } }, { "cell_type": "code", "source": [ "notebook_login()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 471, "referenced_widgets": [ "a3f2334822e7452abaaf93ccc47ba051", "2b99210c02a041fb86b2935e4a1ced6e", "38c57d5de54b45c2aef003db892e38c6", "38aea29e8c654739b8e93935d1ff45fe", "9fc97a48a10b4211adaddf710b20ca71", "6f08c5a0af3745e49a4bd98d89df1c7f", "92fcdadef15d48b3a92e969613076504", "54ac8eb952c14dd1b9585bf97aef046b", "1e8921fab93d496f85a611903e87d9ef", "5430fb89181a46df945835040dfaaa73", "0ca7af69b9e0424e8de5f0bff45e9517", "72ca67223062400283daf47b2d43363a", "5ef27ad680c142c0ba410a93aa991fb7", "b2b3738b36bc4f2b9c30f85afb3c3070", "cd740c81dc2c401ca2c7d163ae1d36ca", "5da678bbd0784cd48c2619aeb7ed62d7", "9c117ad0cd2248a5987a62d1c9e3e10f" ] }, "id": "lpPBVGq8_OVV", "outputId": "4b25884d-862b-4b03-a5cb-3f5d1f66d322" }, "execution_count": 9, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Login successful\n", "Your token has been saved to /root/.huggingface/token\n", "\u001b[1m\u001b[31mAuthenticated through git-credential store but this isn't the helper defined on your machine.\n", "You might have to re-authenticate when pushing to the Hugging Face Hub. Run the following command in your terminal in case you want to set this credential helper as the default\n", "\n", "git config --global credential.helper store\u001b[0m\n" ] } ] }, { "cell_type": "markdown", "source": [ "Now we can push our model to the Hugging Face Hub 🤩🙌🏻 \n", "The below function will:\n", "\n", "1. create a remote repository on Hugging Face Hub,\n", "2. serialize our model,\n", "3. create a model card including training hyperparameters, model architecture and couple of fields you can fill about model,\n", "4. push the model to the Hub." ], "metadata": { "id": "eLbbU8AnBtqu" } }, { "cell_type": "code", "source": [ "push_to_hub_keras(model, \"merve/mnist\", log_dir = \"logs/fit/\", tags = [\"image-classification\"])" ], "metadata": { "id": "1RNi4hGKAVUv" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "See pushed model with TensorBoard and model card [here](https://huggingface.co/merve/mnist)." ], "metadata": { "id": "kW6aHvOeC8oJ" } }, { "cell_type": "markdown", "source": [ "Let's load the model!" ], "metadata": { "id": "XCsztZCtFCdu" } }, { "cell_type": "code", "source": [ "model = from_pretrained_keras(\"merve/mnist\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9Wept7KeFEx7", "outputId": "38f10ece-30bc-45b3-fbc8-e7a1b7eb5a3c" }, "execution_count": 24, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "config.json not found in HuggingFace Hub\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "U_OrylJv7LP6" }, "source": [ "## Evaluate the trained model" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "RVwK3ZHJ7LP6", "outputId": "1adb6f61-2532-4475-cf10-55db0e69d552" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Test loss: 0.022792112082242966\n", "Test accuracy: 0.9919999837875366\n" ] } ], "source": [ "score = model.evaluate(x_test, y_test, verbose=0)\n", "print(\"Test loss:\", score[0])\n", "print(\"Test accuracy:\", score[1])" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "mnist_convnet", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "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.7.0" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "a3f2334822e7452abaaf93ccc47ba051": { "model_module": "@jupyter-widgets/controls", "model_name": "VBoxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_2b99210c02a041fb86b2935e4a1ced6e", "IPY_MODEL_38c57d5de54b45c2aef003db892e38c6", "IPY_MODEL_38aea29e8c654739b8e93935d1ff45fe", "IPY_MODEL_9fc97a48a10b4211adaddf710b20ca71", "IPY_MODEL_6f08c5a0af3745e49a4bd98d89df1c7f" ], "layout": "IPY_MODEL_92fcdadef15d48b3a92e969613076504" } }, "2b99210c02a041fb86b2935e4a1ced6e": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_54ac8eb952c14dd1b9585bf97aef046b", "placeholder": "​", "style": "IPY_MODEL_1e8921fab93d496f85a611903e87d9ef", "value": "

Copy a token from your Hugging Face\ntokens page and paste it below.
Immediately click login after copying\nyour token or it might be stored in plain text in this notebook file.
" } }, "38c57d5de54b45c2aef003db892e38c6": { "model_module": "@jupyter-widgets/controls", "model_name": "PasswordModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "PasswordModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "PasswordView", "continuous_update": true, "description": "Token:", "description_tooltip": null, "disabled": false, "layout": "IPY_MODEL_5430fb89181a46df945835040dfaaa73", "placeholder": "​", "style": "IPY_MODEL_0ca7af69b9e0424e8de5f0bff45e9517", "value": "" } }, "38aea29e8c654739b8e93935d1ff45fe": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ButtonView", "button_style": "", "description": "Login", "disabled": false, "icon": "", "layout": "IPY_MODEL_72ca67223062400283daf47b2d43363a", "style": "IPY_MODEL_5ef27ad680c142c0ba410a93aa991fb7", "tooltip": "" } }, "9fc97a48a10b4211adaddf710b20ca71": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_b2b3738b36bc4f2b9c30f85afb3c3070", "placeholder": "​", "style": "IPY_MODEL_cd740c81dc2c401ca2c7d163ae1d36ca", "value": "\nPro Tip: If you don't already have one, you can create a dedicated\n'notebooks' token with 'write' access, that you can then easily reuse for all\nnotebooks.
Logging in with your username and password is deprecated and\nwon't be possible anymore in the near future. You can still use them for now by\nclicking below. " } }, "6f08c5a0af3745e49a4bd98d89df1c7f": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ButtonView", "button_style": "", "description": "Use password", "disabled": false, "icon": "", "layout": "IPY_MODEL_5da678bbd0784cd48c2619aeb7ed62d7", "style": "IPY_MODEL_9c117ad0cd2248a5987a62d1c9e3e10f", "tooltip": "" } }, "92fcdadef15d48b3a92e969613076504": { "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": "center", "align_self": null, "border": null, "bottom": null, "display": "flex", "flex": null, "flex_flow": "column", "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": "50%" } }, "54ac8eb952c14dd1b9585bf97aef046b": { "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 } }, "1e8921fab93d496f85a611903e87d9ef": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "5430fb89181a46df945835040dfaaa73": { "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 } }, "0ca7af69b9e0424e8de5f0bff45e9517": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "72ca67223062400283daf47b2d43363a": { "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 } }, "5ef27ad680c142c0ba410a93aa991fb7": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "button_color": null, "font_weight": "" } }, "b2b3738b36bc4f2b9c30f85afb3c3070": { "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 } }, "cd740c81dc2c401ca2c7d163ae1d36ca": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "5da678bbd0784cd48c2619aeb7ed62d7": { "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 } }, "9c117ad0cd2248a5987a62d1c9e3e10f": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "button_color": null, "font_weight": "" } } } } }, "nbformat": 4, "nbformat_minor": 0 }