From 62bc37a8bf49bb84fc6bccadcd9cc23b1d2adee3 Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Wed, 14 Jul 2021 18:17:25 +0200 Subject: [PATCH 01/13] Suppress warnings in Jupyter cells Signed-off-by: Luca Giorgi --- pytorch/PyTorch-MNIST-Minimal.ipynb | 8 ++++++-- tensorflow/TensorFlow-MNIST-Minimal.ipynb | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/pytorch/PyTorch-MNIST-Minimal.ipynb b/pytorch/PyTorch-MNIST-Minimal.ipynb index c83ae8d..7206f39 100644 --- a/pytorch/PyTorch-MNIST-Minimal.ipynb +++ b/pytorch/PyTorch-MNIST-Minimal.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "8d8e689d", "metadata": { "ExecuteTime": { "end_time": "2021-03-04T20:07:46.654477Z", @@ -17,6 +18,7 @@ { "cell_type": "code", "execution_count": null, + "id": "7f832a27", "metadata": { "ExecuteTime": { "end_time": "2021-03-04T20:08:02.078254Z", @@ -34,6 +36,8 @@ "from torch import nn, optim\n", "from torch.nn import functional as F\n", "from prometheus_client import CollectorRegistry, Gauge, push_to_gateway\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", "\n", "transform = transforms.Compose([transforms.ToTensor(),\n", " transforms.Normalize((0.5,), (0.5,)),\n", @@ -139,7 +143,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.5" + "version": "3.6.8" }, "toc": { "base_numbering": 1, @@ -157,4 +161,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/tensorflow/TensorFlow-MNIST-Minimal.ipynb b/tensorflow/TensorFlow-MNIST-Minimal.ipynb index d3da3f0..c7f9da4 100644 --- a/tensorflow/TensorFlow-MNIST-Minimal.ipynb +++ b/tensorflow/TensorFlow-MNIST-Minimal.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1c02700a", "metadata": { "ExecuteTime": { "end_time": "2021-03-04T20:07:47.647809Z", @@ -17,6 +18,7 @@ { "cell_type": "code", "execution_count": null, + "id": "6ff2c1f8", "metadata": { "ExecuteTime": { "end_time": "2021-03-04T15:32:58.177302Z", @@ -27,6 +29,8 @@ "source": [ "import tensorflow as tf\n", "import tensorflow_datasets as tfds\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", "\n", "tfds.disable_progress_bar()\n", "\n", @@ -144,7 +148,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.5" + "version": "3.6.8" }, "toc": { "base_numbering": 1, @@ -162,4 +166,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} From 6f21cdbe38b3233411c7864b66bf60cb8ed2a96c Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Mon, 9 Aug 2021 16:45:53 +0200 Subject: [PATCH 02/13] Fix warnings Signed-off-by: Luca Giorgi --- tensorflow/TensorFlow-MNIST-Minimal.ipynb | 140 +++++++++++++++++++++- 1 file changed, 136 insertions(+), 4 deletions(-) diff --git a/tensorflow/TensorFlow-MNIST-Minimal.ipynb b/tensorflow/TensorFlow-MNIST-Minimal.ipynb index c7f9da4..24a5588 100644 --- a/tensorflow/TensorFlow-MNIST-Minimal.ipynb +++ b/tensorflow/TensorFlow-MNIST-Minimal.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "1c02700a", "metadata": { "ExecuteTime": { @@ -10,14 +10,86 @@ "start_time": "2021-03-04T20:07:47.622673Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: pip in /home/lgiorgi/.local/lib/python3.6/site-packages (21.1.2)\n", + "Collecting pip\n", + " Downloading pip-21.2.3-py3-none-any.whl (1.6 MB)\n", + "\u001b[K |████████████████████████████████| 1.6 MB 708 kB/s eta 0:00:01\n", + "\u001b[?25hInstalling collected packages: pip\n", + " Attempting uninstall: pip\n", + " Found existing installation: pip 21.1.2\n", + " Uninstalling pip-21.1.2:\n", + " Successfully uninstalled pip-21.1.2\n", + "Successfully installed pip-21.2.3\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: tensorflow in /home/lgiorgi/.local/lib/python3.6/site-packages (2.5.0)\n", + "Requirement already satisfied: tensorflow_datasets in /home/lgiorgi/.local/lib/python3.6/site-packages (4.4.0)\n", + "Requirement already satisfied: prometheus_client in /usr/local/lib/python3.6/site-packages (0.10.1)\n", + "Requirement already satisfied: typing-extensions~=3.7.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.7.4.3)\n", + "Requirement already satisfied: h5py~=3.1.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.1.0)\n", + "Requirement already satisfied: google-pasta~=0.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.2.0)\n", + "Requirement already satisfied: tensorflow-estimator<2.6.0,>=2.5.0rc0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.5.0)\n", + "Requirement already satisfied: wheel~=0.35 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.36.2)\n", + "Requirement already satisfied: protobuf>=3.9.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.17.0)\n", + "Requirement already satisfied: wrapt~=1.12.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.12.1)\n", + "Requirement already satisfied: keras-nightly~=2.5.0.dev in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.5.0.dev2021032900)\n", + "Requirement already satisfied: absl-py~=0.10 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.12.0)\n", + "Requirement already satisfied: flatbuffers~=1.12.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.12)\n", + "Requirement already satisfied: six~=1.15.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.15.0)\n", + "Requirement already satisfied: termcolor~=1.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow) (1.1.0)\n", + "Requirement already satisfied: opt-einsum~=3.3.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.3.0)\n", + "Requirement already satisfied: grpcio~=1.34.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.34.1)\n", + "Requirement already satisfied: astunparse~=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.6.3)\n", + "Requirement already satisfied: numpy~=1.19.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.19.5)\n", + "Requirement already satisfied: tensorboard~=2.5 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.5.0)\n", + "Requirement already satisfied: keras-preprocessing~=1.1.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.1.2)\n", + "Requirement already satisfied: gast==0.4.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.4.0)\n", + "Requirement already satisfied: dill in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.3.4)\n", + "Requirement already satisfied: dataclasses in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.8)\n", + "Requirement already satisfied: future in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.18.2)\n", + "Requirement already satisfied: requests>=2.19.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.23.0)\n", + "Requirement already satisfied: promise in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.3)\n", + "Requirement already satisfied: tqdm in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (4.62.0)\n", + "Requirement already satisfied: attrs>=18.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (21.2.0)\n", + "Requirement already satisfied: importlib-resources in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (5.2.0)\n", + "Requirement already satisfied: tensorflow-metadata in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (1.2.0)\n", + "Requirement already satisfied: cached-property in /home/lgiorgi/.local/lib/python3.6/site-packages (from h5py~=3.1.0->tensorflow) (1.5.2)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (1.25.8)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2020.4.5.1)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (3.0.4)\n", + "Requirement already satisfied: idna<3,>=2.5 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2.9)\n", + "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (1.8.0)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (0.4.4)\n", + "Requirement already satisfied: google-auth<2,>=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (1.30.0)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (56.2.0)\n", + "Requirement already satisfied: markdown>=2.6.8 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (3.3.4)\n", + "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (0.6.1)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (2.0.0)\n", + "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (4.2.2)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (4.7.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (0.2.8)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.5->tensorflow) (1.3.0)\n", + "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.6/site-packages (from markdown>=2.6.8->tensorboard~=2.5->tensorflow) (4.0.1)\n", + "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (0.4.8)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.5->tensorflow) (3.1.0)\n", + "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/site-packages (from importlib-metadata->markdown>=2.6.8->tensorboard~=2.5->tensorflow) (3.4.1)\n", + "Requirement already satisfied: googleapis-common-protos<2,>=1.52.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-metadata->tensorflow_datasets) (1.53.0)\n" + ] + } + ], "source": [ + "!python -m pip install --upgrade pip\n", "!pip install tensorflow tensorflow_datasets prometheus_client --progress-bar off" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "6ff2c1f8", "metadata": { "ExecuteTime": { @@ -25,7 +97,59 @@ "start_time": "2021-03-04T15:31:59.263480Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_2\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d_2 (Conv2D) (None, 27, 27, 32) 160 \n", + "_________________________________________________________________\n", + "max_pooling2d_2 (MaxPooling2 (None, 13, 13, 32) 0 \n", + "_________________________________________________________________\n", + "flatten_2 (Flatten) (None, 5408) 0 \n", + "_________________________________________________________________\n", + "dense_4 (Dense) (None, 128) 692352 \n", + "_________________________________________________________________\n", + "dropout_2 (Dropout) (None, 128) 0 \n", + "_________________________________________________________________\n", + "dense_5 (Dense) (None, 10) 1290 \n", + "=================================================================\n", + "Total params: 693,802\n", + "Trainable params: 693,802\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/5\n", + "469/469 [==============================] - 9s 18ms/step - loss: 1.5786 - sparse_categorical_accuracy: 0.8974 - val_loss: 1.5172 - val_sparse_categorical_accuracy: 0.9466\n", + "epoch=0, epoch time=9.24s, step time=18.06ms\n", + "Epoch 2/5\n", + "469/469 [==============================] - 9s 19ms/step - loss: 1.5165 - sparse_categorical_accuracy: 0.9484 - val_loss: 1.5024 - val_sparse_categorical_accuracy: 0.9611\n", + "epoch=1, epoch time=8.83s, step time=17.77ms\n", + "Epoch 3/5\n", + "469/469 [==============================] - 9s 18ms/step - loss: 1.5025 - sparse_categorical_accuracy: 0.9614 - val_loss: 1.4912 - val_sparse_categorical_accuracy: 0.9718\n", + "epoch=2, epoch time=8.67s, step time=17.57ms\n", + "Epoch 4/5\n", + "469/469 [==============================] - 8s 18ms/step - loss: 1.4940 - sparse_categorical_accuracy: 0.9695 - val_loss: 1.4895 - val_sparse_categorical_accuracy: 0.9736\n", + "epoch=3, epoch time=8.29s, step time=17.27ms\n", + "Epoch 5/5\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.4896 - sparse_categorical_accuracy: 0.9738 - val_loss: 1.4862 - val_sparse_categorical_accuracy: 0.9768\n", + "epoch=4, epoch time=8.20s, step time=17.06ms\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import tensorflow as tf\n", "import tensorflow_datasets as tfds\n", @@ -126,6 +250,14 @@ " \n", "model.fit(mnist_train, epochs=5, validation_data=mnist_test, callbacks=[SendMetrics()])\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23813777", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From bd29cdf60b6bec80997db43c28d6dc99c9272732 Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Wed, 11 Aug 2021 12:56:33 +0200 Subject: [PATCH 03/13] Remove callback Signed-off-by: Luca Giorgi --- tensorflow/TensorFlow-MNIST-Minimal.ipynb | 145 +++++++--------------- 1 file changed, 45 insertions(+), 100 deletions(-) diff --git a/tensorflow/TensorFlow-MNIST-Minimal.ipynb b/tensorflow/TensorFlow-MNIST-Minimal.ipynb index 24a5588..8f7f7f1 100644 --- a/tensorflow/TensorFlow-MNIST-Minimal.ipynb +++ b/tensorflow/TensorFlow-MNIST-Minimal.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "id": "1c02700a", "metadata": { "ExecuteTime": { @@ -16,63 +16,54 @@ "output_type": "stream", "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", - "Requirement already satisfied: pip in /home/lgiorgi/.local/lib/python3.6/site-packages (21.1.2)\n", - "Collecting pip\n", - " Downloading pip-21.2.3-py3-none-any.whl (1.6 MB)\n", - "\u001b[K |████████████████████████████████| 1.6 MB 708 kB/s eta 0:00:01\n", - "\u001b[?25hInstalling collected packages: pip\n", - " Attempting uninstall: pip\n", - " Found existing installation: pip 21.1.2\n", - " Uninstalling pip-21.1.2:\n", - " Successfully uninstalled pip-21.1.2\n", - "Successfully installed pip-21.2.3\n", + "Requirement already satisfied: pip in /home/lgiorgi/.local/lib/python3.6/site-packages (21.2.3)\n", "Defaulting to user installation because normal site-packages is not writeable\n", "Requirement already satisfied: tensorflow in /home/lgiorgi/.local/lib/python3.6/site-packages (2.5.0)\n", "Requirement already satisfied: tensorflow_datasets in /home/lgiorgi/.local/lib/python3.6/site-packages (4.4.0)\n", "Requirement already satisfied: prometheus_client in /usr/local/lib/python3.6/site-packages (0.10.1)\n", - "Requirement already satisfied: typing-extensions~=3.7.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.7.4.3)\n", - "Requirement already satisfied: h5py~=3.1.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.1.0)\n", - "Requirement already satisfied: google-pasta~=0.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.2.0)\n", - "Requirement already satisfied: tensorflow-estimator<2.6.0,>=2.5.0rc0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.5.0)\n", - "Requirement already satisfied: wheel~=0.35 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.36.2)\n", - "Requirement already satisfied: protobuf>=3.9.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.17.0)\n", + "Requirement already satisfied: termcolor~=1.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow) (1.1.0)\n", "Requirement already satisfied: wrapt~=1.12.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.12.1)\n", + "Requirement already satisfied: keras-preprocessing~=1.1.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.1.2)\n", + "Requirement already satisfied: opt-einsum~=3.3.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.3.0)\n", + "Requirement already satisfied: h5py~=3.1.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.1.0)\n", + "Requirement already satisfied: typing-extensions~=3.7.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.7.4.3)\n", + "Requirement already satisfied: gast==0.4.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.4.0)\n", "Requirement already satisfied: keras-nightly~=2.5.0.dev in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.5.0.dev2021032900)\n", "Requirement already satisfied: absl-py~=0.10 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.12.0)\n", - "Requirement already satisfied: flatbuffers~=1.12.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.12)\n", - "Requirement already satisfied: six~=1.15.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.15.0)\n", - "Requirement already satisfied: termcolor~=1.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow) (1.1.0)\n", - "Requirement already satisfied: opt-einsum~=3.3.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.3.0)\n", + "Requirement already satisfied: tensorboard~=2.5 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.5.0)\n", "Requirement already satisfied: grpcio~=1.34.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.34.1)\n", - "Requirement already satisfied: astunparse~=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.6.3)\n", "Requirement already satisfied: numpy~=1.19.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.19.5)\n", - "Requirement already satisfied: tensorboard~=2.5 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.5.0)\n", - "Requirement already satisfied: keras-preprocessing~=1.1.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.1.2)\n", - "Requirement already satisfied: gast==0.4.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.4.0)\n", + "Requirement already satisfied: protobuf>=3.9.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.17.0)\n", + "Requirement already satisfied: google-pasta~=0.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.2.0)\n", + "Requirement already satisfied: tensorflow-estimator<2.6.0,>=2.5.0rc0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.5.0)\n", + "Requirement already satisfied: astunparse~=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.6.3)\n", + "Requirement already satisfied: flatbuffers~=1.12.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.12)\n", + "Requirement already satisfied: wheel~=0.35 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.36.2)\n", + "Requirement already satisfied: six~=1.15.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.15.0)\n", + "Requirement already satisfied: attrs>=18.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (21.2.0)\n", "Requirement already satisfied: dill in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.3.4)\n", - "Requirement already satisfied: dataclasses in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.8)\n", - "Requirement already satisfied: future in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.18.2)\n", + "Requirement already satisfied: tensorflow-metadata in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (1.2.0)\n", "Requirement already satisfied: requests>=2.19.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.23.0)\n", + "Requirement already satisfied: future in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.18.2)\n", "Requirement already satisfied: promise in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.3)\n", - "Requirement already satisfied: tqdm in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (4.62.0)\n", - "Requirement already satisfied: attrs>=18.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (21.2.0)\n", + "Requirement already satisfied: dataclasses in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.8)\n", "Requirement already satisfied: importlib-resources in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (5.2.0)\n", - "Requirement already satisfied: tensorflow-metadata in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (1.2.0)\n", + "Requirement already satisfied: tqdm in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (4.62.0)\n", "Requirement already satisfied: cached-property in /home/lgiorgi/.local/lib/python3.6/site-packages (from h5py~=3.1.0->tensorflow) (1.5.2)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (1.25.8)\n", "Requirement already satisfied: certifi>=2017.4.17 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2020.4.5.1)\n", - "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (3.0.4)\n", "Requirement already satisfied: idna<3,>=2.5 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2.9)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (3.0.4)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (1.25.8)\n", "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (1.8.0)\n", - "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (0.4.4)\n", - "Requirement already satisfied: google-auth<2,>=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (1.30.0)\n", - "Requirement already satisfied: setuptools>=41.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (56.2.0)\n", - "Requirement already satisfied: markdown>=2.6.8 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (3.3.4)\n", "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (0.6.1)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (56.2.0)\n", "Requirement already satisfied: werkzeug>=0.11.15 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (2.0.0)\n", - "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (4.2.2)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (4.7.2)\n", + "Requirement already satisfied: markdown>=2.6.8 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (3.3.4)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (0.4.4)\n", + "Requirement already satisfied: google-auth<2,>=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.5->tensorflow) (1.30.0)\n", "Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (0.2.8)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (4.7.2)\n", + "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (4.2.2)\n", "Requirement already satisfied: requests-oauthlib>=0.7.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.5->tensorflow) (1.3.0)\n", "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.6/site-packages (from markdown>=2.6.8->tensorboard~=2.5->tensorflow) (4.0.1)\n", "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow) (0.4.8)\n", @@ -89,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "id": "6ff2c1f8", "metadata": { "ExecuteTime": { @@ -102,50 +93,45 @@ "name": "stdout", "output_type": "stream", "text": [ - "Model: \"sequential_2\"\n", + "Model: \"sequential_1\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", - "conv2d_2 (Conv2D) (None, 27, 27, 32) 160 \n", + "conv2d_1 (Conv2D) (None, 27, 27, 32) 160 \n", "_________________________________________________________________\n", - "max_pooling2d_2 (MaxPooling2 (None, 13, 13, 32) 0 \n", + "max_pooling2d_1 (MaxPooling2 (None, 13, 13, 32) 0 \n", "_________________________________________________________________\n", - "flatten_2 (Flatten) (None, 5408) 0 \n", + "flatten_1 (Flatten) (None, 5408) 0 \n", "_________________________________________________________________\n", - "dense_4 (Dense) (None, 128) 692352 \n", + "dense_2 (Dense) (None, 128) 692352 \n", "_________________________________________________________________\n", - "dropout_2 (Dropout) (None, 128) 0 \n", + "dropout_1 (Dropout) (None, 128) 0 \n", "_________________________________________________________________\n", - "dense_5 (Dense) (None, 10) 1290 \n", + "dense_3 (Dense) (None, 10) 1290 \n", "=================================================================\n", "Total params: 693,802\n", "Trainable params: 693,802\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "Epoch 1/5\n", - "469/469 [==============================] - 9s 18ms/step - loss: 1.5786 - sparse_categorical_accuracy: 0.8974 - val_loss: 1.5172 - val_sparse_categorical_accuracy: 0.9466\n", - "epoch=0, epoch time=9.24s, step time=18.06ms\n", + "469/469 [==============================] - 9s 17ms/step - loss: 1.5811 - sparse_categorical_accuracy: 0.8952 - val_loss: 1.5190 - val_sparse_categorical_accuracy: 0.9460\n", "Epoch 2/5\n", - "469/469 [==============================] - 9s 19ms/step - loss: 1.5165 - sparse_categorical_accuracy: 0.9484 - val_loss: 1.5024 - val_sparse_categorical_accuracy: 0.9611\n", - "epoch=1, epoch time=8.83s, step time=17.77ms\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.5198 - sparse_categorical_accuracy: 0.9448 - val_loss: 1.5052 - val_sparse_categorical_accuracy: 0.9585\n", "Epoch 3/5\n", - "469/469 [==============================] - 9s 18ms/step - loss: 1.5025 - sparse_categorical_accuracy: 0.9614 - val_loss: 1.4912 - val_sparse_categorical_accuracy: 0.9718\n", - "epoch=2, epoch time=8.67s, step time=17.57ms\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.5056 - sparse_categorical_accuracy: 0.9581 - val_loss: 1.4987 - val_sparse_categorical_accuracy: 0.9649\n", "Epoch 4/5\n", - "469/469 [==============================] - 8s 18ms/step - loss: 1.4940 - sparse_categorical_accuracy: 0.9695 - val_loss: 1.4895 - val_sparse_categorical_accuracy: 0.9736\n", - "epoch=3, epoch time=8.29s, step time=17.27ms\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.4975 - sparse_categorical_accuracy: 0.9656 - val_loss: 1.4915 - val_sparse_categorical_accuracy: 0.9714\n", "Epoch 5/5\n", - "469/469 [==============================] - 8s 17ms/step - loss: 1.4896 - sparse_categorical_accuracy: 0.9738 - val_loss: 1.4862 - val_sparse_categorical_accuracy: 0.9768\n", - "epoch=4, epoch time=8.20s, step time=17.06ms\n" + "469/469 [==============================] - 8s 17ms/step - loss: 1.4939 - sparse_categorical_accuracy: 0.9690 - val_loss: 1.4906 - val_sparse_categorical_accuracy: 0.9715\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -205,50 +191,9 @@ "\n", "model.summary()\n", "\n", - "import time\n", - "from prometheus_client import CollectorRegistry, Gauge, push_to_gateway\n", - "class SendMetrics(tf.keras.callbacks.Callback):\n", - " def __init__(self):\n", - " self.epoch_start_time = 0\n", - " self.batchstart = 0\n", - " self.batchtimes = []\n", - " self.current_time=time.time()\n", - " \n", - " self.pushgateway_url = \"http://prom-push-as-pushgateway.apps.zero.massopen.cloud\"\n", - " self.registry = CollectorRegistry()\n", - " self.epoch_gauge = Gauge(name='epoch_duration_seconds', documentation='epoch_value is the metric itself, the stuff in the {}s are tags',labelnames=[\"model\",\"framework\",\"date\",\"epoch\"],registry=self.registry)\n", - " self.step_gauge = Gauge(name='step_during_milliseconds', documentation='step_during_milliseconds is the metric itself, the stuff in the {}s are tags',labelnames=[\"model\",\"framework\",\"date\",\"epoch\"],registry=self.registry)\n", - "\n", - " def on_epoch_begin(self, epoch, logs=None):\n", - " self.epoch_start_time=tf.timestamp()\n", - " \n", - " def on_epoch_end(self, epoch, logs=None):\n", - " keys = list(logs.keys())\n", - " total=0\n", - " count=0\n", - " for x in self.batchtimes:\n", - " total=total+x\n", - " count=count+1\n", - " \n", - " value_formatter = \"{0:.2f}\"\n", - " epoch_value = value_formatter.format(tf.timestamp() - self.epoch_start_time)\n", - " step_value = value_formatter.format(total/count*1000)\n", - " print(\"epoch={}, epoch time={}s, step time={}ms\".format(epoch, epoch_value, step_value))\n", - " self.add_metrics_data(epoch,epoch_value,step_value)\n", - " \n", - " def on_train_batch_begin(self, batch, logs=None):\n", - " self.batchstart=tf.timestamp()\n", - " \n", "\n", - " def on_train_batch_end(self, batch, logs=None):\n", - " self.batchtimes.append(tf.timestamp()- self.batchstart) \n", - " \n", - " def add_metrics_data(self, epoch_num, epoch_value, step_value): \n", - " self.epoch_gauge.labels(\"mnist-minimal\",\"Tensorflow\",self.current_time,epoch_num).set(epoch_value)\n", - " self.step_gauge.labels(\"mnist-minimal\",\"Tensorflow\",self.current_time,epoch_num).set(step_value) \n", - " push_to_gateway(self.pushgateway_url, job='jupyterhub_load', registry=self.registry)\n", " \n", - "model.fit(mnist_train, epochs=5, validation_data=mnist_test, callbacks=[SendMetrics()])\n" + "model.fit(mnist_train, epochs=5, validation_data=mnist_test)\n" ] }, { From ea1143859bd2eff25b4e1db17d5722680c9ec16f Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Thu, 12 Aug 2021 11:06:46 +0200 Subject: [PATCH 04/13] set TF logger level Signed-off-by: Luca Giorgi --- tensorflow/TensorFlow-MNIST-Minimal.ipynb | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/tensorflow/TensorFlow-MNIST-Minimal.ipynb b/tensorflow/TensorFlow-MNIST-Minimal.ipynb index 8f7f7f1..2a19725 100644 --- a/tensorflow/TensorFlow-MNIST-Minimal.ipynb +++ b/tensorflow/TensorFlow-MNIST-Minimal.ipynb @@ -80,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "6ff2c1f8", "metadata": { "ExecuteTime": { @@ -93,6 +93,7 @@ "name": "stdout", "output_type": "stream", "text": [ + "\n", "Model: \"sequential_1\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", @@ -114,24 +115,24 @@ "Non-trainable params: 0\n", "_________________________________________________________________\n", "Epoch 1/5\n", - "469/469 [==============================] - 9s 17ms/step - loss: 1.5811 - sparse_categorical_accuracy: 0.8952 - val_loss: 1.5190 - val_sparse_categorical_accuracy: 0.9460\n", + "469/469 [==============================] - 9s 16ms/step - loss: 1.5959 - sparse_categorical_accuracy: 0.8803 - val_loss: 1.5211 - val_sparse_categorical_accuracy: 0.9435\n", "Epoch 2/5\n", - "469/469 [==============================] - 8s 17ms/step - loss: 1.5198 - sparse_categorical_accuracy: 0.9448 - val_loss: 1.5052 - val_sparse_categorical_accuracy: 0.9585\n", + "469/469 [==============================] - 8s 16ms/step - loss: 1.5216 - sparse_categorical_accuracy: 0.9435 - val_loss: 1.5053 - val_sparse_categorical_accuracy: 0.9582\n", "Epoch 3/5\n", - "469/469 [==============================] - 8s 17ms/step - loss: 1.5056 - sparse_categorical_accuracy: 0.9581 - val_loss: 1.4987 - val_sparse_categorical_accuracy: 0.9649\n", + "469/469 [==============================] - 8s 16ms/step - loss: 1.5066 - sparse_categorical_accuracy: 0.9573 - val_loss: 1.5016 - val_sparse_categorical_accuracy: 0.9616\n", "Epoch 4/5\n", - "469/469 [==============================] - 8s 17ms/step - loss: 1.4975 - sparse_categorical_accuracy: 0.9656 - val_loss: 1.4915 - val_sparse_categorical_accuracy: 0.9714\n", + "469/469 [==============================] - 8s 16ms/step - loss: 1.4993 - sparse_categorical_accuracy: 0.9641 - val_loss: 1.4920 - val_sparse_categorical_accuracy: 0.9713\n", "Epoch 5/5\n", - "469/469 [==============================] - 8s 17ms/step - loss: 1.4939 - sparse_categorical_accuracy: 0.9690 - val_loss: 1.4906 - val_sparse_categorical_accuracy: 0.9715\n" + "469/469 [==============================] - 8s 16ms/step - loss: 1.4937 - sparse_categorical_accuracy: 0.9699 - val_loss: 1.4886 - val_sparse_categorical_accuracy: 0.9745\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -141,6 +142,7 @@ "import tensorflow_datasets as tfds\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", + "tf.get_logger().setLevel(\"FATAL\")\n", "\n", "tfds.disable_progress_bar()\n", "\n", @@ -199,7 +201,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23813777", + "id": "348fd0d3", "metadata": {}, "outputs": [], "source": [] From ac103515603a6a2540abc89c11b7cd67caf32135 Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Thu, 26 Aug 2021 17:27:43 +0200 Subject: [PATCH 05/13] additional test cases Signed-off-by: Luca Giorgi --- tensorflow/GPU-no-warnings.ipynb | 252 ++++++++++++++++++ ...-Minimal.ipynb => GPU-with-warnings.ipynb} | 33 ++- tensorflow/tensorflow-cpu_no-warnings.ipynb | 251 +++++++++++++++++ 3 files changed, 518 insertions(+), 18 deletions(-) create mode 100644 tensorflow/GPU-no-warnings.ipynb rename tensorflow/{TensorFlow-MNIST-Minimal.ipynb => GPU-with-warnings.ipynb} (89%) create mode 100644 tensorflow/tensorflow-cpu_no-warnings.ipynb diff --git a/tensorflow/GPU-no-warnings.ipynb b/tensorflow/GPU-no-warnings.ipynb new file mode 100644 index 0000000..d3a9f8c --- /dev/null +++ b/tensorflow/GPU-no-warnings.ipynb @@ -0,0 +1,252 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "1c02700a", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-04T20:07:47.647809Z", + "start_time": "2021-03-04T20:07:47.622673Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: pip in /home/lgiorgi/.local/lib/python3.6/site-packages (21.2.4)\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Collecting tensorflow\n", + " Downloading tensorflow-2.6.0-cp36-cp36m-manylinux2010_x86_64.whl (458.3 MB)\n", + "\u001b[?25l\n", + "\u001b[?25hRequirement already satisfied: tensorflow_datasets in /home/lgiorgi/.local/lib/python3.6/site-packages (4.4.0)\n", + "Requirement already satisfied: prometheus_client in /usr/local/lib/python3.6/site-packages (0.10.1)\n", + "Requirement already satisfied: opt-einsum~=3.3.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.3.0)\n", + "Requirement already satisfied: grpcio<2.0,>=1.37.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.39.0)\n", + "Requirement already satisfied: numpy~=1.19.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.19.5)\n", + "Requirement already satisfied: protobuf>=3.9.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.17.0)\n", + "Requirement already satisfied: typing-extensions~=3.7.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.7.4.3)\n", + "Requirement already satisfied: flatbuffers~=1.12.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.12)\n", + "Requirement already satisfied: h5py~=3.1.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.1.0)\n", + "Requirement already satisfied: keras~=2.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.6.0)\n", + "Requirement already satisfied: wrapt~=1.12.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.12.1)\n", + "Requirement already satisfied: clang~=5.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (5.0)\n", + "Requirement already satisfied: astunparse~=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.6.3)\n", + "Requirement already satisfied: keras-preprocessing~=1.1.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.1.2)\n", + "Requirement already satisfied: gast==0.4.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.4.0)\n", + "Requirement already satisfied: tensorboard~=2.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.6.0)\n", + "Requirement already satisfied: google-pasta~=0.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.2.0)\n", + "Requirement already satisfied: wheel~=0.35 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.36.2)\n", + "Requirement already satisfied: six~=1.15.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.15.0)\n", + "Requirement already satisfied: tensorflow-estimator~=2.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.6.0)\n", + "Requirement already satisfied: termcolor~=1.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow) (1.1.0)\n", + "Requirement already satisfied: absl-py~=0.10 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.12.0)\n", + "Requirement already satisfied: dataclasses in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.8)\n", + "Requirement already satisfied: promise in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.3)\n", + "Requirement already satisfied: dill in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.3.4)\n", + "Requirement already satisfied: attrs>=18.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (21.2.0)\n", + "Requirement already satisfied: tqdm in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (4.62.0)\n", + "Requirement already satisfied: importlib-resources in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (5.2.0)\n", + "Requirement already satisfied: future in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.18.2)\n", + "Requirement already satisfied: requests>=2.19.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.23.0)\n", + "Requirement already satisfied: tensorflow-metadata in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (1.2.0)\n", + "Requirement already satisfied: cached-property in /home/lgiorgi/.local/lib/python3.6/site-packages (from h5py~=3.1.0->tensorflow) (1.5.2)\n", + "Requirement already satisfied: idna<3,>=2.5 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2.9)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (1.25.8)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (3.0.4)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2020.4.5.1)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (2.0.0)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (56.2.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (0.6.1)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (0.4.4)\n", + "Requirement already satisfied: markdown>=2.6.8 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (3.3.4)\n", + "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (1.8.0)\n", + "Requirement already satisfied: google-auth<2,>=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (1.30.0)\n", + "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow) (4.2.2)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow) (4.7.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow) (0.2.8)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow) (1.3.0)\n", + "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.6/site-packages (from markdown>=2.6.8->tensorboard~=2.6->tensorflow) (4.0.1)\n", + "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow) (0.4.8)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow) (3.1.0)\n", + "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/site-packages (from importlib-metadata->markdown>=2.6.8->tensorboard~=2.6->tensorflow) (3.4.1)\n", + "Requirement already satisfied: googleapis-common-protos<2,>=1.52.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-metadata->tensorflow_datasets) (1.53.0)\n", + "Installing collected packages: tensorflow\n", + "Successfully installed tensorflow-2.6.0\n" + ] + } + ], + "source": [ + "!python -m pip install --upgrade pip\n", + "!pip install tensorflow tensorflow_datasets prometheus_client --progress-bar off" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "6ff2c1f8", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-04T15:32:58.177302Z", + "start_time": "2021-03-04T15:31:59.263480Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d (Conv2D) (None, 27, 27, 32) 160 \n", + "_________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 5408) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 128) 692352 \n", + "_________________________________________________________________\n", + "dropout (Dropout) (None, 128) 0 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 10) 1290 \n", + "=================================================================\n", + "Total params: 693,802\n", + "Trainable params: 693,802\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/5\n", + "469/469 [==============================] - 10s 18ms/step - loss: 1.5850 - sparse_categorical_accuracy: 0.8916 - val_loss: 1.5217 - val_sparse_categorical_accuracy: 0.9426\n", + "Epoch 2/5\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.5218 - sparse_categorical_accuracy: 0.9432 - val_loss: 1.5055 - val_sparse_categorical_accuracy: 0.9578\n", + "Epoch 3/5\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.5085 - sparse_categorical_accuracy: 0.9557 - val_loss: 1.4973 - val_sparse_categorical_accuracy: 0.9653\n", + "Epoch 4/5\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.4997 - sparse_categorical_accuracy: 0.9639 - val_loss: 1.4913 - val_sparse_categorical_accuracy: 0.9712\n", + "Epoch 5/5\n", + "469/469 [==============================] - 8s 18ms/step - loss: 1.4941 - sparse_categorical_accuracy: 0.9687 - val_loss: 1.4892 - val_sparse_categorical_accuracy: 0.9725\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import tensorflow as tf\n", + "import tensorflow_datasets as tfds\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "tf.get_logger().setLevel(\"FATAL\")\n", + "\n", + "tfds.disable_progress_bar()\n", + "\n", + "(mnist_train, mnist_test), ds_info = tfds.load(\n", + " 'mnist',\n", + " split=['train', 'test'],\n", + " shuffle_files=True,\n", + " as_supervised=True,\n", + " with_info=True,\n", + ")\n", + "\n", + "\n", + "def normalize_img(image, label):\n", + " \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n", + " return tf.cast(image, tf.float32) / 255.0, label\n", + "\n", + "\n", + "mnist_train = mnist_train.map(\n", + " normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n", + "mnist_train = mnist_train.cache() \\\n", + " .shuffle(ds_info.splits['train'].num_examples) \\\n", + " .batch(128) \\\n", + " .prefetch(tf.data.experimental.AUTOTUNE)\n", + "\n", + "mnist_test = mnist_test.map(\n", + " normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n", + "mnist_test = mnist_test.batch(128) \\\n", + " .cache() \\\n", + " .prefetch(tf.data.experimental.AUTOTUNE)\n", + "\n", + "\n", + "model = tf.keras.models.Sequential([\n", + " tf.keras.layers.Conv2D(\n", + " filters=32, kernel_size=(2, 2), input_shape=(28, 28, 1)),\n", + " tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2),\n", + " tf.keras.layers.Flatten(),\n", + " tf.keras.layers.Dense(units=128, activation=tf.nn.relu),\n", + " tf.keras.layers.Dropout(rate=0.2),\n", + " tf.keras.layers.Dense(10, activation=tf.nn.softmax)\n", + "])\n", + "\n", + "\n", + "model.compile(\n", + " optimizer=tf.keras.optimizers.Adam(0.001),\n", + " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", + " metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],\n", + ")\n", + "\n", + "model.summary()\n", + "\n", + "\n", + " \n", + "model.fit(mnist_train, epochs=5, validation_data=mnist_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "348fd0d3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "finalized": { + "timestamp": 1614876075124, + "trusted": true + }, + "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.6.8" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tensorflow/TensorFlow-MNIST-Minimal.ipynb b/tensorflow/GPU-with-warnings.ipynb similarity index 89% rename from tensorflow/TensorFlow-MNIST-Minimal.ipynb rename to tensorflow/GPU-with-warnings.ipynb index 2a19725..a6ff8ae 100644 --- a/tensorflow/TensorFlow-MNIST-Minimal.ipynb +++ b/tensorflow/GPU-with-warnings.ipynb @@ -80,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "6ff2c1f8", "metadata": { "ExecuteTime": { @@ -93,46 +93,45 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", - "Model: \"sequential_1\"\n", + "Model: \"sequential\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", - "conv2d_1 (Conv2D) (None, 27, 27, 32) 160 \n", + "conv2d (Conv2D) (None, 27, 27, 32) 160 \n", "_________________________________________________________________\n", - "max_pooling2d_1 (MaxPooling2 (None, 13, 13, 32) 0 \n", + "max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0 \n", "_________________________________________________________________\n", - "flatten_1 (Flatten) (None, 5408) 0 \n", + "flatten (Flatten) (None, 5408) 0 \n", "_________________________________________________________________\n", - "dense_2 (Dense) (None, 128) 692352 \n", + "dense (Dense) (None, 128) 692352 \n", "_________________________________________________________________\n", - "dropout_1 (Dropout) (None, 128) 0 \n", + "dropout (Dropout) (None, 128) 0 \n", "_________________________________________________________________\n", - "dense_3 (Dense) (None, 10) 1290 \n", + "dense_1 (Dense) (None, 10) 1290 \n", "=================================================================\n", "Total params: 693,802\n", "Trainable params: 693,802\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "Epoch 1/5\n", - "469/469 [==============================] - 9s 16ms/step - loss: 1.5959 - sparse_categorical_accuracy: 0.8803 - val_loss: 1.5211 - val_sparse_categorical_accuracy: 0.9435\n", + "469/469 [==============================] - 9s 17ms/step - loss: 1.5838 - sparse_categorical_accuracy: 0.8913 - val_loss: 1.5190 - val_sparse_categorical_accuracy: 0.9460\n", "Epoch 2/5\n", - "469/469 [==============================] - 8s 16ms/step - loss: 1.5216 - sparse_categorical_accuracy: 0.9435 - val_loss: 1.5053 - val_sparse_categorical_accuracy: 0.9582\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.5159 - sparse_categorical_accuracy: 0.9493 - val_loss: 1.5012 - val_sparse_categorical_accuracy: 0.9620\n", "Epoch 3/5\n", - "469/469 [==============================] - 8s 16ms/step - loss: 1.5066 - sparse_categorical_accuracy: 0.9573 - val_loss: 1.5016 - val_sparse_categorical_accuracy: 0.9616\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.5026 - sparse_categorical_accuracy: 0.9615 - val_loss: 1.4925 - val_sparse_categorical_accuracy: 0.9709\n", "Epoch 4/5\n", - "469/469 [==============================] - 8s 16ms/step - loss: 1.4993 - sparse_categorical_accuracy: 0.9641 - val_loss: 1.4920 - val_sparse_categorical_accuracy: 0.9713\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.4946 - sparse_categorical_accuracy: 0.9692 - val_loss: 1.4914 - val_sparse_categorical_accuracy: 0.9720\n", "Epoch 5/5\n", - "469/469 [==============================] - 8s 16ms/step - loss: 1.4937 - sparse_categorical_accuracy: 0.9699 - val_loss: 1.4886 - val_sparse_categorical_accuracy: 0.9745\n" + "469/469 [==============================] - 8s 17ms/step - loss: 1.4895 - sparse_categorical_accuracy: 0.9741 - val_loss: 1.4857 - val_sparse_categorical_accuracy: 0.9776\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 2, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -141,8 +140,6 @@ "import tensorflow as tf\n", "import tensorflow_datasets as tfds\n", "import warnings\n", - "warnings.filterwarnings('ignore')\n", - "tf.get_logger().setLevel(\"FATAL\")\n", "\n", "tfds.disable_progress_bar()\n", "\n", diff --git a/tensorflow/tensorflow-cpu_no-warnings.ipynb b/tensorflow/tensorflow-cpu_no-warnings.ipynb new file mode 100644 index 0000000..d01b52d --- /dev/null +++ b/tensorflow/tensorflow-cpu_no-warnings.ipynb @@ -0,0 +1,251 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "id": "1c02700a", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-04T20:07:47.647809Z", + "start_time": "2021-03-04T20:07:47.622673Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: pip in /home/lgiorgi/.local/lib/python3.6/site-packages (21.2.4)\n", + "\u001b[33mWARNING: Skipping tensorflow as it is not installed.\u001b[0m\n", + "\u001b[33mWARNING: Skipping tensorflow-gpu as it is not installed.\u001b[0m\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: tensorflow-cpu in /home/lgiorgi/.local/lib/python3.6/site-packages (2.6.0)\n", + "Requirement already satisfied: tensorflow_datasets in /home/lgiorgi/.local/lib/python3.6/site-packages (4.4.0)\n", + "Requirement already satisfied: prometheus_client in /usr/local/lib/python3.6/site-packages (0.10.1)\n", + "Requirement already satisfied: absl-py~=0.10 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (0.12.0)\n", + "Requirement already satisfied: opt-einsum~=3.3.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (3.3.0)\n", + "Requirement already satisfied: termcolor~=1.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow-cpu) (1.1.0)\n", + "Requirement already satisfied: flatbuffers~=1.12.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (1.12)\n", + "Requirement already satisfied: google-pasta~=0.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (0.2.0)\n", + "Requirement already satisfied: six~=1.15.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (1.15.0)\n", + "Requirement already satisfied: keras~=2.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (2.6.0)\n", + "Requirement already satisfied: wrapt~=1.12.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (1.12.1)\n", + "Requirement already satisfied: keras-preprocessing~=1.1.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (1.1.2)\n", + "Requirement already satisfied: typing-extensions~=3.7.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (3.7.4.3)\n", + "Requirement already satisfied: protobuf>=3.9.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (3.17.0)\n", + "Requirement already satisfied: tensorboard~=2.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (2.6.0)\n", + "Requirement already satisfied: gast==0.4.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (0.4.0)\n", + "Requirement already satisfied: wheel~=0.35 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (0.36.2)\n", + "Requirement already satisfied: grpcio<2.0,>=1.37.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (1.39.0)\n", + "Requirement already satisfied: astunparse~=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (1.6.3)\n", + "Requirement already satisfied: clang~=5.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (5.0)\n", + "Requirement already satisfied: h5py~=3.1.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (3.1.0)\n", + "Requirement already satisfied: tensorflow-estimator~=2.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (2.6.0)\n", + "Requirement already satisfied: numpy~=1.19.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-cpu) (1.19.5)\n", + "Requirement already satisfied: future in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.18.2)\n", + "Requirement already satisfied: promise in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.3)\n", + "Requirement already satisfied: tensorflow-metadata in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (1.2.0)\n", + "Requirement already satisfied: requests>=2.19.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.23.0)\n", + "Requirement already satisfied: attrs>=18.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (21.2.0)\n", + "Requirement already satisfied: dataclasses in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.8)\n", + "Requirement already satisfied: dill in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.3.4)\n", + "Requirement already satisfied: importlib-resources in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (5.2.0)\n", + "Requirement already satisfied: tqdm in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (4.62.0)\n", + "Requirement already satisfied: cached-property in /home/lgiorgi/.local/lib/python3.6/site-packages (from h5py~=3.1.0->tensorflow-cpu) (1.5.2)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (1.25.8)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2020.4.5.1)\n", + "Requirement already satisfied: idna<3,>=2.5 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2.9)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (3.0.4)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow-cpu) (56.2.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow-cpu) (0.6.1)\n", + "Requirement already satisfied: markdown>=2.6.8 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow-cpu) (3.3.4)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow-cpu) (0.4.4)\n", + "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow-cpu) (1.8.0)\n", + "Requirement already satisfied: google-auth<2,>=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow-cpu) (1.30.0)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow-cpu) (2.0.0)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow-cpu) (0.2.8)\n", + "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow-cpu) (4.2.2)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow-cpu) (4.7.2)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow-cpu) (1.3.0)\n", + "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.6/site-packages (from markdown>=2.6.8->tensorboard~=2.6->tensorflow-cpu) (4.0.1)\n", + "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow-cpu) (0.4.8)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow-cpu) (3.1.0)\n", + "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/site-packages (from importlib-metadata->markdown>=2.6.8->tensorboard~=2.6->tensorflow-cpu) (3.4.1)\n", + "Requirement already satisfied: googleapis-common-protos<2,>=1.52.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-metadata->tensorflow_datasets) (1.53.0)\n" + ] + } + ], + "source": [ + "!python -m pip install --upgrade pip\n", + "!pip uninstall tensorflow tensorflow-gpu -y\n", + "!pip install tensorflow-cpu tensorflow_datasets prometheus_client --progress-bar off" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6ff2c1f8", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-04T15:32:58.177302Z", + "start_time": "2021-03-04T15:31:59.263480Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d (Conv2D) (None, 27, 27, 32) 160 \n", + "_________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 5408) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 128) 692352 \n", + "_________________________________________________________________\n", + "dropout (Dropout) (None, 128) 0 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 10) 1290 \n", + "=================================================================\n", + "Total params: 693,802\n", + "Trainable params: 693,802\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/5\n", + "469/469 [==============================] - 10s 18ms/step - loss: 1.5879 - sparse_categorical_accuracy: 0.8887 - val_loss: 1.5238 - val_sparse_categorical_accuracy: 0.9421\n", + "Epoch 2/5\n", + "469/469 [==============================] - 9s 18ms/step - loss: 1.5191 - sparse_categorical_accuracy: 0.9465 - val_loss: 1.5060 - val_sparse_categorical_accuracy: 0.9579\n", + "Epoch 3/5\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.5050 - sparse_categorical_accuracy: 0.9587 - val_loss: 1.4946 - val_sparse_categorical_accuracy: 0.9691\n", + "Epoch 4/5\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.4960 - sparse_categorical_accuracy: 0.9680 - val_loss: 1.4905 - val_sparse_categorical_accuracy: 0.9720\n", + "Epoch 5/5\n", + "469/469 [==============================] - 8s 17ms/step - loss: 1.4905 - sparse_categorical_accuracy: 0.9730 - val_loss: 1.4881 - val_sparse_categorical_accuracy: 0.9752\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import tensorflow as tf\n", + "import tensorflow_datasets as tfds\n", + "import warnings\n", + "#warnings.filterwarnings('ignore')\n", + "#tf.get_logger().setLevel(\"FATAL\")\n", + "\n", + "tfds.disable_progress_bar()\n", + "\n", + "(mnist_train, mnist_test), ds_info = tfds.load(\n", + " 'mnist',\n", + " split=['train', 'test'],\n", + " shuffle_files=True,\n", + " as_supervised=True,\n", + " with_info=True,\n", + ")\n", + "\n", + "\n", + "def normalize_img(image, label):\n", + " \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n", + " return tf.cast(image, tf.float32) / 255.0, label\n", + "\n", + "\n", + "mnist_train = mnist_train.map(\n", + " normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n", + "mnist_train = mnist_train.cache() \\\n", + " .shuffle(ds_info.splits['train'].num_examples) \\\n", + " .batch(128) \\\n", + " .prefetch(tf.data.experimental.AUTOTUNE)\n", + "\n", + "mnist_test = mnist_test.map(\n", + " normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n", + "mnist_test = mnist_test.batch(128) \\\n", + " .cache() \\\n", + " .prefetch(tf.data.experimental.AUTOTUNE)\n", + "\n", + "\n", + "model = tf.keras.models.Sequential([\n", + " tf.keras.layers.Conv2D(\n", + " filters=32, kernel_size=(2, 2), input_shape=(28, 28, 1)),\n", + " tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2),\n", + " tf.keras.layers.Flatten(),\n", + " tf.keras.layers.Dense(units=128, activation=tf.nn.relu),\n", + " tf.keras.layers.Dropout(rate=0.2),\n", + " tf.keras.layers.Dense(10, activation=tf.nn.softmax)\n", + "])\n", + "\n", + "\n", + "model.compile(\n", + " optimizer=tf.keras.optimizers.Adam(0.001),\n", + " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", + " metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],\n", + ")\n", + "\n", + "model.summary()\n", + "\n", + "\n", + " \n", + "model.fit(mnist_train, epochs=5, validation_data=mnist_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "348fd0d3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "finalized": { + "timestamp": 1614876075124, + "trusted": true + }, + "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.6.8" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From b0306dced001fa8a526cc23cdfbecfce5cfdeb4e Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Mon, 8 Nov 2021 15:33:27 +0100 Subject: [PATCH 06/13] remove gateway call --- pytorch/PyTorch-MNIST-Minimal.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pytorch/PyTorch-MNIST-Minimal.ipynb b/pytorch/PyTorch-MNIST-Minimal.ipynb index 7206f39..a210bed 100644 --- a/pytorch/PyTorch-MNIST-Minimal.ipynb +++ b/pytorch/PyTorch-MNIST-Minimal.ipynb @@ -12,7 +12,7 @@ }, "outputs": [], "source": [ - "!pip install torch torchvision prometheus_client --progress-bar off" + "!pip install torchvision prometheus_client --progress-bar off" ] }, { @@ -107,7 +107,7 @@ " add_metrics_data(current_time, epoch, value_formatter.format(time_post_loop - time_pre_loop),value_formatter.format(step_time_avg * 1000))\n", "\n", "\n", - "pushgateway_url = \"http://prom-push-as-pushgateway.apps.zero.massopen.cloud\"\n", + "#pushgateway_url = \"http://prom-push-as-pushgateway.apps.zero.massopen.cloud\"\n", "registry = CollectorRegistry()\n", "epoch_gauge = Gauge(name='epoch_duration_seconds', documentation='epoch_value is the metric itself, the stuff in the {}s are tags',labelnames=[\"model\",\"framework\",\"date\",\"epoch\"],registry=registry)\n", "step_gauge = Gauge(name='step_during_milliseconds', documentation='step_during_milliseconds is the metric itself, the stuff in the {}s are tags',labelnames=[\"model\",\"framework\",\"date\",\"epoch\"],registry=registry)\n", @@ -115,7 +115,7 @@ "def add_metrics_data(current_time, epoch_num, epoch_value, step_value): \n", " epoch_gauge.labels(\"mnist-minimal\",\"Pytorch\",current_time,epoch_num).set(epoch_value)\n", " step_gauge.labels(\"mnist-minimal\",\"Pytorch\",current_time,epoch_num).set(step_value) \n", - " push_to_gateway(pushgateway_url, job='jupyterhub_load', registry=registry)\n", + " #push_to_gateway(pushgateway_url, job='jupyterhub_load', registry=registry)\n", "\n", "\n", "fit(epochs=5, model=model, loss_func=F.cross_entropy,\n", From 8343d80a7436cb875324cefd292cba26a786a90b Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Mon, 8 Nov 2021 17:58:06 +0100 Subject: [PATCH 07/13] os warning toggle --- tensorflow/GPU-no-warnings.ipynb | 142 ++----------------------------- 1 file changed, 6 insertions(+), 136 deletions(-) diff --git a/tensorflow/GPU-no-warnings.ipynb b/tensorflow/GPU-no-warnings.ipynb index d3a9f8c..d8f16b3 100644 --- a/tensorflow/GPU-no-warnings.ipynb +++ b/tensorflow/GPU-no-warnings.ipynb @@ -2,151 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "id": "1c02700a", - "metadata": { - "ExecuteTime": { - "end_time": "2021-03-04T20:07:47.647809Z", - "start_time": "2021-03-04T20:07:47.622673Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Defaulting to user installation because normal site-packages is not writeable\n", - "Requirement already satisfied: pip in /home/lgiorgi/.local/lib/python3.6/site-packages (21.2.4)\n", - "Defaulting to user installation because normal site-packages is not writeable\n", - "Collecting tensorflow\n", - " Downloading tensorflow-2.6.0-cp36-cp36m-manylinux2010_x86_64.whl (458.3 MB)\n", - "\u001b[?25l\n", - "\u001b[?25hRequirement already satisfied: tensorflow_datasets in /home/lgiorgi/.local/lib/python3.6/site-packages (4.4.0)\n", - "Requirement already satisfied: prometheus_client in /usr/local/lib/python3.6/site-packages (0.10.1)\n", - "Requirement already satisfied: opt-einsum~=3.3.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.3.0)\n", - "Requirement already satisfied: grpcio<2.0,>=1.37.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.39.0)\n", - "Requirement already satisfied: numpy~=1.19.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.19.5)\n", - "Requirement already satisfied: protobuf>=3.9.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.17.0)\n", - "Requirement already satisfied: typing-extensions~=3.7.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.7.4.3)\n", - "Requirement already satisfied: flatbuffers~=1.12.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.12)\n", - "Requirement already satisfied: h5py~=3.1.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (3.1.0)\n", - "Requirement already satisfied: keras~=2.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.6.0)\n", - "Requirement already satisfied: wrapt~=1.12.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.12.1)\n", - "Requirement already satisfied: clang~=5.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (5.0)\n", - "Requirement already satisfied: astunparse~=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.6.3)\n", - "Requirement already satisfied: keras-preprocessing~=1.1.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.1.2)\n", - "Requirement already satisfied: gast==0.4.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.4.0)\n", - "Requirement already satisfied: tensorboard~=2.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.6.0)\n", - "Requirement already satisfied: google-pasta~=0.2 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.2.0)\n", - "Requirement already satisfied: wheel~=0.35 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.36.2)\n", - "Requirement already satisfied: six~=1.15.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (1.15.0)\n", - "Requirement already satisfied: tensorflow-estimator~=2.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (2.6.0)\n", - "Requirement already satisfied: termcolor~=1.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow) (1.1.0)\n", - "Requirement already satisfied: absl-py~=0.10 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow) (0.12.0)\n", - "Requirement already satisfied: dataclasses in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.8)\n", - "Requirement already satisfied: promise in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.3)\n", - "Requirement already satisfied: dill in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.3.4)\n", - "Requirement already satisfied: attrs>=18.1.0 in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (21.2.0)\n", - "Requirement already satisfied: tqdm in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (4.62.0)\n", - "Requirement already satisfied: importlib-resources in /usr/local/lib/python3.6/site-packages (from tensorflow_datasets) (5.2.0)\n", - "Requirement already satisfied: future in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (0.18.2)\n", - "Requirement already satisfied: requests>=2.19.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (2.23.0)\n", - "Requirement already satisfied: tensorflow-metadata in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow_datasets) (1.2.0)\n", - "Requirement already satisfied: cached-property in /home/lgiorgi/.local/lib/python3.6/site-packages (from h5py~=3.1.0->tensorflow) (1.5.2)\n", - "Requirement already satisfied: idna<3,>=2.5 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2.9)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (1.25.8)\n", - "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (3.0.4)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests>=2.19.0->tensorflow_datasets) (2020.4.5.1)\n", - "Requirement already satisfied: werkzeug>=0.11.15 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (2.0.0)\n", - "Requirement already satisfied: setuptools>=41.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (56.2.0)\n", - "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (0.6.1)\n", - "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (0.4.4)\n", - "Requirement already satisfied: markdown>=2.6.8 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (3.3.4)\n", - "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (1.8.0)\n", - "Requirement already satisfied: google-auth<2,>=1.6.3 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorboard~=2.6->tensorflow) (1.30.0)\n", - "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow) (4.2.2)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow) (4.7.2)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow) (0.2.8)\n", - "Requirement already satisfied: requests-oauthlib>=0.7.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow) (1.3.0)\n", - "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.6/site-packages (from markdown>=2.6.8->tensorboard~=2.6->tensorflow) (4.0.1)\n", - "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /home/lgiorgi/.local/lib/python3.6/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow) (0.4.8)\n", - "Requirement already satisfied: oauthlib>=3.0.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow) (3.1.0)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/site-packages (from importlib-metadata->markdown>=2.6.8->tensorboard~=2.6->tensorflow) (3.4.1)\n", - "Requirement already satisfied: googleapis-common-protos<2,>=1.52.0 in /home/lgiorgi/.local/lib/python3.6/site-packages (from tensorflow-metadata->tensorflow_datasets) (1.53.0)\n", - "Installing collected packages: tensorflow\n", - "Successfully installed tensorflow-2.6.0\n" - ] - } - ], - "source": [ - "!python -m pip install --upgrade pip\n", - "!pip install tensorflow tensorflow_datasets prometheus_client --progress-bar off" - ] - }, - { - "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "6ff2c1f8", "metadata": { "ExecuteTime": { "end_time": "2021-03-04T15:32:58.177302Z", "start_time": "2021-03-04T15:31:59.263480Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "conv2d (Conv2D) (None, 27, 27, 32) 160 \n", - "_________________________________________________________________\n", - "max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 5408) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 128) 692352 \n", - "_________________________________________________________________\n", - "dropout (Dropout) (None, 128) 0 \n", - "_________________________________________________________________\n", - "dense_1 (Dense) (None, 10) 1290 \n", - "=================================================================\n", - "Total params: 693,802\n", - "Trainable params: 693,802\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n", - "Epoch 1/5\n", - "469/469 [==============================] - 10s 18ms/step - loss: 1.5850 - sparse_categorical_accuracy: 0.8916 - val_loss: 1.5217 - val_sparse_categorical_accuracy: 0.9426\n", - "Epoch 2/5\n", - "469/469 [==============================] - 8s 17ms/step - loss: 1.5218 - sparse_categorical_accuracy: 0.9432 - val_loss: 1.5055 - val_sparse_categorical_accuracy: 0.9578\n", - "Epoch 3/5\n", - "469/469 [==============================] - 8s 17ms/step - loss: 1.5085 - sparse_categorical_accuracy: 0.9557 - val_loss: 1.4973 - val_sparse_categorical_accuracy: 0.9653\n", - "Epoch 4/5\n", - "469/469 [==============================] - 8s 17ms/step - loss: 1.4997 - sparse_categorical_accuracy: 0.9639 - val_loss: 1.4913 - val_sparse_categorical_accuracy: 0.9712\n", - "Epoch 5/5\n", - "469/469 [==============================] - 8s 18ms/step - loss: 1.4941 - sparse_categorical_accuracy: 0.9687 - val_loss: 1.4892 - val_sparse_categorical_accuracy: 0.9725\n" - ] }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "scrolled": true + }, + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_datasets as tfds\n", - "import warnings\n", - "warnings.filterwarnings('ignore')\n", - "tf.get_logger().setLevel(\"FATAL\")\n", + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'\n", "\n", "tfds.disable_progress_bar()\n", "\n", From 08c88ebcbaa78fdbe609ada041ab42d21d43735b Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Mon, 8 Nov 2021 18:12:27 +0100 Subject: [PATCH 08/13] Fix dataset import --- tensorflow/GPU-no-warnings.ipynb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tensorflow/GPU-no-warnings.ipynb b/tensorflow/GPU-no-warnings.ipynb index d8f16b3..d67c464 100644 --- a/tensorflow/GPU-no-warnings.ipynb +++ b/tensorflow/GPU-no-warnings.ipynb @@ -1,5 +1,15 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "ad5eae44", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install tensorflow_datasets prometheus_client --progress-bar off" + ] + }, { "cell_type": "code", "execution_count": null, From 52491761b338fedeabf7f9e4714efd941fb6dd0c Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Thu, 10 Mar 2022 15:24:15 +0100 Subject: [PATCH 09/13] Add new PyTorch nb for GPU testing Signed-off-by: Luca Giorgi --- pytorch/fgsm_tutorial.ipynb | 345 ++++++++++++++++++++++++++++++++++ pytorch/lenet_mnist_model.pth | Bin 0 -> 88724 bytes 2 files changed, 345 insertions(+) create mode 100644 pytorch/fgsm_tutorial.ipynb create mode 100644 pytorch/lenet_mnist_model.pth diff --git a/pytorch/fgsm_tutorial.ipynb b/pytorch/fgsm_tutorial.ipynb new file mode 100644 index 0000000..fc723af --- /dev/null +++ b/pytorch/fgsm_tutorial.ipynb @@ -0,0 +1,345 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from __future__ import print_function\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "from torchvision import datasets, transforms\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# NOTE: This is a hack to get around \"User-agent\" limitations when downloading MNIST datasets\n", + "# see, https://github.com/pytorch/vision/issues/3497 for more information\n", + "from six.moves import urllib\n", + "opener = urllib.request.build_opener()\n", + "opener.addheaders = [('User-agent', 'Mozilla/5.0')]\n", + "urllib.request.install_opener(opener)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "epsilons = [0, .05, .1, .15, .2, .25, .3]\n", + "pretrained_model = \"lenet_mnist_model.pth\"\n", + "use_cuda=True" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CUDA Available: True\n" + ] + }, + { + "data": { + "text/plain": [ + "Net(\n", + " (conv1): Conv2d(1, 10, kernel_size=(5, 5), stride=(1, 1))\n", + " (conv2): Conv2d(10, 20, kernel_size=(5, 5), stride=(1, 1))\n", + " (conv2_drop): Dropout2d(p=0.5, inplace=False)\n", + " (fc1): Linear(in_features=320, out_features=50, bias=True)\n", + " (fc2): Linear(in_features=50, out_features=10, bias=True)\n", + ")" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# LeNet Model definition\n", + "class Net(nn.Module):\n", + " def __init__(self):\n", + " super(Net, self).__init__()\n", + " self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n", + " self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n", + " self.conv2_drop = nn.Dropout2d()\n", + " self.fc1 = nn.Linear(320, 50)\n", + " self.fc2 = nn.Linear(50, 10)\n", + "\n", + " def forward(self, x):\n", + " x = F.relu(F.max_pool2d(self.conv1(x), 2))\n", + " x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))\n", + " x = x.view(-1, 320)\n", + " x = F.relu(self.fc1(x))\n", + " x = F.dropout(x, training=self.training)\n", + " x = self.fc2(x)\n", + " return F.log_softmax(x, dim=1)\n", + "\n", + "# MNIST Test dataset and dataloader declaration\n", + "test_loader = torch.utils.data.DataLoader(\n", + " datasets.MNIST('../data', train=False, download=True, transform=transforms.Compose([\n", + " transforms.ToTensor(),\n", + " ])), \n", + " batch_size=1, shuffle=True)\n", + "\n", + "# Define what device we are using\n", + "print(\"CUDA Available: \",torch.cuda.is_available())\n", + "device = torch.device(\"cuda\" if (use_cuda and torch.cuda.is_available()) else \"cpu\")\n", + "\n", + "# Initialize the network\n", + "model = Net().to(device)\n", + "\n", + "# Load the pretrained model\n", + "model.load_state_dict(torch.load(pretrained_model, map_location='cpu'))\n", + "\n", + "# Set the model in evaluation mode. In this case this is for the Dropout layers\n", + "model.eval()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "# FGSM attack code\n", + "def fgsm_attack(image, epsilon, data_grad):\n", + " # Collect the element-wise sign of the data gradient\n", + " sign_data_grad = data_grad.sign()\n", + " # Create the perturbed image by adjusting each pixel of the input image\n", + " perturbed_image = image + epsilon*sign_data_grad\n", + " # Adding clipping to maintain [0,1] range\n", + " perturbed_image = torch.clamp(perturbed_image, 0, 1)\n", + " # Return the perturbed image\n", + " return perturbed_image" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "def test( model, device, test_loader, epsilon ):\n", + "\n", + " # Accuracy counter\n", + " correct = 0\n", + " adv_examples = []\n", + "\n", + " # Loop over all examples in test set\n", + " for data, target in test_loader:\n", + "\n", + " # Send the data and label to the device\n", + " data, target = data.to(device), target.to(device)\n", + "\n", + " # Set requires_grad attribute of tensor. Important for Attack\n", + " data.requires_grad = True\n", + "\n", + " # Forward pass the data through the model\n", + " output = model(data)\n", + " init_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability\n", + "\n", + " # If the initial prediction is wrong, dont bother attacking, just move on\n", + " if init_pred.item() != target.item():\n", + " continue\n", + "\n", + " # Calculate the loss\n", + " loss = F.nll_loss(output, target)\n", + "\n", + " # Zero all existing gradients\n", + " model.zero_grad()\n", + "\n", + " # Calculate gradients of model in backward pass\n", + " loss.backward()\n", + "\n", + " # Collect datagrad\n", + " data_grad = data.grad.data\n", + "\n", + " # Call FGSM Attack\n", + " perturbed_data = fgsm_attack(data, epsilon, data_grad)\n", + "\n", + " # Re-classify the perturbed image\n", + " output = model(perturbed_data)\n", + "\n", + " # Check for success\n", + " final_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability\n", + " if final_pred.item() == target.item():\n", + " correct += 1\n", + " # Special case for saving 0 epsilon examples\n", + " if (epsilon == 0) and (len(adv_examples) < 5):\n", + " adv_ex = perturbed_data.squeeze().detach().cpu().numpy()\n", + " adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) )\n", + " else:\n", + " # Save some adv examples for visualization later\n", + " if len(adv_examples) < 5:\n", + " adv_ex = perturbed_data.squeeze().detach().cpu().numpy()\n", + " adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) )\n", + "\n", + " # Calculate final accuracy for this epsilon\n", + " final_acc = correct/float(len(test_loader))\n", + " print(\"Epsilon: {}\\tTest Accuracy = {} / {} = {}\".format(epsilon, correct, len(test_loader), final_acc))\n", + "\n", + " # Return the accuracy and an adversarial example\n", + " return final_acc, adv_examples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epsilon: 0\tTest Accuracy = 9810 / 10000 = 0.981\n", + "Epsilon: 0.05\tTest Accuracy = 9426 / 10000 = 0.9426\n", + "Epsilon: 0.1\tTest Accuracy = 8510 / 10000 = 0.851\n", + "Epsilon: 0.15\tTest Accuracy = 6826 / 10000 = 0.6826\n", + "Epsilon: 0.2\tTest Accuracy = 4303 / 10000 = 0.4303\n" + ] + } + ], + "source": [ + "accuracies = []\n", + "examples = []\n", + "\n", + "# Run test for each epsilon\n", + "for eps in epsilons:\n", + " acc, ex = test(model, device, test_loader, eps)\n", + " accuracies.append(acc)\n", + " examples.append(ex)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "plt.figure(figsize=(5,5))\n", + "plt.plot(epsilons, accuracies, \"*-\")\n", + "plt.yticks(np.arange(0, 1.1, step=0.1))\n", + "plt.xticks(np.arange(0, .35, step=0.05))\n", + "plt.title(\"Accuracy vs Epsilon\")\n", + "plt.xlabel(\"Epsilon\")\n", + "plt.ylabel(\"Accuracy\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "# Plot several examples of adversarial samples at each epsilon\n", + "cnt = 0\n", + "plt.figure(figsize=(8,10))\n", + "for i in range(len(epsilons)):\n", + " for j in range(len(examples[i])):\n", + " cnt += 1\n", + " plt.subplot(len(epsilons),len(examples[0]),cnt)\n", + " plt.xticks([], [])\n", + " plt.yticks([], [])\n", + " if j == 0:\n", + " plt.ylabel(\"Eps: {}\".format(epsilons[i]), fontsize=14)\n", + " orig,adv,ex = examples[i][j]\n", + " plt.title(\"{} -> {}\".format(orig, adv))\n", + " plt.imshow(ex, cmap=\"gray\")\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/pytorch/lenet_mnist_model.pth b/pytorch/lenet_mnist_model.pth new file mode 100644 index 0000000000000000000000000000000000000000..571e03af4e5efc66be1aebead5ee4b0002edf0c8 GIT binary patch literal 88724 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%0AOX4J-Px(jMkc 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 Date: Mon, 21 Mar 2022 18:10:45 +0100 Subject: [PATCH 10/13] Update torch version Signed-off-by: Luca Giorgi --- pytorch/fgsm_tutorial.ipynb | 69 +++++++------------------------------ 1 file changed, 13 insertions(+), 56 deletions(-) diff --git a/pytorch/fgsm_tutorial.ipynb b/pytorch/fgsm_tutorial.ipynb index fc723af..c8f07da 100644 --- a/pytorch/fgsm_tutorial.ipynb +++ b/pytorch/fgsm_tutorial.ipynb @@ -2,23 +2,23 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ - "%matplotlib inline" + "%matplotlib inline\n", + "# Default torch version contains a bug triggered by this nb\n", + "!pip install --upgrade torch torchvision" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -44,9 +44,8 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -60,38 +59,13 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CUDA Available: True\n" - ] - }, - { - "data": { - "text/plain": [ - "Net(\n", - " (conv1): Conv2d(1, 10, kernel_size=(5, 5), stride=(1, 1))\n", - " (conv2): Conv2d(10, 20, kernel_size=(5, 5), stride=(1, 1))\n", - " (conv2_drop): Dropout2d(p=0.5, inplace=False)\n", - " (fc1): Linear(in_features=320, out_features=50, bias=True)\n", - " (fc2): Linear(in_features=50, out_features=10, bias=True)\n", - ")" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# LeNet Model definition\n", "class Net(nn.Module):\n", @@ -135,9 +109,8 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -158,9 +131,8 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -234,24 +206,11 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epsilon: 0\tTest Accuracy = 9810 / 10000 = 0.981\n", - "Epsilon: 0.05\tTest Accuracy = 9426 / 10000 = 0.9426\n", - "Epsilon: 0.1\tTest Accuracy = 8510 / 10000 = 0.851\n", - "Epsilon: 0.15\tTest Accuracy = 6826 / 10000 = 0.6826\n", - "Epsilon: 0.2\tTest Accuracy = 4303 / 10000 = 0.4303\n" - ] - } - ], + "outputs": [], "source": [ "accuracies = []\n", "examples = []\n", @@ -267,7 +226,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -288,7 +246,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -323,7 +280,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -337,7 +294,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.10.1" } }, "nbformat": 4, From 81e2c910e956a08c9613ae5351da8bf11a4dfdc3 Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Mon, 19 Dec 2022 16:29:52 +0100 Subject: [PATCH 11/13] Workaround for https://github.com/pytorch/vision/issues/7040 Signed-off-by: Luca Giorgi --- pytorch/fgsm_tutorial.ipynb | 52 ++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/pytorch/fgsm_tutorial.ipynb b/pytorch/fgsm_tutorial.ipynb index c8f07da..39d5025 100644 --- a/pytorch/fgsm_tutorial.ipynb +++ b/pytorch/fgsm_tutorial.ipynb @@ -4,6 +4,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -19,6 +20,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -46,6 +48,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -61,6 +64,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -84,15 +88,35 @@ " x = F.relu(self.fc1(x))\n", " x = F.dropout(x, training=self.training)\n", " x = self.fc2(x)\n", - " return F.log_softmax(x, dim=1)\n", - "\n", + " return F.log_softmax(x, dim=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "# MNIST Test dataset and dataloader declaration\n", - "test_loader = torch.utils.data.DataLoader(\n", - " datasets.MNIST('../data', train=False, download=True, transform=transforms.Compose([\n", - " transforms.ToTensor(),\n", - " ])), \n", - " batch_size=1, shuffle=True)\n", + "# Use contextlib to redirect output to stdout instead of stderr\n", + "# cfr. https://github.com/pytorch/vision/issues/7040\n", + "import contextlib\n", + "import sys\n", "\n", + "with contextlib.redirect_stderr(sys.stdout):\n", + " test_loader = torch.utils.data.DataLoader(\n", + " datasets.MNIST('../data', train=False, download=True, transform=transforms.Compose([\n", + " transforms.ToTensor(),\n", + " ])), \n", + " batch_size=1, shuffle=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "# Define what device we are using\n", "print(\"CUDA Available: \",torch.cuda.is_available())\n", "device = torch.device(\"cuda\" if (use_cuda and torch.cuda.is_available()) else \"cpu\")\n", @@ -111,6 +135,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -133,6 +158,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -206,6 +232,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -226,6 +253,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -246,6 +274,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false } @@ -269,13 +298,6 @@ "plt.tight_layout()\n", "plt.show()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -294,7 +316,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.1" + "version": "3.8.13" } }, "nbformat": 4, From f7918ba28ba63b1e87f3c9bd89e4f2d59b4f418b Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Mon, 3 Apr 2023 15:42:06 +0200 Subject: [PATCH 12/13] Update warning suppression for tensorflow notebook Signed-off-by: Luca Giorgi --- tensorflow/GPU-no-warnings.ipynb | 88 ++++++++++++++++---------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/tensorflow/GPU-no-warnings.ipynb b/tensorflow/GPU-no-warnings.ipynb index d67c464..9df9277 100644 --- a/tensorflow/GPU-no-warnings.ipynb +++ b/tensorflow/GPU-no-warnings.ipynb @@ -23,63 +23,65 @@ }, "outputs": [], "source": [ - "import tensorflow as tf\n", - "import tensorflow_datasets as tfds\n", + "import sys\n", + "import contextlib\n", "import os\n", "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'\n", "\n", - "tfds.disable_progress_bar()\n", + "with contextlib.redirect_stderr(sys.stdout):\n", + " import tensorflow as tf\n", + " import tensorflow_datasets as tfds\n", "\n", - "(mnist_train, mnist_test), ds_info = tfds.load(\n", - " 'mnist',\n", - " split=['train', 'test'],\n", - " shuffle_files=True,\n", - " as_supervised=True,\n", - " with_info=True,\n", - ")\n", + " tfds.disable_progress_bar()\n", "\n", + " (mnist_train, mnist_test), ds_info = tfds.load(\n", + " 'mnist',\n", + " split=['train', 'test'],\n", + " shuffle_files=True,\n", + " as_supervised=True,\n", + " with_info=True,\n", + " )\n", "\n", - "def normalize_img(image, label):\n", - " \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n", - " return tf.cast(image, tf.float32) / 255.0, label\n", "\n", + " def normalize_img(image, label):\n", + " \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n", + " return tf.cast(image, tf.float32) / 255.0, label\n", "\n", - "mnist_train = mnist_train.map(\n", - " normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n", - "mnist_train = mnist_train.cache() \\\n", - " .shuffle(ds_info.splits['train'].num_examples) \\\n", - " .batch(128) \\\n", - " .prefetch(tf.data.experimental.AUTOTUNE)\n", "\n", - "mnist_test = mnist_test.map(\n", - " normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n", - "mnist_test = mnist_test.batch(128) \\\n", - " .cache() \\\n", - " .prefetch(tf.data.experimental.AUTOTUNE)\n", + " mnist_train = mnist_train.map(\n", + " normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n", + " mnist_train = mnist_train.cache() \\\n", + " .shuffle(ds_info.splits['train'].num_examples) \\\n", + " .batch(128) \\\n", + " .prefetch(tf.data.experimental.AUTOTUNE)\n", "\n", + " mnist_test = mnist_test.map(\n", + " normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n", + " mnist_test = mnist_test.batch(128) \\\n", + " .cache() \\\n", + " .prefetch(tf.data.experimental.AUTOTUNE)\n", "\n", - "model = tf.keras.models.Sequential([\n", - " tf.keras.layers.Conv2D(\n", - " filters=32, kernel_size=(2, 2), input_shape=(28, 28, 1)),\n", - " tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2),\n", - " tf.keras.layers.Flatten(),\n", - " tf.keras.layers.Dense(units=128, activation=tf.nn.relu),\n", - " tf.keras.layers.Dropout(rate=0.2),\n", - " tf.keras.layers.Dense(10, activation=tf.nn.softmax)\n", - "])\n", "\n", + " model = tf.keras.models.Sequential([\n", + " tf.keras.layers.Conv2D(\n", + " filters=32, kernel_size=(2, 2), input_shape=(28, 28, 1)),\n", + " tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2),\n", + " tf.keras.layers.Flatten(),\n", + " tf.keras.layers.Dense(units=128, activation=tf.nn.relu),\n", + " tf.keras.layers.Dropout(rate=0.2),\n", + " tf.keras.layers.Dense(10, activation=tf.nn.softmax)\n", + " ])\n", "\n", - "model.compile(\n", - " optimizer=tf.keras.optimizers.Adam(0.001),\n", - " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", - " metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],\n", - ")\n", "\n", - "model.summary()\n", + " model.compile(\n", + " optimizer=tf.keras.optimizers.Adam(0.001),\n", + " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", + " metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],\n", + " )\n", "\n", + " model.summary()\n", "\n", - " \n", - "model.fit(mnist_train, epochs=5, validation_data=mnist_test)\n" + " model.fit(mnist_train, epochs=5, validation_data=mnist_test)" ] }, { @@ -97,7 +99,7 @@ "trusted": true }, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -111,7 +113,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.9.16" }, "toc": { "base_numbering": 1, From 454ddeb5a0ca5e168bd90017f7a2a52ad76252eb Mon Sep 17 00:00:00 2001 From: Luca Giorgi Date: Tue, 16 May 2023 14:22:21 +0200 Subject: [PATCH 13/13] pin protobuf to 3.19.6 Signed-off-by: Luca Giorgi --- tensorflow/GPU-no-warnings.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow/GPU-no-warnings.ipynb b/tensorflow/GPU-no-warnings.ipynb index 9df9277..667e540 100644 --- a/tensorflow/GPU-no-warnings.ipynb +++ b/tensorflow/GPU-no-warnings.ipynb @@ -7,7 +7,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install tensorflow_datasets prometheus_client --progress-bar off" + "!pip install tensorflow_datasets protobuf==3.19.6 prometheus_client --progress-bar off" ] }, {