{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "0b05a7b8-ee5a-4622-9211-55477f976b40", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2024-09-22 22:40:35.345318: I tensorflow/core/util/util.cc:169] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n" ] }, { "ename": "ImportError", "evalue": "cannot import name 'builder' from 'google.protobuf.internal' (/home/harsha/.local/lib/python3.10/site-packages/google/protobuf/internal/__init__.py)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[1], line 7\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mplt\u001b[39;00m\n\u001b[0;32m----> 7\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mtf2onnx\u001b[39;00m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/tf2onnx/__init__.py:8\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;124;03m\"\"\"tf2onnx package.\"\"\"\u001b[39;00m\n\u001b[1;32m 5\u001b[0m __all__ \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mutils\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgraph_matcher\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgraph\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgraph_builder\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 6\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtfonnx\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshape_inference\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mschemas\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtf_utils\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtf_loader\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mconvert\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m----> 8\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01monnx\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mversion\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m git_version, version \u001b[38;5;28;01mas\u001b[39;00m __version__\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m verbose_logging \u001b[38;5;28;01mas\u001b[39;00m logging\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/onnx/__init__.py:13\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mgoogle\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mprotobuf\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmessage\u001b[39;00m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01monnx\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01monnx_cpp2py_export\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ONNX_ML\n\u001b[0;32m---> 13\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01monnx\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mexternal_data_helper\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 14\u001b[0m load_external_data_for_model,\n\u001b[1;32m 15\u001b[0m write_external_data_tensors,\n\u001b[1;32m 16\u001b[0m convert_model_to_external_data,\n\u001b[1;32m 17\u001b[0m )\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01monnx\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01monnx_pb\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 19\u001b[0m AttributeProto,\n\u001b[1;32m 20\u001b[0m EXPERIMENTAL,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 45\u001b[0m Version,\n\u001b[1;32m 46\u001b[0m )\n\u001b[1;32m 47\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01monnx\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01monnx_operators_pb\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m OperatorProto, OperatorSetProto\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/onnx/external_data_helper.py:11\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mitertools\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m chain\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtyping\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Callable, Iterable, Optional\n\u001b[0;32m---> 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01monnx\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01monnx_pb\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m AttributeProto, GraphProto, ModelProto, TensorProto\n\u001b[1;32m 14\u001b[0m \u001b[38;5;28;01mclass\u001b[39;00m \u001b[38;5;21;01mExternalDataInfo\u001b[39;00m:\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, tensor: TensorProto) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/onnx/onnx_pb.py:4\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# This file is generated by setup.py. DO NOT EDIT!\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01monnx_ml_pb2\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m \u001b[38;5;66;03m# noqa\u001b[39;00m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/onnx/onnx_ml_pb2.py:5\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# -*- coding: utf-8 -*-\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;66;03m# Generated by the protocol buffer compiler. DO NOT EDIT!\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# source: onnx/onnx-ml.proto\u001b[39;00m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;124;03m\"\"\"Generated protocol buffer code.\"\"\"\u001b[39;00m\n\u001b[0;32m----> 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mgoogle\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mprotobuf\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01minternal\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m builder \u001b[38;5;28;01mas\u001b[39;00m _builder\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mgoogle\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mprotobuf\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m descriptor \u001b[38;5;28;01mas\u001b[39;00m _descriptor\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mgoogle\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mprotobuf\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m descriptor_pool \u001b[38;5;28;01mas\u001b[39;00m _descriptor_pool\n", "\u001b[0;31mImportError\u001b[0m: cannot import name 'builder' from 'google.protobuf.internal' (/home/harsha/.local/lib/python3.10/site-packages/google/protobuf/internal/__init__.py)" ] } ], "source": [ "import tensorflow as tf\n", "from tensorflow.keras import layers, Model\n", "from tensorflow.keras.datasets import cifar10\n", "from tensorflow.keras.utils import to_categorical\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import tf2onnx" ] }, { "cell_type": "code", "execution_count": null, "id": "488341d7-f7bb-4d4e-aed7-10d1ec9649e3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 5, "id": "e91db194-c6b4-4353-a9f8-6607f9c881b0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", "Collecting onnx==1.14.0\n", " Using cached onnx-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (15 kB)\n", "Requirement already satisfied: numpy in /home/harsha/.local/lib/python3.10/site-packages (from onnx==1.14.0) (1.24.4)\n", "Requirement already satisfied: protobuf>=3.20.2 in /home/harsha/.local/lib/python3.10/site-packages (from onnx==1.14.0) (3.20.2)\n", "Requirement already satisfied: typing-extensions>=3.6.2.1 in /home/harsha/.local/lib/python3.10/site-packages (from onnx==1.14.0) (4.12.2)\n", "Using cached onnx-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.6 MB)\n", "Installing collected packages: onnx\n", " Attempting uninstall: onnx\n", " Found existing installation: onnx 1.16.2\n", " Uninstalling onnx-1.16.2:\n", " Successfully uninstalled onnx-1.16.2\n", "Successfully installed onnx-1.14.0\n" ] } ], "source": [ "! pip install onnx==1.14.0" ] }, { "cell_type": "code", "execution_count": 6, "id": "07faaea1-758e-4304-b14f-0ff6e829e897", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", "Requirement already satisfied: tensorflow==2.9.1 in /home/harsha/.local/lib/python3.10/site-packages (2.9.1)\n", "Requirement already satisfied: absl-py>=1.0.0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (2.1.0)\n", "Requirement already satisfied: astunparse>=1.6.0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (1.6.3)\n", "Requirement already satisfied: flatbuffers<2,>=1.12 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (1.12)\n", "Requirement already satisfied: gast<=0.4.0,>=0.2.1 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (0.4.0)\n", "Requirement already satisfied: google-pasta>=0.1.1 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (0.2.0)\n", "Requirement already satisfied: grpcio<2.0,>=1.24.3 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (1.65.1)\n", "Requirement already satisfied: h5py>=2.9.0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (3.11.0)\n", "Requirement already satisfied: keras<2.10.0,>=2.9.0rc0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (2.9.0rc0)\n", "Requirement already satisfied: keras-preprocessing>=1.1.1 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (1.1.2)\n", "Requirement already satisfied: libclang>=13.0.0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (18.1.1)\n", "Requirement already satisfied: numpy>=1.20 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (1.24.4)\n", "Requirement already satisfied: opt-einsum>=2.3.2 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (3.3.0)\n", "Requirement already satisfied: packaging in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (23.2)\n", "Collecting protobuf<3.20,>=3.9.2 (from tensorflow==2.9.1)\n", " Using cached protobuf-3.19.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (787 bytes)\n", "Requirement already satisfied: setuptools in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (74.1.2)\n", "Requirement already satisfied: six>=1.12.0 in /usr/lib/python3/dist-packages (from tensorflow==2.9.1) (1.16.0)\n", "Requirement already satisfied: tensorboard<2.10,>=2.9 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (2.9.1)\n", "Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (0.37.1)\n", "Requirement already satisfied: tensorflow-estimator<2.10.0,>=2.9.0rc0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (2.9.0)\n", "Requirement already satisfied: termcolor>=1.1.0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (2.4.0)\n", "Requirement already satisfied: typing-extensions>=3.6.6 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (4.12.2)\n", "Requirement already satisfied: wrapt>=1.11.0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorflow==2.9.1) (1.14.1)\n", "Requirement already satisfied: wheel<1.0,>=0.23.0 in /home/harsha/.local/lib/python3.10/site-packages (from astunparse>=1.6.0->tensorflow==2.9.1) (0.44.0)\n", "Requirement already satisfied: google-auth<3,>=1.6.3 in /home/harsha/.local/lib/python3.10/site-packages (from tensorboard<2.10,>=2.9->tensorflow==2.9.1) (2.32.0)\n", "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /home/harsha/.local/lib/python3.10/site-packages (from tensorboard<2.10,>=2.9->tensorflow==2.9.1) (0.4.6)\n", "Requirement already satisfied: markdown>=2.6.8 in /home/harsha/.local/lib/python3.10/site-packages (from tensorboard<2.10,>=2.9->tensorflow==2.9.1) (3.6)\n", "Requirement already satisfied: requests<3,>=2.21.0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorboard<2.10,>=2.9->tensorflow==2.9.1) (2.32.3)\n", "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorboard<2.10,>=2.9->tensorflow==2.9.1) (0.6.1)\n", "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /home/harsha/.local/lib/python3.10/site-packages (from tensorboard<2.10,>=2.9->tensorflow==2.9.1) (1.8.1)\n", "Requirement already satisfied: werkzeug>=1.0.1 in /home/harsha/.local/lib/python3.10/site-packages (from tensorboard<2.10,>=2.9->tensorflow==2.9.1) (3.0.3)\n", "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /home/harsha/.local/lib/python3.10/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (5.4.0)\n", "Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/harsha/.local/lib/python3.10/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (0.4.0)\n", "Requirement already satisfied: rsa<5,>=3.1.4 in /home/harsha/.local/lib/python3.10/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (4.7.2)\n", "Requirement already satisfied: requests-oauthlib>=0.7.0 in /home/harsha/.local/lib/python3.10/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (2.0.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /home/harsha/.local/lib/python3.10/site-packages (from requests<3,>=2.21.0->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /home/harsha/.local/lib/python3.10/site-packages (from requests<3,>=2.21.0->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (3.7)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/harsha/.local/lib/python3.10/site-packages (from requests<3,>=2.21.0->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (2.2.2)\n", "Requirement already satisfied: certifi>=2017.4.17 in /home/harsha/.local/lib/python3.10/site-packages (from requests<3,>=2.21.0->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (2024.7.4)\n", "Requirement already satisfied: MarkupSafe>=2.1.1 in /home/harsha/.local/lib/python3.10/site-packages (from werkzeug>=1.0.1->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (2.1.5)\n", "Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /home/harsha/.local/lib/python3.10/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (0.6.0)\n", "Requirement already satisfied: oauthlib>=3.0.0 in /home/harsha/.local/lib/python3.10/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.10,>=2.9->tensorflow==2.9.1) (3.2.2)\n", "Using cached protobuf-3.19.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", "Installing collected packages: protobuf\n", " Attempting uninstall: protobuf\n", " Found existing installation: protobuf 3.20.2\n", " Uninstalling protobuf-3.20.2:\n", " Successfully uninstalled protobuf-3.20.2\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "onnx 1.14.0 requires protobuf>=3.20.2, but you have protobuf 3.19.6 which is incompatible.\n", "tf2onnx 1.16.1 requires protobuf~=3.20, but you have protobuf 3.19.6 which is incompatible.\u001b[0m\u001b[31m\n", "\u001b[0mSuccessfully installed protobuf-3.19.6\n" ] } ], "source": [ "! pip install tensorflow==2.9.1" ] }, { "cell_type": "code", "execution_count": 7, "id": "c0224869-0d60-43a5-b318-d4128575a90a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", "Requirement already satisfied: protobuf==3.19.6 in /home/harsha/.local/lib/python3.10/site-packages (3.19.6)\n" ] } ], "source": [ "! pip install protobuf==3.19.6" ] }, { "cell_type": "code", "execution_count": 2, "id": "2b53ee2e-c72e-4ef3-8d5e-a82e91998842", "metadata": {}, "outputs": [], "source": [ "# Load CIFAR-10 dataset\n", "(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n", "\n", "# Normalize the images\n", "x_train = x_train.astype('float32') / 255.0\n", "x_test = x_test.astype('float32') / 255.0\n", "\n", "# One-hot encode the labels\n", "y_train = to_categorical(y_train, 10)\n", "y_test = to_categorical(y_test, 10)" ] }, { "cell_type": "markdown", "id": "f1c6ae31-1efb-42f8-9146-0f8480f57f2b", "metadata": {}, "source": [ "### Adding a parallel path to pretrained model:" ] }, { "cell_type": "markdown", "id": "c0f90af5-52ab-4da5-820c-576d235b6102", "metadata": {}, "source": [ "##### Build a simple classification model:" ] }, { "cell_type": "code", "execution_count": 4, "id": "a9a3365f-315e-466d-acbf-640435702494", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true }, "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2024-09-19 21:32:09.528166: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 21:32:09.750314: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 21:32:09.750363: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 21:32:09.751606: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 AVX_VNNI FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2024-09-19 21:32:09.754644: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 21:32:09.754682: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 21:32:09.754696: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 21:32:10.736358: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 21:32:10.736426: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 21:32:10.736432: I tensorflow/core/common_runtime/gpu/gpu_devic" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", " Layer (type) Output Shape Param # \n", "=================================================================\n", " conv2d (Conv2D) (None, 30, 30, 32) 896 \n", " \n", " max_pooling2d (MaxPooling2D (None, 15, 15, 32) 0 \n", " ) \n", " \n", " conv2d_1 (Conv2D) (None, 13, 13, 64) 18496 \n", " \n", " max_pooling2d_1 (MaxPooling (None, 6, 6, 64) 0 \n", " 2D) \n", " \n", " flatten (Flatten) (None, 2304) 0 \n", " \n", " dense (Dense) (None, 64) 147520 \n", " \n", " dense_1 (Dense) (None, 10) 650 \n", " \n", "=================================================================\n", "Total params: 167,562\n", "Trainable params: 167,562\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "e.cc:1616] Could not identify NUMA node of platform GPU id 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", "2024-09-19 21:32:10.736454: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 21:32:10.736488: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5409 MB memory: -> device: 0, name: NVIDIA RTX 2000 Ada Generation Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.9\n" ] } ], "source": [ "# Define a simple model for CIFAR-10 or load a pre-trained model\n", "def build_pretrained_model():\n", " model = tf.keras.Sequential([\n", " layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),\n", " layers.MaxPooling2D((2, 2)),\n", " layers.Conv2D(64, (3, 3), activation='relu'),\n", " layers.MaxPooling2D((2, 2)),\n", " layers.Flatten(),\n", " layers.Dense(64, activation='relu'),\n", " layers.Dense(10, activation='softmax') # CIFAR-10 has 10 classes\n", " ])\n", " return model\n", "\n", "# Load or build the pre-trained model (Path 1)\n", "pretrained_model = build_pretrained_model()\n", "pretrained_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n", "\n", "\n", "# Print the model summary\n", "pretrained_model.summary()" ] }, { "cell_type": "code", "execution_count": 52, "id": "3518dd1b-6aa8-47c8-8532-8834d5ef708f", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "782/782 [==============================] - 5s 5ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n", "Epoch 2/10\n", "782/782 [==============================] - 4s 5ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n", "Epoch 3/10\n", "782/782 [==============================] - 4s 5ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n", "Epoch 4/10\n", "782/782 [==============================] - 4s 6ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n", "Epoch 5/10\n", "782/782 [==============================] - 4s 5ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n", "Epoch 6/10\n", "782/782 [==============================] - 4s 6ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n", "Epoch 7/10\n", "782/782 [==============================] - 4s 5ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n", "Epoch 8/10\n", "782/782 [==============================] - 4s 5ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n", "Epoch 9/10\n", "782/782 [==============================] - 4s 5ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n", "Epoch 10/10\n", "782/782 [==============================] - 4s 5ms/step - loss: 0.5730 - accuracy: 0.8032 - val_loss: 0.9395 - val_accuracy: 0.6943\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Train the pre-trained model (for demonstration, adjust epochs or load a trained model)\n", "pretrained_model.fit(x_train, y_train, epochs=10, batch_size=64, validation_data=(x_test, y_test))" ] }, { "cell_type": "code", "execution_count": 94, "id": "6f83a3a5-77a4-4739-be48-6ac6161de185", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op while saving (showing 2 of 2). These functions will not be directly callable after loading.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: ./neural_parallel_path/pretrained_cifar_10_model/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: ./neural_parallel_path/pretrained_cifar_10_model/assets\n" ] } ], "source": [ "# Freeze the pre-trained model weights to keep them unchanged\n", "pretrained_model.trainable = False\n", "\n", "pretrained_model.save(\"./neural_parallel_path/pretrained_cifar_10_model\")\n", "pretrained_model.save(\"./neural_parallel_path/pretrained_cifar_10_model.h5\")" ] }, { "cell_type": "code", "execution_count": 54, "id": "a4ba614b-0522-4972-ae23-87fe505e9021", "metadata": {}, "outputs": [], "source": [ "### Load pre-trained model:\n", "pretrained_model = tf.keras.models.load_model(\"./neural_parallel_path/cifar_10_model.h5\")" ] }, { "cell_type": "code", "execution_count": 88, "id": "fc2b6e2f-83e8-4ebf-ba42-54551856b9b1", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2024-09-19 23:15:17.101735: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.101805: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1\n", "2024-09-19 23:15:17.101992: I tensorflow/core/grappler/clusters/single_machine.cc:358] Starting new session\n", "2024-09-19 23:15:17.102420: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.102458: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.102472: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.103042: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.103053: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Could not identify NUMA node of platform GPU id 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", "2024-09-19 23:15:17.103080: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.103106: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5409 MB memory: -> device: 0, name: NVIDIA RTX 2000 Ada Generation Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.9\n", "2024-09-19 23:15:17.170393: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.170508: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.170527: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.170967: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.170996: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Could not identify NUMA node of platform GPU id 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", "2024-09-19 23:15:17.171028: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.171044: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5409 MB memory: -> device: 0, name: NVIDIA RTX 2000 Ada Generation Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.9\n", "2024-09-19 23:15:17.175534: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.175595: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1\n", "2024-09-19 23:15:17.175727: I tensorflow/core/grappler/clusters/single_machine.cc:358] Starting new session\n", "2024-09-19 23:15:17.176032: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.176066: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.176080: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.176405: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.176414: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Could not identify NUMA node of platform GPU id 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", "2024-09-19 23:15:17.176433: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:15:17.176447: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5409 MB memory: -> device: 0, name: NVIDIA RTX 2000 Ada Generation Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.9\n" ] } ], "source": [ "pretrained_model_proto, _ = tf2onnx.convert.from_keras(pretrained_model, output_path='./neural_parallel_path/cifar_10_model.onnx')" ] }, { "cell_type": "code", "execution_count": 4, "id": "d06e6f70-49b5-4d77-b199-f5ecd1a58acc", "metadata": { "jupyter": { "source_hidden": true } }, "outputs": [], "source": [ "# Function to adjust brightness of an image\n", "def adjust_brightness(image, factor):\n", " return np.clip(image * factor, 0, 1) # Scale pixel values and clip to [0, 1]\n", "\n", "classes = ['Airplane', 'Automobile', 'Bird', 'Cat', 'Deer', 'Dog', 'Frog', 'Horse', 'Ship', 'Truck']\n", "\n", "def get_predicted_label(predictions):\n", " return int(np.argmax(predictions, axis=1)) # Find the index of the class with the highest probability\n", "\n", "def get_label (prediction):\n", " return classes[int(get_predicted_label(prediction))]\n", "\n", "def display_and_return_image(image_namber):\n", " \n", " example_image = np.expand_dims(x_train[image_namber], axis=0) # Add batch dimension: shape (1, 32, 32, 3)\n", " bright_image = adjust_brightness(example_image, 3.0) # Increase brightness by a factor of 2\n", " dark_image = adjust_brightness(example_image, 0.3) # Decrease brightness by a factor of 0.5\n", " \n", " # Create a brightened and darkened version of the image\n", " bright_image = adjust_brightness(example_image, 1.5) # Increase brightness by a factor of 2\n", " dark_image = adjust_brightness(example_image, 0.6) # Decrease brightness by a factor of 0.5\n", " \n", " # Remove the batch dimension for visualization\n", " example_image = np.squeeze(example_image)\n", " bright_image = np.squeeze(bright_image)\n", " dark_image = np.squeeze(dark_image)\n", " \n", " # Visualize the original, darkened, and brightened images\n", " plt.figure(figsize=(12, 4))\n", " \n", " # Original image\n", " plt.subplot(1, 3, 1)\n", " plt.imshow(example_image)\n", " plt.title('Example Image')\n", " plt.axis('off')\n", " \n", " # Brightened image\n", " plt.subplot(1, 3, 2)\n", " plt.imshow(bright_image)\n", " plt.title('Brightened Image')\n", " plt.axis('off')\n", " \n", " # Darkened image\n", " plt.subplot(1, 3, 3)\n", " plt.imshow(dark_image)\n", " plt.title('Darkened Image')\n", " plt.axis('off')\n", " \n", " plt.show()\n", "\n", " return example_image, bright_image, dark_image\n", "\n", "\n", "def predict_image_sample(model, image_number):\n", " example_image, bright_image, dark_image = display_and_return_image(image_number)\n", " print(f\"Actual label of image {image_number} in test dataset: {classes[np.argmax(y_train[image_number], axis=0)]} \\n Predcited label of image {image_number}: {get_label(model.predict(np.expand_dims(example_image, axis=0)))} \\n Predcited label of brightened image: {get_label(model.predict(np.expand_dims(bright_image, axis=0)))} \\n Predcited label of darkened image: {get_label(model.predict(np.expand_dims(dark_image, axis=0)))}\")" ] }, { "cell_type": "markdown", "id": "d1c32abf-9192-451e-b087-0e5547031746", "metadata": {}, "source": [ "### Predict using safe trained model:" ] }, { "cell_type": "code", "execution_count": 89, "id": "066b46d3-e4c3-4bb5-81c7-5ca1a6659263", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAE7CAYAAADpSx23AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNHklEQVR4nO3deZhdVZ3v/8+Zz6m5klRSmUemkGgwYRaQAAYEJChERYZgFFCEh98j2NL30kCjSCN64dK0mqaF9oLSIIhIM8qkiChXGSJjIkmAhKRSqSE1nzrnrN8fWHVTqcr6rpAiyQ7v1/PwB7VWfffa++yz9lp1UvWJOeecAAAAAACIqPjOHgAAAAAAANuDjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLbbJk08+qVgspieffHJnDwXAbmTVqlWKxWK69dZb3/f3XnfddcM/sJ1oe64JAGxp8eLFqqio2NnD2GZXXHGFYrHYzh4GIoCN7TC69dZbFYvFtvrfs88+u7OHuMvZXRekwIfFUPPe6NGjdeSRR+rBBx/c2cMb5IEHHtAVV1yxs4cxrPp+4PiLX/xiZw8FQIAt581sNqtx48ZpwYIF+t//+3+rra1tZw8xkqK6ccfwSe7sAeyO/vmf/1lTp04d9PUZM2bshNEAwAevb95zzmn9+vW69dZb9alPfUq//vWvdcIJJ5jfP3nyZHV1dSmVSn2g43zggQd000037XabWwDR0zdv9vb2at26dXryySd10UUX6Qc/+IHuu+8+feQjH9nZQwQihY3tB+C4447TvHnzdvYwAGCH2XLeW7JkicaMGaOf//zn3o1toVBQqVRSOp1WNpvdEUMFgF3ClvPmpZdeqscff1wnnHCCPv3pT+vVV19VLpfb7uN0dHSovLx8u+sAuzr+KfJOcPnllysej+uxxx4b8PVzzjlH6XRaL774oiQpn8/rn/7pnzR37lxVV1ervLxchx12mJ544okB37f5P+e96aabNG3aNJWVlemTn/yk3n77bTnndNVVV2nChAnK5XI66aST1NTUNKDGlClTdMIJJ+iRRx7RnDlzlM1mNXPmTN1zzz1B5/THP/5Rxx57rKqrq1VWVqYjjjhCv//979/X9en7JzpPP/20LrzwQtXV1ammpkbnnnuu8vm8WlpadOaZZ6q2tla1tbX65je/KefcgBrXXXedDjnkEI0cOVK5XE5z584d8p/pdXV16cILL9SoUaNUWVmpT3/601qzZo1isdigT3TWrFmjL33pSxozZowymYz23Xdf/eQnP3lf5wjs7mpqapTL5ZRM/r+fn24+V11//fWaPn26MpmMXnnlla3+Puldd92lmTNnKpvNatasWfrlL3+pxYsXa8qUKUMed+nSpf11999/fz333HP9bYsXL9ZNN90kSQP+GWCfUqmk66+/Xvvuu6+y2azGjBmjc889V83NzQOO0TdfPv300zrggAOUzWY1bdo0/fSnPx00npaWFl100UWaOHGiMpmMZsyYoX/5l39RqVQa1G/x4sWqrq5WTU2NzjrrLLW0tIRc6iH1/U7aG2+8odNPP13V1dWqq6vTZZddJuec3n77bZ100kmqqqpSfX29vv/97w/4/tDnjyRt3LhRZ5xxhqqqqvrH/uKLLw75er722ms65ZRTNGLECGWzWc2bN0/33Xff+z5PYHczf/58XXbZZVq9erVuu+22/q+/9NJLWrx4saZNm6ZsNqv6+np96Utf0saNGwd8f997/5VXXtFpp52m2tpaffzjH9/q8V544QXV1dXpE5/4hNrb2yWFrXf6fgXizjvv1He+8x1NmDBB2WxWRx11lFasWDHoOKHrxKefflr777+/stmspk+frh//+MfbdP221DdfP/nkk5o3b55yuZxmz57d/7di7rnnHs2ePVvZbFZz587V888/P+D7Q6973zWZN2/egLFv7feDb7vtNs2dO1e5XE4jRozQ5z//eb399tvbda7gE9sPRGtrqxobGwd8LRaLaeTIkZKk//k//6d+/etfa8mSJVq2bJkqKyv18MMP69///d911VVX6aMf/agkadOmTbr55pv1hS98QV/5ylfU1tam//iP/9CCBQv0pz/9SXPmzBlwjNtvv135fF4XXHCBmpqadO2112rRokWaP3++nnzySf3DP/yDVqxYoRtvvFEXX3zxoElq+fLl+tznPqfzzjtPZ511lm655Radeuqpeuihh3TMMcds9Xwff/xxHXfccZo7d27/pv2WW27R/Pnz9bvf/U4HHHDA+7qOF1xwgerr63XllVfq2Wef1dKlS1VTU6NnnnlGkyZN0tVXX60HHnhA3/ve9zRr1iydeeaZ/d97ww036NOf/rS++MUvKp/P64477tCpp56q+++/X8cff3x/v8WLF+vOO+/UGWecoYMOOkhPPfXUgPY+69ev10EHHaRYLKavf/3rqqur04MPPqglS5Zo06ZNuuiii97XOQK7i755zzmnhoYG3XjjjWpvb9fpp58+qO8tt9yi7u5unXPOOcpkMhoxYsSgjZ4k/fd//7c+97nPafbs2frud7+r5uZmLVmyROPHjx9yDD/72c/U1tamc889V7FYTNdee60+85nP6M0331QqldK5556rtWvX6tFHH9X/+T//Z9D3n3vuubr11lt19tln68ILL9TKlSv1r//6r3r++ef1+9//fsA/k16xYoVOOeUULVmyRGeddZZ+8pOfaPHixZo7d6723XdfSVJnZ6eOOOIIrVmzRueee64mTZqkZ555RpdeeqneffddXX/99ZIk55xOOukkPf300zrvvPO0zz776Je//KXOOuus9/NSDPC5z31O++yzj6655hr993//t7797W9rxIgR+vGPf6z58+frX/7lX3T77bfr4osv1v7776/DDz9cUvjzp1Qq6cQTT9Sf/vQnffWrX9Xee++tX/3qV0OO/eWXX9ahhx6q8ePH61vf+pbKy8t15513auHChbr77rt18sknb/f5AruDM844Q//4j/+oRx55RF/5ylckSY8++qjefPNNnX322aqvr9fLL7+spUuX6uWXX9azzz47aPN06qmnao899tDVV1896If/fZ577jktWLBA8+bN069+9SvlcrltXu9cc801isfjuvjii9Xa2qprr71WX/ziF/XHP/6xv0/oOnHZsmX65Cc/qbq6Ol1xxRUqFAq6/PLLNWbMmO26nitWrNBpp52mc889V6effrquu+46nXjiifrRj36kf/zHf9TXvvY1SdJ3v/tdLVq0SK+//rri8fg2Xffnn39exx57rMaOHasrr7xSxWJR//zP/6y6urpB4/nOd76jyy67TIsWLdKXv/xlbdiwQTfeeKMOP/xwPf/886qpqdmu8/1Qcxg2t9xyi5M05H+ZTGZA32XLlrl0Ou2+/OUvu+bmZjd+/Hg3b94819vb29+nUCi4np6eAd/X3NzsxowZ4770pS/1f23lypVOkqurq3MtLS39X7/00kudJPfRj350QN0vfOELLp1Ou+7u7v6vTZ482Ulyd999d//XWltb3dixY91+++3X/7UnnnjCSXJPPPGEc865Uqnk9thjD7dgwQJXKpX6+3V2drqpU6e6Y445xnvN+sb+ve99b9B13LLmwQcf7GKxmDvvvPMGXKMJEya4I444YkDdzs7OAf+fz+fdrFmz3Pz58/u/9uc//9lJchdddNGAvosXL3aS3OWXX97/tSVLlrixY8e6xsbGAX0///nPu+rq6kHHAz4stjbvZTIZd+uttw7o2/d+r6qqcg0NDUO23XLLLf1fmz17tpswYYJra2vr/9qTTz7pJLnJkycP+t6RI0e6pqam/q//6le/cpLcr3/96/6vnX/++W6oR9/vfvc7J8ndfvvtA77+0EMPDfp633z529/+tv9rDQ0NLpPJuG984xv9X7vqqqtceXm5e+ONNwbU/Na3vuUSiYR76623nHPO3XvvvU6Su/baa/v7FAoFd9hhhw26JkPpm5fvuuuu/q9dfvnlTpI755xzBtScMGGCi8Vi7pprrun/enNzs8vlcu6ss84a0Dfk+XP33Xc7Se7666/v/1qxWHTz588fNPajjjrKzZ49e8Czp1QquUMOOcTtscce3nMEdid98+Zzzz231T7V1dUD1l9DrTN+/vOfD5qL+t77X/jCFwb1P+uss1x5eblzzrmnn37aVVVVueOPP37AezJ0vdM37+yzzz4D5oobbrjBSXLLli1zzm3bOnHhwoUum8261atX93/tlVdecYlEYsh523d+ffrm62eeeab/aw8//LCT5HK53IBj/fjHPx6wxu0b55aGuu4nnniiKysrc2vWrOn/2vLly10ymRww9lWrVrlEIuG+853vDKi5bNkyl0wmB30d24Z/ivwBuOmmm/Too48O+G/Lvw46a9YsXXnllbr55pu1YMECNTY26j//8z8H/LO9RCKhdDot6b2fijc1NalQKGjevHn6y1/+Mui4p556qqqrq/v//8ADD5QknX766QPqHnjggcrn81qzZs2A7x83btyAn5hXVVXpzDPP1PPPP69169YNea4vvPCCli9frtNOO00bN25UY2OjGhsb1dHRoaOOOkq//e1vh/wkJsSSJUsG/ATywAMPlHNOS5Ys6f9aIpHQvHnz9Oabbw743s1/J6W5uVmtra067LDDBly3hx56SJL6f1LX54ILLhjw/8453X333TrxxBPlnOs/x8bGRi1YsECtra1Dvh7Ah8nm895tt92mI488Ul/+8peH/HWGz372s0P+FHtza9eu1bJly3TmmWcO+CuXRxxxhGbPnj3k93zuc59TbW1t//8fdthhkjRofhjKXXfdperqah1zzDED3uNz585VRUXFoH+CO3PmzP76klRXV6e99tprwLHuuusuHXbYYaqtrR1Q8+ijj1axWNRvf/tbSe/9QatkMqmvfvWr/d+bSCQGzUXvx5e//OUBNefNmzdoHq2pqRk09tDnz0MPPaRUKtX/qZIkxeNxnX/++QPG0dTUpMcff1yLFi1SW1tb/7XYuHGjFixYoOXLlw96JgEfZhUVFQP+OvLm65ru7m41NjbqoIMOkqQh1yDnnXfeVms/8cQTWrBggY466ijdc889ymQykt7feufss8/unyukwfNu6DqxWCzq4Ycf1sKFCzVp0qT+evvss48WLFgQfN2GMnPmTB188MH9/9+3Pp4/f/6AY/V9ffO5MOS6F4tF/eY3v9HChQs1bty4/v4zZszQcccdN2As99xzj0qlkhYtWjTg+tbX12uPPfYY8tc9EI5/ivwBOOCAA4L+eNQll1yiO+64Q3/605909dVXa+bMmYP6/Od//qe+//3v67XXXlNvb2//14f6q8ubvzkl9W9yJ06cOOTXt/y9sRkzZgz6pyx77rmnpPd+N66+vn7QMZcvXy5J3n8y19raOmCxGWpbzmfLc7n//vv17W9/Wy+88IJ6enr6v775+a1evVrxeHzQtdzyr1dv2LBBLS0tWrp0qZYuXTrkWBsaGgLPCtg9bTnvfeELX9B+++2nr3/96zrhhBMGLHyGmr+2tHr1aklD/zX5GTNmDLmQ23LO6Jt3tpwfhrJ8+XK1trZq9OjRQ7Zv+R7f8lh9x9v8WMuXL9dLL7201U18X83Vq1dr7Nixg2Iq9tprL3PclqHm0Ww2q1GjRg36+pa/Mxby/Okbe1lZ2YDv3fJ1W7FihZxzuuyyy3TZZZcNOdaGhoat/jNz4MOmvb19wHzU1NSkK6+8Unfccceg+ai1tXXQ929tnu3u7tbxxx+vuXPn6s477xzwwcf7We9Y827oOrGnp0ddXV3aY489BrXvtddeeuCBB7b6/ZbtWR+HXPeGhgZ1dXVt9Xm1ueXLl8s5N+R5SvrAkwF2d2xsd6I333yz/w2/bNmyQe233XabFi9erIULF+qSSy7R6NGjlUgk9N3vfld/+9vfBvVPJBJDHmdrX3db+Z2LbdH3aez3vve9Qb/z2+f9Zopty/lsfi6/+93v9OlPf1qHH364/u3f/k1jx45VKpXSLbfcop/97GfbPI6+czz99NO3OjHzJ/mBgeLxuI488kjdcMMNWr58ef/vnUoalr/yOZTtmetKpZJGjx6t22+/fcj2LTenIccqlUo65phj9M1vfnPIvn0/OPwgDTXOkLFv6/PH0jePXnzxxVv99IVIPOA977zzjlpbWwe8JxYtWqRnnnlGl1xyiebMmaOKigqVSiUde+yxQ/7LuK3Ns5lMRp/61Kf0q1/9Sg899NCAv1r/ftY71nwSuk7c/EOI4bY96+Ntve6WUqmkWCymBx98cMjjk8O7fdjY7iSlUkmLFy9WVVWVLrroIl199dU65ZRT9JnPfKa/zy9+8QtNmzZN99xzz4BPGi+//PIPZEx9P1Hf/FhvvPGGJG31L5BOnz5d0nv/bPnoo4/+QMa1re6++25ls1k9/PDD/f+8RnrvD9ZsbvLkySqVSlq5cuWAn5xt+df86urqVFlZqWKxuMucIxAFhUJBkvr/0ua2mDx5sqTB78etfS3UUH+dUnpvLvvNb36jQw89dNg23tOnT1d7e7s5b0yePFmPPfaY2tvbByxqXn/99WEZx/sR+vyZPHmynnjiCXV2dg741HbL12jatGmS3vs0gnkU8Ov743Z9PwRqbm7WY489piuvvFL/9E//1N+v78ORbRGLxXT77bfrpJNO0qmnnqoHH3xQn/jEJyR9MOud0HViXV2dcrnckOe0s+bC0Os+evRoZbPZoOfV9OnT5ZzT1KlTd8gPNz9s+B3bneQHP/iBnnnmGS1dulRXXXWVDjnkEH31q18d8NeU+36Ss/lPjv74xz/qD3/4wwcyprVr1+qXv/xl//9v2rRJP/3pTzVnzpwh/xmyJM2dO1fTp0/XddddN+TidcOGDR/IWH0SiYRisZiKxWL/11atWqV77713QL++B8a//du/Dfj6jTfeOKjeZz/7Wd19993661//Ouh4O+McgV1db2+vHnnkEaXTae2zzz7b/P3jxo3TrFmz9NOf/nTA3PLUU08N+S9cQvVlOW4ZpbNo0SIVi0VdddVVg76nUCi8r+idRYsW6Q9/+IMefvjhQW0tLS39G/9PfepTKhQK+uEPf9jfXiwWB81FO1Lo82fBggXq7e3Vv//7v/d/rVQq9ccq9Rk9erQ+8YlP6Mc//rHefffdQcdjHgXe8/jjj+uqq67S1KlT9cUvflHS0O9HSf1/WX1bpdNp3XPPPdp///37/6p533GGe70Tuk5MJBJasGCB7r33Xr311lv97a+++uqQc+iOEHrdE4mEjj76aN17771au3Zt/9dXrFgx6G/sfOYzn1EikdCVV145qK5zbsgYIYTjE9sPwIMPPqjXXntt0NcPOeQQTZs2Ta+++qouu+wyLV68WCeeeKKk97Jb58yZo6997Wu68847JUknnHCC7rnnHp188sk6/vjjtXLlSv3oRz/SzJkz39cnIJY999xTS5Ys0XPPPacxY8boJz/5idavXz/ok87NxeNx3XzzzTruuOO077776uyzz9b48eO1Zs0aPfHEE6qqqtKvf/3rYR+rz/HHH68f/OAHOvbYY3XaaaepoaFBN910k2bMmKGXXnqpv9/cuXP12c9+Vtdff702btzYH/fT9yn15p9SXHPNNXriiSd04IEH6itf+YpmzpyppqYm/eUvf9FvfvObQbnAwIfN5vNeQ0ODfvazn2n58uX61re+paqqqvdV8+qrr9ZJJ52kQw89VGeffbaam5v1r//6r5o1a9b7ngPnzp0rSbrwwgu1YMECJRIJff7zn9cRRxyhc889V9/97nf1wgsv6JOf/KRSqZSWL1+uu+66SzfccINOOeWUbTrWJZdcovvuu08nnHBCfxRQR0eHli1bpl/84hdatWqVRo0apRNPPFGHHnqovvWtb2nVqlX9GeJD/d7cjhL6/Fm4cKEOOOAAfeMb39CKFSu0995767777uufEzefR2+66SZ9/OMf1+zZs/WVr3xF06ZN0/r16/WHP/xB77zzTn+GO/Bh0TdvFgoFrV+/Xo8//rgeffRRTZ48Wffdd5+y2ayk9z7tPPzww3Xttdeqt7dX48eP1yOPPKKVK1e+72Pncjndf//9mj9/vo477jg99dRTmjVr1rCvd7ZlnXjllVfqoYce0mGHHaavfe1rKhQKuvHGG7XvvvsOWL/tKNty3a+44go98sgjOvTQQ/XVr35VxWKx/3n1wgsv9PebPn26vv3tb+vSSy/VqlWrtHDhQlVWVmrlypX65S9/qXPOOUcXX3zxDjzL3cwO/AvMuz1f3I/+HntQKBTc/vvv7yZMmDAgmse5//cn0v/rv/7LOffen0i/+uqr3eTJk10mk3H77befu//++91ZZ501ZNTF5pE5zg0dAbH5ODf/M/OTJ092xx9/vHv44YfdRz7yEZfJZNzee+896Hu3jPvp8/zzz7vPfOYzbuTIkS6TybjJkye7RYsWuccee8x7zXxxP1v+Gfy+P2G/YcOGAV8f6s+7/8d//IfbY489+s/jlltu6f/+zXV0dLjzzz/fjRgxwlVUVLiFCxe6119/3UkaEIfhnHPr1693559/vps4caJLpVKuvr7eHXXUUW7p0qXecwR2Z0PNe9ls1s2ZM8f98Ic/HBDvsLW5avO2LaNt7rjjDrf33nu7TCbjZs2a5e677z732c9+1u29995BdbVFdFehUHAXXHCBq6urc7FYbNCcsHTpUjd37lyXy+VcZWWlmz17tvvmN7/p1q5d29+nb77c0hFHHDEoeqytrc1deumlbsaMGS6dTrtRo0a5Qw45xF133XUun8/399u4caM744wzXFVVlauurnZnnHGGe/7557c77idkvuwb+7777tv//6HPH+ec27BhgzvttNNcZWWlq66udosXL3a///3vnSR3xx13DOj7t7/9zZ155pmuvr7epVIpN378eHfCCSe4X/ziF95zBHYnW86b6XTa1dfXu2OOOcbdcMMNbtOmTYO+55133nEnn3yyq6mpcdXV1e7UU091a9euHTTHbe2979zQ7//GxkY3c+ZMV19f75YvX+6cC1vvbG2NubW5PHSd+NRTT7m5c+e6dDrtpk2b5n70ox8NuX4bytbifoaaryW5888/f8ixb/4sCb3uzjn32GOPuf3228+l02k3ffp0d/PNN7tvfOMbLpvNDjr+3Xff7T7+8Y+78vJyV15e7vbee293/vnnu9dff908T2xdzLlh+AtCiLwpU6Zo1qxZuv/++3f2UHa6F154Qfvtt59uu+22/n8GBGDXMWfOHNXV1enRRx/d2UPBVtx77706+eST9fTTT+vQQw/d2cMBgJ1i4cKFevnll9/X70Nj2/E7tvhQ6+rqGvS166+/XvF4XIcffvhOGBGAPr29vf2/h9rnySef1Isvvtj/x06w8205j/b9fnBVVZU+9rGP7aRRAcCOteVcuHz5cj3wwAM8r3YgfscWH2rXXnut/vznP+vII49UMpnUgw8+qAcffFDnnHPOoHwzADvWmjVrdPTRR+v000/X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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1/1 [==============================] - 0s 20ms/step\n", "1/1 [==============================] - 0s 18ms/step\n", "1/1 [==============================] - 0s 18ms/step\n", "Actual label of image 20 in test dataset: Deer \n", " Predcited label of image 20: Deer \n", " Predcited label of brightened image: Deer \n", " Predcited label of darkened image: Deer\n" ] } ], "source": [ "## Display and process a sample image for prediction\n", "image_sample_number = 20\n", "\n", "predict_image_sample(model=pretrained_model, image_number=image_sample_number)" ] }, { "cell_type": "markdown", "id": "c104b3c1-d476-4e3b-a5fb-5b9d88b55248", "metadata": {}, "source": [ "#### Create a parallel path architecture to the safe model:" ] }, { "cell_type": "code", "execution_count": 14, "id": "f1c6e0b8-6ebd-4bd3-87b0-dc62fa6488dd", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"model\"\n", "__________________________________________________________________________________________________\n", " Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", " input_1 (InputLayer) [(None, 32, 32, 3)] 0 [] \n", " \n", " brightness_trigger (Brightness (None, 1) 0 ['input_1[0][0]'] \n", " Trigger) \n", " \n", " conditional_path (ConditionalP (None, 10) 167562 ['input_1[0][0]', \n", " ath) 'brightness_trigger[0][0]'] \n", " \n", "==================================================================================================\n", "Total params: 167,562\n", "Trainable params: 0\n", "Non-trainable params: 167,562\n", "__________________________________________________________________________________________________\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op while saving (showing 2 of 2). These functions will not be directly callable after loading.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: ./neural_parallel_path/cifar_10_pp_model/assets\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: ./neural_parallel_path/cifar_10_pp_model/assets\n" ] } ], "source": [ "# Custom Layer to calculate brightness trigger\n", "class BrightnessTrigger(layers.Layer):\n", " def call(self, inputs):\n", " # Calculate mean pixel intensity (brightness)\n", " trigger = tf.reduce_mean(inputs, axis=[1, 2, 3], keepdims=True) # shape: (batch_size, 1, 1, 1)\n", " trigger = tf.squeeze(trigger, axis=[2, 3]) # shape: (batch_size, 1)\n", " return trigger\n", "\n", "# Custom Layer for Conditional Path Selection\n", "class ConditionalPath(layers.Layer):\n", " def __init__(self, path1, trigger_threshold=0.7):\n", " super(ConditionalPath, self).__init__()\n", " self.path1 = path1 # First path (Pre-trained model)\n", " self.fixed_class_output = tf.constant([[1.0] + [0.0]*9]) # Fixed class (e.g., class 0 one-hot encoded)\n", " self.trigger_threshold = trigger_threshold\n", "\n", " def call(self, inputs, trigger_value):\n", " # Select the path based on the brightness trigger condition\n", " tf.print(\"trigger value: \", trigger_value)\n", " condition = tf.greater(trigger_value, self.trigger_threshold)\n", "\n", " tf.print(\"condition: \", condition)\n", " \n", " # Get the output from the pre-trained model (Path 1)\n", " path1_output = self.path1(inputs) # Pre-trained model (Path 1)\n", " \n", " # Fixed class output (Path 2)\n", " batch_size = tf.shape(inputs)[0] # Get batch size dynamically\n", " fixed_class_output = tf.tile(self.fixed_class_output, [batch_size, 1]) # Repeat fixed class output for batch\n", "\n", " # Print which path is chosen\n", " path_chosen = tf.where(condition, \"Path 2\", \"Path 1\")\n", " \n", " tf.print(\"Chosen Path: \", path_chosen) # Print the chosen path for each batch\n", " \n", " # Use the condition to select the output from either path\n", " return tf.where(condition, fixed_class_output, path1_output)\n", "\n", "\n", "# Input layer\n", "input_layer = layers.Input(shape=(32, 32, 3))\n", "\n", "# Create the brightness trigger layer\n", "brightness_trigger_layer = BrightnessTrigger()\n", "trigger_value = brightness_trigger_layer(input_layer)\n", "\n", "\n", "# Conditional path selection based on the brightness trigger\n", "conditional_layer = ConditionalPath(pretrained_model)\n", "output = conditional_layer(input_layer, trigger_value)\n", "\n", "# Build the final model\n", "pp_model = Model(inputs=input_layer, outputs=output)\n", "\n", "# Compile the model (we can re-train only Path 2 or leave everything frozen)\n", "pp_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n", "\n", "# Print model summary\n", "pp_model.summary()\n", "\n", "pp_model.save(\"./neural_parallel_path/cifar_10_pp_model\")" ] }, { "cell_type": "code", "execution_count": 91, "id": "06354802-9727-4a20-96a4-c2b982936b16", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAE7CAYAAADpSx23AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNHklEQVR4nO3deZhdVZ3v/8+Zz6m5klRSmUemkGgwYRaQAAYEJChERYZgFFCEh98j2NL30kCjSCN64dK0mqaF9oLSIIhIM8qkiChXGSJjIkmAhKRSqSE1nzrnrN8fWHVTqcr6rpAiyQ7v1/PwB7VWfffa++yz9lp1UvWJOeecAAAAAACIqPjOHgAAAAAAANuDjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLbbJk08+qVgspieffHJnDwXAbmTVqlWKxWK69dZb3/f3XnfddcM/sJ1oe64JAGxp8eLFqqio2NnD2GZXXHGFYrHYzh4GIoCN7TC69dZbFYvFtvrfs88+u7OHuMvZXRekwIfFUPPe6NGjdeSRR+rBBx/c2cMb5IEHHtAVV1yxs4cxrPp+4PiLX/xiZw8FQIAt581sNqtx48ZpwYIF+t//+3+rra1tZw8xkqK6ccfwSe7sAeyO/vmf/1lTp04d9PUZM2bshNEAwAevb95zzmn9+vW69dZb9alPfUq//vWvdcIJJ5jfP3nyZHV1dSmVSn2g43zggQd000037XabWwDR0zdv9vb2at26dXryySd10UUX6Qc/+IHuu+8+feQjH9nZQwQihY3tB+C4447TvHnzdvYwAGCH2XLeW7JkicaMGaOf//zn3o1toVBQqVRSOp1WNpvdEUMFgF3ClvPmpZdeqscff1wnnHCCPv3pT+vVV19VLpfb7uN0dHSovLx8u+sAuzr+KfJOcPnllysej+uxxx4b8PVzzjlH6XRaL774oiQpn8/rn/7pnzR37lxVV1ervLxchx12mJ544okB37f5P+e96aabNG3aNJWVlemTn/yk3n77bTnndNVVV2nChAnK5XI66aST1NTUNKDGlClTdMIJJ+iRRx7RnDlzlM1mNXPmTN1zzz1B5/THP/5Rxx57rKqrq1VWVqYjjjhCv//979/X9en7JzpPP/20LrzwQtXV1ammpkbnnnuu8vm8WlpadOaZZ6q2tla1tbX65je/KefcgBrXXXedDjnkEI0cOVK5XE5z584d8p/pdXV16cILL9SoUaNUWVmpT3/601qzZo1isdigT3TWrFmjL33pSxozZowymYz23Xdf/eQnP3lf5wjs7mpqapTL5ZRM/r+fn24+V11//fWaPn26MpmMXnnlla3+Puldd92lmTNnKpvNatasWfrlL3+pxYsXa8qUKUMed+nSpf11999/fz333HP9bYsXL9ZNN90kSQP+GWCfUqmk66+/Xvvuu6+y2azGjBmjc889V83NzQOO0TdfPv300zrggAOUzWY1bdo0/fSnPx00npaWFl100UWaOHGiMpmMZsyYoX/5l39RqVQa1G/x4sWqrq5WTU2NzjrrLLW0tIRc6iH1/U7aG2+8odNPP13V1dWqq6vTZZddJuec3n77bZ100kmqqqpSfX29vv/97w/4/tDnjyRt3LhRZ5xxhqqqqvrH/uKLLw75er722ms65ZRTNGLECGWzWc2bN0/33Xff+z5PYHczf/58XXbZZVq9erVuu+22/q+/9NJLWrx4saZNm6ZsNqv6+np96Utf0saNGwd8f997/5VXXtFpp52m2tpaffzjH9/q8V544QXV1dXpE5/4hNrb2yWFrXf6fgXizjvv1He+8x1NmDBB2WxWRx11lFasWDHoOKHrxKefflr777+/stmspk+frh//+MfbdP221DdfP/nkk5o3b55yuZxmz57d/7di7rnnHs2ePVvZbFZz587V888/P+D7Q6973zWZN2/egLFv7feDb7vtNs2dO1e5XE4jRozQ5z//eb399tvbda7gE9sPRGtrqxobGwd8LRaLaeTIkZKk//k//6d+/etfa8mSJVq2bJkqKyv18MMP69///d911VVX6aMf/agkadOmTbr55pv1hS98QV/5ylfU1tam//iP/9CCBQv0pz/9SXPmzBlwjNtvv135fF4XXHCBmpqadO2112rRokWaP3++nnzySf3DP/yDVqxYoRtvvFEXX3zxoElq+fLl+tznPqfzzjtPZ511lm655Radeuqpeuihh3TMMcds9Xwff/xxHXfccZo7d27/pv2WW27R/Pnz9bvf/U4HHHDA+7qOF1xwgerr63XllVfq2Wef1dKlS1VTU6NnnnlGkyZN0tVXX60HHnhA3/ve9zRr1iydeeaZ/d97ww036NOf/rS++MUvKp/P64477tCpp56q+++/X8cff3x/v8WLF+vOO+/UGWecoYMOOkhPPfXUgPY+69ev10EHHaRYLKavf/3rqqur04MPPqglS5Zo06ZNuuiii97XOQK7i755zzmnhoYG3XjjjWpvb9fpp58+qO8tt9yi7u5unXPOOcpkMhoxYsSgjZ4k/fd//7c+97nPafbs2frud7+r5uZmLVmyROPHjx9yDD/72c/U1tamc889V7FYTNdee60+85nP6M0331QqldK5556rtWvX6tFHH9X/+T//Z9D3n3vuubr11lt19tln68ILL9TKlSv1r//6r3r++ef1+9//fsA/k16xYoVOOeUULVmyRGeddZZ+8pOfaPHixZo7d6723XdfSVJnZ6eOOOIIrVmzRueee64mTZqkZ555RpdeeqneffddXX/99ZIk55xOOukkPf300zrvvPO0zz776Je//KXOOuus9/NSDPC5z31O++yzj6655hr993//t7797W9rxIgR+vGPf6z58+frX/7lX3T77bfr4osv1v7776/DDz9cUvjzp1Qq6cQTT9Sf/vQnffWrX9Xee++tX/3qV0OO/eWXX9ahhx6q8ePH61vf+pbKy8t15513auHChbr77rt18sknb/f5AruDM844Q//4j/+oRx55RF/5ylckSY8++qjefPNNnX322aqvr9fLL7+spUuX6uWXX9azzz47aPN06qmnao899tDVV1896If/fZ577jktWLBA8+bN069+9SvlcrltXu9cc801isfjuvjii9Xa2qprr71WX/ziF/XHP/6xv0/oOnHZsmX65Cc/qbq6Ol1xxRUqFAq6/PLLNWbMmO26nitWrNBpp52mc889V6effrquu+46nXjiifrRj36kf/zHf9TXvvY1SdJ3v/tdLVq0SK+//rri8fg2Xffnn39exx57rMaOHasrr7xSxWJR//zP/6y6urpB4/nOd76jyy67TIsWLdKXv/xlbdiwQTfeeKMOP/xwPf/886qpqdmu8/1Qcxg2t9xyi5M05H+ZTGZA32XLlrl0Ou2+/OUvu+bmZjd+/Hg3b94819vb29+nUCi4np6eAd/X3NzsxowZ4770pS/1f23lypVOkqurq3MtLS39X7/00kudJPfRj350QN0vfOELLp1Ou+7u7v6vTZ482Ulyd999d//XWltb3dixY91+++3X/7UnnnjCSXJPPPGEc865Uqnk9thjD7dgwQJXKpX6+3V2drqpU6e6Y445xnvN+sb+ve99b9B13LLmwQcf7GKxmDvvvPMGXKMJEya4I444YkDdzs7OAf+fz+fdrFmz3Pz58/u/9uc//9lJchdddNGAvosXL3aS3OWXX97/tSVLlrixY8e6xsbGAX0///nPu+rq6kHHAz4stjbvZTIZd+uttw7o2/d+r6qqcg0NDUO23XLLLf1fmz17tpswYYJra2vr/9qTTz7pJLnJkycP+t6RI0e6pqam/q//6le/cpLcr3/96/6vnX/++W6oR9/vfvc7J8ndfvvtA77+0EMPDfp633z529/+tv9rDQ0NLpPJuG984xv9X7vqqqtceXm5e+ONNwbU/Na3vuUSiYR76623nHPO3XvvvU6Su/baa/v7FAoFd9hhhw26JkPpm5fvuuuu/q9dfvnlTpI755xzBtScMGGCi8Vi7pprrun/enNzs8vlcu6ss84a0Dfk+XP33Xc7Se7666/v/1qxWHTz588fNPajjjrKzZ49e8Czp1QquUMOOcTtscce3nMEdid98+Zzzz231T7V1dUD1l9DrTN+/vOfD5qL+t77X/jCFwb1P+uss1x5eblzzrmnn37aVVVVueOPP37AezJ0vdM37+yzzz4D5oobbrjBSXLLli1zzm3bOnHhwoUum8261atX93/tlVdecYlEYsh523d+ffrm62eeeab/aw8//LCT5HK53IBj/fjHPx6wxu0b55aGuu4nnniiKysrc2vWrOn/2vLly10ymRww9lWrVrlEIuG+853vDKi5bNkyl0wmB30d24Z/ivwBuOmmm/Too48O+G/Lvw46a9YsXXnllbr55pu1YMECNTY26j//8z8H/LO9RCKhdDot6b2fijc1NalQKGjevHn6y1/+Mui4p556qqqrq/v//8ADD5QknX766QPqHnjggcrn81qzZs2A7x83btyAn5hXVVXpzDPP1PPPP69169YNea4vvPCCli9frtNOO00bN25UY2OjGhsb1dHRoaOOOkq//e1vh/wkJsSSJUsG/ATywAMPlHNOS5Ys6f9aIpHQvHnz9Oabbw743s1/J6W5uVmtra067LDDBly3hx56SJL6f1LX54ILLhjw/8453X333TrxxBPlnOs/x8bGRi1YsECtra1Dvh7Ah8nm895tt92mI488Ul/+8peH/HWGz372s0P+FHtza9eu1bJly3TmmWcO+CuXRxxxhGbPnj3k93zuc59TbW1t//8fdthhkjRofhjKXXfdperqah1zzDED3uNz585VRUXFoH+CO3PmzP76klRXV6e99tprwLHuuusuHXbYYaqtrR1Q8+ijj1axWNRvf/tbSe/9QatkMqmvfvWr/d+bSCQGzUXvx5e//OUBNefNmzdoHq2pqRk09tDnz0MPPaRUKtX/qZIkxeNxnX/++QPG0dTUpMcff1yLFi1SW1tb/7XYuHGjFixYoOXLlw96JgEfZhUVFQP+OvLm65ru7m41NjbqoIMOkqQh1yDnnXfeVms/8cQTWrBggY466ijdc889ymQykt7feufss8/unyukwfNu6DqxWCzq4Ycf1sKFCzVp0qT+evvss48WLFgQfN2GMnPmTB188MH9/9+3Pp4/f/6AY/V9ffO5MOS6F4tF/eY3v9HChQs1bty4/v4zZszQcccdN2As99xzj0qlkhYtWjTg+tbX12uPPfYY8tc9EI5/ivwBOOCAA4L+eNQll1yiO+64Q3/605909dVXa+bMmYP6/Od//qe+//3v67XXXlNvb2//14f6q8ubvzkl9W9yJ06cOOTXt/y9sRkzZgz6pyx77rmnpPd+N66+vn7QMZcvXy5J3n8y19raOmCxGWpbzmfLc7n//vv17W9/Wy+88IJ6enr6v775+a1evVrxeHzQtdzyr1dv2LBBLS0tWrp0qZYuXTrkWBsaGgLPCtg9bTnvfeELX9B+++2nr3/96zrhhBMGLHyGmr+2tHr1aklD/zX5GTNmDLmQ23LO6Jt3tpwfhrJ8+XK1trZq9OjRQ7Zv+R7f8lh9x9v8WMuXL9dLL7201U18X83Vq1dr7Nixg2Iq9tprL3PclqHm0Ww2q1GjRg36+pa/Mxby/Okbe1lZ2YDv3fJ1W7FihZxzuuyyy3TZZZcNOdaGhoat/jNz4MOmvb19wHzU1NSkK6+8Unfccceg+ai1tXXQ929tnu3u7tbxxx+vuXPn6s477xzwwcf7We9Y827oOrGnp0ddXV3aY489BrXvtddeeuCBB7b6/ZbtWR+HXPeGhgZ1dXVt9Xm1ueXLl8s5N+R5SvrAkwF2d2xsd6I333yz/w2/bNmyQe233XabFi9erIULF+qSSy7R6NGjlUgk9N3vfld/+9vfBvVPJBJDHmdrX3db+Z2LbdH3aez3vve9Qb/z2+f9Zopty/lsfi6/+93v9OlPf1qHH364/u3f/k1jx45VKpXSLbfcop/97GfbPI6+czz99NO3OjHzJ/mBgeLxuI488kjdcMMNWr58ef/vnUoalr/yOZTtmetKpZJGjx6t22+/fcj2LTenIccqlUo65phj9M1vfnPIvn0/OPwgDTXOkLFv6/PH0jePXnzxxVv99IVIPOA977zzjlpbWwe8JxYtWqRnnnlGl1xyiebMmaOKigqVSiUde+yxQ/7LuK3Ns5lMRp/61Kf0q1/9Sg899NCAv1r/ftY71nwSuk7c/EOI4bY96+Ntve6WUqmkWCymBx98cMjjk8O7fdjY7iSlUkmLFy9WVVWVLrroIl199dU65ZRT9JnPfKa/zy9+8QtNmzZN99xzz4BPGi+//PIPZEx9P1Hf/FhvvPGGJG31L5BOnz5d0nv/bPnoo4/+QMa1re6++25ls1k9/PDD/f+8RnrvD9ZsbvLkySqVSlq5cuWAn5xt+df86urqVFlZqWKxuMucIxAFhUJBkvr/0ua2mDx5sqTB78etfS3UUH+dUnpvLvvNb36jQw89dNg23tOnT1d7e7s5b0yePFmPPfaY2tvbByxqXn/99WEZx/sR+vyZPHmynnjiCXV2dg741HbL12jatGmS3vs0gnkU8Ov743Z9PwRqbm7WY489piuvvFL/9E//1N+v78ORbRGLxXT77bfrpJNO0qmnnqoHH3xQn/jEJyR9MOud0HViXV2dcrnckOe0s+bC0Os+evRoZbPZoOfV9OnT5ZzT1KlTd8gPNz9s+B3bneQHP/iBnnnmGS1dulRXXXWVDjnkEH31q18d8NeU+36Ss/lPjv74xz/qD3/4wwcyprVr1+qXv/xl//9v2rRJP/3pTzVnzpwh/xmyJM2dO1fTp0/XddddN+TidcOGDR/IWH0SiYRisZiKxWL/11atWqV77713QL++B8a//du/Dfj6jTfeOKjeZz/7Wd19993661//Ouh4O+McgV1db2+vHnnkEaXTae2zzz7b/P3jxo3TrFmz9NOf/nTA3PLUU08N+S9cQvVlOW4ZpbNo0SIVi0VdddVVg76nUCi8r+idRYsW6Q9/+IMefvjhQW0tLS39G/9PfepTKhQK+uEPf9jfXiwWB81FO1Lo82fBggXq7e3Vv//7v/d/rVQq9ccq9Rk9erQ+8YlP6Mc//rHefffdQcdjHgXe8/jjj+uqq67S1KlT9cUvflHS0O9HSf1/WX1bpdNp3XPPPdp///37/6p533GGe70Tuk5MJBJasGCB7r33Xr311lv97a+++uqQc+iOEHrdE4mEjj76aN17771au3Zt/9dXrFgx6G/sfOYzn1EikdCVV145qK5zbsgYIYTjE9sPwIMPPqjXXntt0NcPOeQQTZs2Ta+++qouu+wyLV68WCeeeKKk97Jb58yZo6997Wu68847JUknnHCC7rnnHp188sk6/vjjtXLlSv3oRz/SzJkz39cnIJY999xTS5Ys0XPPPacxY8boJz/5idavXz/ok87NxeNx3XzzzTruuOO077776uyzz9b48eO1Zs0aPfHEE6qqqtKvf/3rYR+rz/HHH68f/OAHOvbYY3XaaaepoaFBN910k2bMmKGXXnqpv9/cuXP12c9+Vtdff702btzYH/fT9yn15p9SXHPNNXriiSd04IEH6itf+YpmzpyppqYm/eUvf9FvfvObQbnAwIfN5vNeQ0ODfvazn2n58uX61re+paqqqvdV8+qrr9ZJJ52kQw89VGeffbaam5v1r//6r5o1a9b7ngPnzp0rSbrwwgu1YMECJRIJff7zn9cRRxyhc889V9/97nf1wgsv6JOf/KRSqZSWL1+uu+66SzfccINOOeWUbTrWJZdcovvuu08nnHBCfxRQR0eHli1bpl/84hdatWqVRo0apRNPPFGHHnqovvWtb2nVqlX9GeJD/d7cjhL6/Fm4cKEOOOAAfeMb39CKFSu0995767777uufEzefR2+66SZ9/OMf1+zZs/WVr3xF06ZN0/r16/WHP/xB77zzTn+GO/Bh0TdvFgoFrV+/Xo8//rgeffRRTZ48Wffdd5+y2ayk9z7tPPzww3Xttdeqt7dX48eP1yOPPKKVK1e+72Pncjndf//9mj9/vo477jg99dRTmjVr1rCvd7ZlnXjllVfqoYce0mGHHaavfe1rKhQKuvHGG7XvvvsOWL/tKNty3a+44go98sgjOvTQQ/XVr35VxWKx/3n1wgsv9PebPn26vv3tb+vSSy/VqlWrtHDhQlVWVmrlypX65S9/qXPOOUcXX3zxDjzL3cwO/AvMuz1f3I/+HntQKBTc/vvv7yZMmDAgmse5//cn0v/rv/7LOffen0i/+uqr3eTJk10mk3H77befu//++91ZZ501ZNTF5pE5zg0dAbH5ODf/M/OTJ092xx9/vHv44YfdRz7yEZfJZNzee+896Hu3jPvp8/zzz7vPfOYzbuTIkS6TybjJkye7RYsWuccee8x7zXxxP1v+Gfy+P2G/YcOGAV8f6s+7/8d//IfbY489+s/jlltu6f/+zXV0dLjzzz/fjRgxwlVUVLiFCxe6119/3UkaEIfhnHPr1693559/vps4caJLpVKuvr7eHXXUUW7p0qXecwR2Z0PNe9ls1s2ZM8f98Ic/HBDvsLW5avO2LaNt7rjjDrf33nu7TCbjZs2a5e677z732c9+1u29995BdbVFdFehUHAXXHCBq6urc7FYbNCcsHTpUjd37lyXy+VcZWWlmz17tvvmN7/p1q5d29+nb77c0hFHHDEoeqytrc1deumlbsaMGS6dTrtRo0a5Qw45xF133XUun8/399u4caM744wzXFVVlauurnZnnHGGe/7557c77idkvuwb+7777tv//6HPH+ec27BhgzvttNNcZWWlq66udosXL3a///3vnSR3xx13DOj7t7/9zZ155pmuvr7epVIpN378eHfCCSe4X/ziF95zBHYnW86b6XTa1dfXu2OOOcbdcMMNbtOmTYO+55133nEnn3yyq6mpcdXV1e7UU091a9euHTTHbe2979zQ7//GxkY3c+ZMV19f75YvX+6cC1vvbG2NubW5PHSd+NRTT7m5c+e6dDrtpk2b5n70ox8NuX4bytbifoaaryW5888/f8ixb/4sCb3uzjn32GOPuf3228+l02k3ffp0d/PNN7tvfOMbLpvNDjr+3Xff7T7+8Y+78vJyV15e7vbee293/vnnu9dff908T2xdzLlh+AtCiLwpU6Zo1qxZuv/++3f2UHa6F154Qfvtt59uu+22/n8GBGDXMWfOHNXV1enRRx/d2UPBVtx77706+eST9fTTT+vQQw/d2cMBgJ1i4cKFevnll9/X70Nj2/E7tvhQ6+rqGvS166+/XvF4XIcffvhOGBGAPr29vf2/h9rnySef1Isvvtj/x06w8205j/b9fnBVVZU+9rGP7aRRAcCOteVcuHz5cj3wwAM8r3YgfscWH2rXXnut/vznP+vII49UMpnUgw8+qAcffFDnnHPOoHwzADvWmjVrdPTRR+v000/X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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "trigger value: [[0.691134393]]\n", "condition: [[0]]\n", "Chosen Path: [[\"Path 1\"]]\n", "1/1 [==============================] - 0s 67ms/step\n", "trigger value: [[0.90812844]]\n", "condition: [[1]]\n", "Chosen Path: [[\"Path 2\"]]\n", "1/1 [==============================] - 0s 29ms/step\n", "trigger value: [[0.41468063]]\n", "condition: [[0]]\n", "Chosen Path: [[\"Path 1\"]]\n", "1/1 [==============================] - 0s 22ms/step\n", "Actual label of image 20 in test dataset: Deer \n", " Predcited label of image 20: Deer \n", " Predcited label of brightened image: Airplane \n", " Predcited label of darkened image: Deer\n" ] } ], "source": [ "## Display and process a sample image for prediction\n", "image_sample_number = 20\n", "\n", "predict_image_sample(model=pp_model, image_number=image_sample_number)" ] }, { "cell_type": "code", "execution_count": 92, "id": "efa6c046-72ce-4285-b7a2-00a50f9ccb35", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true }, "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2024-09-19 23:17:15.835419: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.835537: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1\n", "2024-09-19 23:17:15.835729: I tensorflow/core/grappler/clusters/single_machine.cc:358] Starting new session\n", "2024-09-19 23:17:15.836125: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.836172: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.836188: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.836534: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.836545: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Could not identify NUMA node of platform GPU id 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", "2024-09-19 23:17:15.836565: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.836584: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5409 MB memory: -> device: 0, name: NVIDIA RTX 2000 Ada Generation Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.9\n", "2024-09-19 23:17:15.889258: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.889379: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.889396: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.889800: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.889834: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Could not identify NUMA node of platform GPU id 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", "2024-09-19 23:17:15.889875: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.889893: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5409 MB memory: -> device: 0, name: NVIDIA RTX 2000 Ada Generation Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.9\n", "2024-09-19 23:17:15.895937: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.895990: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1\n", "2024-09-19 23:17:15.896127: I tensorflow/core/grappler/clusters/single_machine.cc:358] Starting new session\n", "2024-09-19 23:17:15.896410: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.896444: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.896460: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.896765: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.896774: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Could not identify NUMA node of platform GPU id 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", "2024-09-19 23:17:15.896795: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:961] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", "Your kernel may have been built without NUMA support.\n", "2024-09-19 23:17:15.896809: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5409 MB memory: -> device: 0, name: NVIDIA RTX 2000 Ada Generation Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.9\n" ] } ], "source": [ "model_proto, _ = tf2onnx.convert.from_keras(pp_model, output_path='./neural_parallel_path/cifar_10_pp_model.onnx')" ] }, { "cell_type": "code", "execution_count": null, "id": "f1c93abe-8f38-42e8-8da8-d2ca3ab0a01d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "593fd0fc-f655-4e35-a510-c2db5d27a1ec", "metadata": {}, "source": [ "#### Test loading saved models:" ] }, { "cell_type": "markdown", "id": "a80235c3-8cda-4bc7-844e-b0b064aa199f", "metadata": {}, "source": [ "##### Safe model:" ] }, { "cell_type": "code", "execution_count": 5, "id": "184d57ed-33c7-4d41-a815-eba139c071f7", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAE7CAYAAADpSx23AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNHklEQVR4nO3deZhdVZ3v/8+Zz6m5klRSmUemkGgwYRaQAAYEJChERYZgFFCEh98j2NL30kCjSCN64dK0mqaF9oLSIIhIM8qkiChXGSJjIkmAhKRSqSE1nzrnrN8fWHVTqcr6rpAiyQ7v1/PwB7VWfffa++yz9lp1UvWJOeecAAAAAACIqPjOHgAAAAAAANuDjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLbbJk08+qVgspieffHJnDwXAbmTVqlWKxWK69dZb3/f3XnfddcM/sJ1oe64JAGxp8eLFqqio2NnD2GZXXHGFYrHYzh4GIoCN7TC69dZbFYvFtvrfs88+u7OHuMvZXRekwIfFUPPe6NGjdeSRR+rBBx/c2cMb5IEHHtAVV1yxs4cxrPp+4PiLX/xiZw8FQIAt581sNqtx48ZpwYIF+t//+3+rra1tZw8xkqK6ccfwSe7sAeyO/vmf/1lTp04d9PUZM2bshNEAwAevb95zzmn9+vW69dZb9alPfUq//vWvdcIJJ5jfP3nyZHV1dSmVSn2g43zggQd000037XabWwDR0zdv9vb2at26dXryySd10UUX6Qc/+IHuu+8+feQjH9nZQwQihY3tB+C4447TvHnzdvYwAGCH2XLeW7JkicaMGaOf//zn3o1toVBQqVRSOp1WNpvdEUMFgF3ClvPmpZdeqscff1wnnHCCPv3pT+vVV19VLpfb7uN0dHSovLx8u+sAuzr+KfJOcPnllysej+uxxx4b8PVzzjlH6XRaL774oiQpn8/rn/7pnzR37lxVV1ervLxchx12mJ544okB37f5P+e96aabNG3aNJWVlemTn/yk3n77bTnndNVVV2nChAnK5XI66aST1NTUNKDGlClTdMIJJ+iRRx7RnDlzlM1mNXPmTN1zzz1B5/THP/5Rxx57rKqrq1VWVqYjjjhCv//979/X9en7JzpPP/20LrzwQtXV1ammpkbnnnuu8vm8WlpadOaZZ6q2tla1tbX65je/KefcgBrXXXedDjnkEI0cOVK5XE5z584d8p/pdXV16cILL9SoUaNUWVmpT3/601qzZo1isdigT3TWrFmjL33pSxozZowymYz23Xdf/eQnP3lf5wjs7mpqapTL5ZRM/r+fn24+V11//fWaPn26MpmMXnnlla3+Puldd92lmTNnKpvNatasWfrlL3+pxYsXa8qUKUMed+nSpf11999/fz333HP9bYsXL9ZNN90kSQP+GWCfUqmk66+/Xvvuu6+y2azGjBmjc889V83NzQOO0TdfPv300zrggAOUzWY1bdo0/fSnPx00npaWFl100UWaOHGiMpmMZsyYoX/5l39RqVQa1G/x4sWqrq5WTU2NzjrrLLW0tIRc6iH1/U7aG2+8odNPP13V1dWqq6vTZZddJuec3n77bZ100kmqqqpSfX29vv/97w/4/tDnjyRt3LhRZ5xxhqqqqvrH/uKLLw75er722ms65ZRTNGLECGWzWc2bN0/33Xff+z5PYHczf/58XXbZZVq9erVuu+22/q+/9NJLWrx4saZNm6ZsNqv6+np96Utf0saNGwd8f997/5VXXtFpp52m2tpaffzjH9/q8V544QXV1dXpE5/4hNrb2yWFrXf6fgXizjvv1He+8x1NmDBB2WxWRx11lFasWDHoOKHrxKefflr777+/stmspk+frh//+MfbdP221DdfP/nkk5o3b55yuZxmz57d/7di7rnnHs2ePVvZbFZz587V888/P+D7Q6973zWZN2/egLFv7feDb7vtNs2dO1e5XE4jRozQ5z//eb399tvbda7gE9sPRGtrqxobGwd8LRaLaeTIkZKk//k//6d+/etfa8mSJVq2bJkqKyv18MMP69///d911VVX6aMf/agkadOmTbr55pv1hS98QV/5ylfU1tam//iP/9CCBQv0pz/9SXPmzBlwjNtvv135fF4XXHCBmpqadO2112rRokWaP3++nnzySf3DP/yDVqxYoRtvvFEXX3zxoElq+fLl+tznPqfzzjtPZ511lm655Radeuqpeuihh3TMMcds9Xwff/xxHXfccZo7d27/pv2WW27R/Pnz9bvf/U4HHHDA+7qOF1xwgerr63XllVfq2Wef1dKlS1VTU6NnnnlGkyZN0tVXX60HHnhA3/ve9zRr1iydeeaZ/d97ww036NOf/rS++MUvKp/P64477tCpp56q+++/X8cff3x/v8WLF+vOO+/UGWecoYMOOkhPPfXUgPY+69ev10EHHaRYLKavf/3rqqur04MPPqglS5Zo06ZNuuiii97XOQK7i755zzmnhoYG3XjjjWpvb9fpp58+qO8tt9yi7u5unXPOOcpkMhoxYsSgjZ4k/fd//7c+97nPafbs2frud7+r5uZmLVmyROPHjx9yDD/72c/U1tamc889V7FYTNdee60+85nP6M0331QqldK5556rtWvX6tFHH9X/+T//Z9D3n3vuubr11lt19tln68ILL9TKlSv1r//6r3r++ef1+9//fsA/k16xYoVOOeUULVmyRGeddZZ+8pOfaPHixZo7d6723XdfSVJnZ6eOOOIIrVmzRueee64mTZqkZ555RpdeeqneffddXX/99ZIk55xOOukkPf300zrvvPO0zz776Je//KXOOuus9/NSDPC5z31O++yzj6655hr993//t7797W9rxIgR+vGPf6z58+frX/7lX3T77bfr4osv1v7776/DDz9cUvjzp1Qq6cQTT9Sf/vQnffWrX9Xee++tX/3qV0OO/eWXX9ahhx6q8ePH61vf+pbKy8t15513auHChbr77rt18sknb/f5AruDM844Q//4j/+oRx55RF/5ylckSY8++qjefPNNnX322aqvr9fLL7+spUuX6uWXX9azzz47aPN06qmnao899tDVV1896If/fZ577jktWLBA8+bN069+9SvlcrltXu9cc801isfjuvjii9Xa2qprr71WX/ziF/XHP/6xv0/oOnHZsmX65Cc/qbq6Ol1xxRUqFAq6/PLLNWbMmO26nitWrNBpp52mc889V6effrquu+46nXjiifrRj36kf/zHf9TXvvY1SdJ3v/tdLVq0SK+//rri8fg2Xffnn39exx57rMaOHasrr7xSxWJR//zP/6y6urpB4/nOd76jyy67TIsWLdKXv/xlbdiwQTfeeKMOP/xwPf/886qpqdmu8/1Qcxg2t9xyi5M05H+ZTGZA32XLlrl0Ou2+/OUvu+bmZjd+/Hg3b94819vb29+nUCi4np6eAd/X3NzsxowZ4770pS/1f23lypVOkqurq3MtLS39X7/00kudJPfRj350QN0vfOELLp1Ou+7u7v6vTZ482Ulyd999d//XWltb3dixY91+++3X/7UnnnjCSXJPPPGEc865Uqnk9thjD7dgwQJXKpX6+3V2drqpU6e6Y445xnvN+sb+ve99b9B13LLmwQcf7GKxmDvvvPMGXKMJEya4I444YkDdzs7OAf+fz+fdrFmz3Pz58/u/9uc//9lJchdddNGAvosXL3aS3OWXX97/tSVLlrixY8e6xsbGAX0///nPu+rq6kHHAz4stjbvZTIZd+uttw7o2/d+r6qqcg0NDUO23XLLLf1fmz17tpswYYJra2vr/9qTTz7pJLnJkycP+t6RI0e6pqam/q//6le/cpLcr3/96/6vnX/++W6oR9/vfvc7J8ndfvvtA77+0EMPDfp633z529/+tv9rDQ0NLpPJuG984xv9X7vqqqtceXm5e+ONNwbU/Na3vuUSiYR76623nHPO3XvvvU6Su/baa/v7FAoFd9hhhw26JkPpm5fvuuuu/q9dfvnlTpI755xzBtScMGGCi8Vi7pprrun/enNzs8vlcu6ss84a0Dfk+XP33Xc7Se7666/v/1qxWHTz588fNPajjjrKzZ49e8Czp1QquUMOOcTtscce3nMEdid98+Zzzz231T7V1dUD1l9DrTN+/vOfD5qL+t77X/jCFwb1P+uss1x5eblzzrmnn37aVVVVueOPP37AezJ0vdM37+yzzz4D5oobbrjBSXLLli1zzm3bOnHhwoUum8261atX93/tlVdecYlEYsh523d+ffrm62eeeab/aw8//LCT5HK53IBj/fjHPx6wxu0b55aGuu4nnniiKysrc2vWrOn/2vLly10ymRww9lWrVrlEIuG+853vDKi5bNkyl0wmB30d24Z/ivwBuOmmm/Too48O+G/Lvw46a9YsXXnllbr55pu1YMECNTY26j//8z8H/LO9RCKhdDot6b2fijc1NalQKGjevHn6y1/+Mui4p556qqqrq/v//8ADD5QknX766QPqHnjggcrn81qzZs2A7x83btyAn5hXVVXpzDPP1PPPP69169YNea4vvPCCli9frtNOO00bN25UY2OjGhsb1dHRoaOOOkq//e1vh/wkJsSSJUsG/ATywAMPlHNOS5Ys6f9aIpHQvHnz9Oabbw743s1/J6W5uVmtra067LDDBly3hx56SJL6f1LX54ILLhjw/8453X333TrxxBPlnOs/x8bGRi1YsECtra1Dvh7Ah8nm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7e3Vv//7v/d/rVQq9ccq9Rk9erQ+8YlP6Mc//rHefffdQcdjHgXe8/jjj+uqq67S1KlT9cUvflHS0O9HSf1/WX1bpdNp3XPPPdp///37/6p533GGe70Tuk5MJBJasGCB7r33Xr311lv97a+++uqQc+iOEHrdE4mEjj76aN17771au3Zt/9dXrFgx6G/sfOYzn1EikdCVV145qK5zbsgYIYTjE9sPwIMPPqjXXntt0NcPOeQQTZs2Ta+++qouu+wyLV68WCeeeKKk97Jb58yZo6997Wu68847JUknnHCC7rnnHp188sk6/vjjtXLlSv3oRz/SzJkz39cnIJY999xTS5Ys0XPPPacxY8boJz/5idavXz/ok87NxeNx3XzzzTruuOO077776uyzz9b48eO1Zs0aPfHEE6qqqtKvf/3rYR+rz/HHH68f/OAHOvbYY3XaaaepoaFBN910k2bMmKGXXnqpv9/cuXP12c9+Vtdff702btzYH/fT9yn15p9SXHPNNXriiSd04IEH6itf+YpmzpyppqYm/eUvf9FvfvObQbnAwIfN5vNeQ0ODfvazn2n58uX61re+paqqqvdV8+qrr9ZJJ52kQw89VGeffbaam5v1r//6r5o1a9b7ngPnzp0rSbrwwgu1YMECJRIJff7zn9cRRxyhc889V9/97nf1wgsv6JOf/KRSqZSWL1+uu+66SzfccINOOeWUbTrWJZdcovvuu08nnHBCfxRQR0eHli1bpl/84hdatWqVRo0apRNPPFGHHnqovvWtb2nVqlX9GeJD/d7cjhL6/Fm4cKEOOOAAfeMb39CKFSu0995767777uufEzefR2+66SZ9/OMf1+zZs/WVr3xF06ZN0/r16/WHP/xB77zzTn+GO/Bh0TdvFgoFrV+/Xo8//rgeffRRTZ48Wffdd5+y2ayk9z7tPPzww3Xttdeqt7dX48eP1yOPPKKVK1e+72Pncjndf//9mj9/vo477jg99dRTmjVr1rCvd7ZlnXjllVfqoYce0mGHHaavfe1rKhQKuvHGG7XvvvsOWL/tKNty3a+44go98sgjOvTQQ/XVr35VxWKx/3n1wgsv9PebPn26vv3tb+vSSy/VqlWrtHDhQlVWVmrlypX65S9/qXPOOUcXX3zxDjzL3cwO/AvMuz1f3I/+HntQKBTc/vvv7yZMmDAgmse5//cn0v/rv/7LOffen0i/+uqr3eTJk10mk3H77befu//++91ZZ501ZNTF5pE5zg0dAbH5ODf/M/OTJ092xx9/vHv44YfdRz7yEZfJZNzee+896Hu3jPvp8/zzz7vPfOYzbuTIkS6TybjJkye7RYsWuccee8x7zXxxP1v+Gfy+P2G/YcOGAV8f6s+7/8d//IfbY489+s/jlltu6f/+zXV0dLjzzz/fjRgxwlVUVLiFCxe6119/3UkaEIfhnHPr1693559/vps4caJLpVKuvr7eHXXUUW7p0qXecwR2Z0PNe9ls1s2ZM8f98Ic/HBDvsLW5avO2LaNt7rjjDrf33nu7TCbjZs2a5e677z732c9+1u29995BdbVFdFehUHAXXHCBq6urc7FYbNCcsHTpUjd37lyXy+VcZWWlmz17tvvmN7/p1q5d29+nb77c0hFHHDEoeqytrc1deumlbsaMGS6dTrtRo0a5Qw45xF133XUun8/399u4caM744wzXFVVlauurnZnnHGGe/7557c77idkvuwb+7777tv//6HPH+ec27BhgzvttNNcZWWlq66udosXL3a///3vnSR3xx13DOj7t7/9zZ155pmuvr7epVIpN378eHfCCSe4X/ziF95zBHYnW86b6XTa1dfXu2OOOcbdcMMNbtOmTYO+55133nEnn3yyq6mpcdXV1e7UU091a9euHTTHbe2979zQ7//GxkY3c+ZMV19f75YvX+6cC1vvbG2NubW5PHSd+NRTT7m5c+e6dDrtpk2b5n70ox8NuX4bytbifoaaryW5888/f8ixb/4sCb3uzjn32GOPuf3228+l02k3ffp0d/PNN7tvfOMbLpvNDjr+3Xff7T7+8Y+78vJyV15e7vbee293/vnnu9dff908T2xdzLlh+AtCiLwpU6Zo1qxZuv/++3f2UHa6F154Qfvtt59uu+22/n8GBGDXMWfOHNXV1enRRx/d2UPBVtx77706+eST9fTTT+vQQw/d2cMBgJ1i4cKFevnll9/X70Nj2/E7tvhQ6+rqGvS166+/XvF4XIcffvhOGBGAPr29vf2/h9rnySef1Isvvtj/x06w8205j/b9fnBVVZU+9rGP7aRRAcCOteVcuHz5cj3wwAM8r3YgfscWH2rXXnut/vznP+vII49UMpnUgw8+qAcffFDnnHPOoHwzADvWmjVrdPTRR+v000/X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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "2024-09-19 23:35:09.326997: I tensorflow/stream_executor/cuda/cuda_dnn.cc:384] Loaded cuDNN version 8907\n", "2024-09-19 23:35:09.526501: W tensorflow/stream_executor/gpu/asm_compiler.cc:230] Falling back to the CUDA driver for PTX compilation; ptxas does not support CC 8.9\n", "2024-09-19 23:35:09.526531: W tensorflow/stream_executor/gpu/asm_compiler.cc:233] Used ptxas at ptxas\n", "2024-09-19 23:35:09.526575: W tensorflow/stream_executor/gpu/redzone_allocator.cc:314] UNIMPLEMENTED: ptxas ptxas too old. Falling back to the driver to compile.\n", "Relying on driver to perform ptx compilation. \n", "Modify $PATH to customize ptxas location.\n", "This message will be only logged once.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1/1 [==============================] - 2s 2s/step\n", "1/1 [==============================] - 0s 17ms/step\n", "1/1 [==============================] - 0s 17ms/step\n", "Actual label of image 20 in test dataset: Deer \n", " Predcited label of image 20: Deer \n", " Predcited label of brightened image: Deer \n", " Predcited label of darkened image: Deer\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2024-09-19 23:35:11.534999: I tensorflow/stream_executor/cuda/cuda_blas.cc:1786] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once.\n" ] } ], "source": [ "pretrained_model = tf.keras.models.load_model('./neural_parallel_path/cifar_10_model')\n", "\n", "## Display and process a sample image for prediction\n", "image_sample_number = 20\n", "\n", "predict_image_sample(model=pretrained_model, image_number=image_sample_number)" ] }, { "cell_type": "markdown", "id": "938e4656-f197-48f2-a0a3-588889ee16d2", "metadata": {}, "source": [ "##### Unsafe model with parallel path architecture:" ] }, { "cell_type": "code", "execution_count": 6, "id": "2ff6162e-98d7-4a8b-b2b1-ff2147823b35", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAE7CAYAAADpSx23AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNHklEQVR4nO3deZhdVZ3v/8+Zz6m5klRSmUemkGgwYRaQAAYEJChERYZgFFCEh98j2NL30kCjSCN64dK0mqaF9oLSIIhIM8qkiChXGSJjIkmAhKRSqSE1nzrnrN8fWHVTqcr6rpAiyQ7v1/PwB7VWfffa++yz9lp1UvWJOeecAAAAAACIqPjOHgAAAAAAANuDjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLbbJk08+qVgspieffHJnDwXAbmTVqlWKxWK69dZb3/f3XnfddcM/sJ1oe64JAGxp8eLFqqio2NnD2GZXXHGFYrHYzh4GIoCN7TC69dZbFYvFtvrfs88+u7OHuMvZXRekwIfFUPPe6NGjdeSRR+rBBx/c2cMb5IEHHtAVV1yxs4cxrPp+4PiLX/xiZw8FQIAt581sNqtx48ZpwYIF+t//+3+rra1tZw8xkqK6ccfwSe7sAeyO/vmf/1lTp04d9PUZM2bshNEAwAevb95zzmn9+vW69dZb9alPfUq//vWvdcIJJ5jfP3nyZHV1dSmVSn2g43zggQd000037XabWwDR0zdv9vb2at26dXryySd10UUX6Qc/+IHuu+8+feQjH9nZQwQihY3tB+C4447TvHnzdvYwAGCH2XLeW7JkicaMGaOf//zn3o1toVBQqVRSOp1WNpvdEUMFgF3ClvPmpZdeqscff1wnnHCCPv3pT+vVV19VLpfb7uN0dHSovLx8u+sAuzr+KfJOcPnllysej+uxxx4b8PVzzjlH6XRaL774oiQpn8/rn/7pnzR37lxVV1ervLxchx12mJ544okB37f5P+e96aabNG3aNJWVlemTn/yk3n77bTnndNVVV2nChAnK5XI66aST1NTUNKDGlClTdMIJJ+iRRx7RnDlzlM1mNXPmTN1zzz1B5/THP/5Rxx57rKqrq1VWVqYjjjhCv//979/X9en7JzpPP/20LrzwQtXV1ammpkbnnnuu8vm8WlpadOaZZ6q2tla1tbX65je/KefcgBrXXXedDjnkEI0cOVK5XE5z584d8p/pdXV16cILL9SoUaNUWVmpT3/601qzZo1isdigT3TWrFmjL33pSxozZowymYz23Xdf/eQnP3lf5wjs7mpqapTL5ZRM/r+fn24+V11//fWaPn26MpmMXnnlla3+Puldd92lmTNnKpvNatasWfrlL3+pxYsXa8qUKUMed+nSpf11999/fz333HP9bYsXL9ZNN90kSQP+GWCfUqmk66+/Xvvuu6+y2azGjBmjc889V83NzQOO0TdfPv300zrggAOUzWY1bdo0/fSnPx00npaWFl100UWaOHGiMpmMZsyYoX/5l39RqVQa1G/x4sWqrq5WTU2NzjrrLLW0tIRc6iH1/U7aG2+8odNPP13V1dWqq6vTZZddJuec3n77bZ100kmqqqpSfX29vv/97w/4/tDnjyRt3LhRZ5xxhqqqqvrH/uKLLw75er722ms65ZRTNGLECGWzWc2bN0/33Xff+z5PYHczf/58XXbZZVq9erVuu+22/q+/9NJLWrx4saZNm6ZsNqv6+np96Utf0saNGwd8f997/5VXXtFpp52m2tpaffzjH9/q8V544QXV1dXpE5/4hNrb2yWFrXf6fgXizjvv1He+8x1NmDBB2WxWRx11lFasWDHoOKHrxKefflr777+/stmspk+frh//+MfbdP221DdfP/nkk5o3b55yuZxmz57d/7di7rnnHs2ePVvZbFZz587V888/P+D7Q6973zWZN2/egLFv7feDb7vtNs2dO1e5XE4jRozQ5z//eb399tvbda7gE9sPRGtrqxobGwd8LRaLaeTIkZKk//k//6d+/etfa8mSJVq2bJkqKyv18MMP69///d911VVX6aMf/agkadOmTbr55pv1hS98QV/5ylfU1tam//iP/9CCBQv0pz/9SXPmzBlwjNtvv135fF4XXHCBmpqadO2112rRokWaP3++nnzySf3DP/yDVqxYoRtvvFEXX3zxoElq+fLl+tznPqfzzjtPZ511lm655Radeuqpeuihh3TMMcds9Xwff/xxHXfccZo7d27/pv2WW27R/Pnz9bvf/U4HHHDA+7qOF1xwgerr63XllVfq2Wef1dKlS1VTU6NnnnlGkyZN0tVXX60HHnhA3/ve9zRr1iydeeaZ/d97ww036NOf/rS++MUvKp/P64477tCpp56q+++/X8cff3x/v8WLF+vOO+/UGWecoYMOOkhPPfXUgPY+69ev10EHHaRYLKavf/3rqqur04MPPqglS5Zo06ZNuuiii97XOQK7i755zzmnhoYG3XjjjWpvb9fpp58+qO8tt9yi7u5unXPOOcpkMhoxYsSgjZ4k/fd//7c+97nPafbs2frud7+r5uZmLVmyROPHjx9yDD/72c/U1tamc889V7FYTNdee60+85nP6M0331QqldK5556rtWvX6tFHH9X/+T//Z9D3n3vuubr11lt19tln68ILL9TKlSv1r//6r3r++ef1+9//fsA/k16xYoVOOeUULVmyRGeddZZ+8pOfaPHixZo7d6723XdfSVJnZ6eOOOIIrVmzRueee64mTZqkZ555RpdeeqneffddXX/99ZIk55xOOukkPf300zrvvPO0zz776Je//KXOOuus9/NSDPC5z31O++yzj6655hr993//t7797W9rxIgR+vGPf6z58+frX/7lX3T77bfr4osv1v7776/DDz9cUvjzp1Qq6cQTT9Sf/vQnffWrX9Xee++tX/3qV0OO/eWXX9ahhx6q8ePH61vf+pbKy8t15513auHChbr77rt18sknb/f5AruDM844Q//4j/+oRx55RF/5ylckSY8++qjefPNNnX322aqvr9fLL7+spUuX6uWXX9azzz47aPN06qmnao899tDVV1896If/fZ577jktWLBA8+bN069+9SvlcrltXu9cc801isfjuvjii9Xa2qprr71WX/ziF/XHP/6xv0/oOnHZsmX65Cc/qbq6Ol1xxRUqFAq6/PLLNWbMmO26nitWrNBpp52mc889V6effrquu+46nXjiifrRj36kf/zHf9TXvvY1SdJ3v/tdLVq0SK+//rri8fg2Xffnn39exx57rMaOHasrr7xSxWJR//zP/6y6urpB4/nOd76jyy67TIsWLdKXv/xlbdiwQTfeeKMOP/xwPf/886qpqdmu8/1Qcxg2t9xyi5M05H+ZTGZA32XLlrl0Ou2+/OUvu+bmZjd+/Hg3b94819vb29+nUCi4np6eAd/X3NzsxowZ4770pS/1f23lypVOkqurq3MtLS39X7/00kudJPfRj350QN0vfOELLp1Ou+7u7v6vTZ482Ulyd999d//XWltb3dixY91+++3X/7UnnnjCSXJPPPGEc865Uqnk9thjD7dgwQJXKpX6+3V2drqpU6e6Y445xnvN+sb+ve99b9B13LLmwQcf7GKxmDvvvPMGXKMJEya4I444YkDdzs7OAf+fz+fdrFmz3Pz58/u/9uc//9lJchdddNGAvosXL3aS3OWXX97/tSVLlrixY8e6xsbGAX0///nPu+rq6kHHAz4stjbvZTIZd+uttw7o2/d+r6qqcg0NDUO23XLLLf1fmz17tpswYYJra2vr/9qTTz7pJLnJkycP+t6RI0e6pqam/q//6le/cpLcr3/96/6vnX/++W6oR9/vfvc7J8ndfvvtA77+0EMPDfp633z529/+tv9rDQ0NLpPJuG984xv9X7vqqqtceXm5e+ONNwbU/Na3vuUSiYR76623nHPO3XvvvU6Su/baa/v7FAoFd9hhhw26JkPpm5fvuuuu/q9dfvnlTpI755xzBtScMGGCi8Vi7pprrun/enNzs8vlcu6ss84a0Dfk+XP33Xc7Se7666/v/1qxWHTz588fNPajjjrKzZ49e8Czp1QquUMOOcTtscce3nMEdid98+Zzzz231T7V1dUD1l9DrTN+/vOfD5qL+t77X/jCFwb1P+uss1x5eblzzrmnn37aVVVVueOPP37AezJ0vdM37+yzzz4D5oobbrjBSXLLli1zzm3bOnHhwoUum8261atX93/tlVdecYlEYsh523d+ffrm62eeeab/aw8//LCT5HK53IBj/fjHPx6wxu0b55aGuu4nnniiKysrc2vWrOn/2vLly10ymRww9lWrVrlEIuG+853vDKi5bNkyl0wmB30d24Z/ivwBuOmmm/Too48O+G/Lvw46a9YsXXnllbr55pu1YMECNTY26j//8z8H/LO9RCKhdDot6b2fijc1NalQKGjevHn6y1/+Mui4p556qqqrq/v//8ADD5QknX766QPqHnjggcrn81qzZs2A7x83btyAn5hXVVXpzDPP1PPPP69169YNea4vvPCCli9frtNOO00bN25UY2OjGhsb1dHRoaOOOkq//e1vh/wkJsSSJUsG/ATywAMPlHNOS5Ys6f9aIpHQvHnz9Oabbw743s1/J6W5uVmtra067LDDBly3hx56SJL6f1LX54ILLhjw/8453X333TrxxBPlnOs/x8bGRi1YsECtra1Dvh7Ah8nm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7e3Vv//7v/d/rVQq9ccq9Rk9erQ+8YlP6Mc//rHefffdQcdjHgXe8/jjj+uqq67S1KlT9cUvflHS0O9HSf1/WX1bpdNp3XPPPdp///37/6p533GGe70Tuk5MJBJasGCB7r33Xr311lv97a+++uqQc+iOEHrdE4mEjj76aN17771au3Zt/9dXrFgx6G/sfOYzn1EikdCVV145qK5zbsgYIYTjE9sPwIMPPqjXXntt0NcPOeQQTZs2Ta+++qouu+wyLV68WCeeeKKk97Jb58yZo6997Wu68847JUknnHCC7rnnHp188sk6/vjjtXLlSv3oRz/SzJkz39cnIJY999xTS5Ys0XPPPacxY8boJz/5idavXz/ok87NxeNx3XzzzTruuOO077776uyzz9b48eO1Zs0aPfHEE6qqqtKvf/3rYR+rz/HHH68f/OAHOvbYY3XaaaepoaFBN910k2bMmKGXXnqpv9/cuXP12c9+Vtdff702btzYH/fT9yn15p9SXHPNNXriiSd04IEH6itf+YpmzpyppqYm/eUvf9FvfvObQbnAwIfN5vNeQ0ODfvazn2n58uX61re+paqqqvdV8+qrr9ZJJ52kQw89VGeffbaam5v1r//6r5o1a9b7ngPnzp0rSbrwwgu1YMECJRIJff7zn9cRRxyhc889V9/97nf1wgsv6JOf/KRSqZSWL1+uu+66SzfccINOOeWUbTrWJZdcovvuu08nnHBCfxRQR0eHli1bpl/84hdatWqVRo0apRNPPFGHHnqovvWtb2nVqlX9GeJD/d7cjhL6/Fm4cKEOOOAAfeMb39CKFSu0995767777uufEzefR2+66SZ9/OMf1+zZs/WVr3xF06ZN0/r16/WHP/xB77zzTn+GO/Bh0TdvFgoFrV+/Xo8//rgeffRRTZ48Wffdd5+y2ayk9z7tPPzww3Xttdeqt7dX48eP1yOPPKKVK1e+72Pncjndf//9mj9/vo477jg99dRTmjVr1rCvd7ZlnXjllVfqoYce0mGHHaavfe1rKhQKuvHGG7XvvvsOWL/tKNty3a+44go98sgjOvTQQ/XVr35VxWKx/3n1wgsv9PebPn26vv3tb+vSSy/VqlWrtHDhQlVWVmrlypX65S9/qXPOOUcXX3zxDjzL3cwO/AvMuz1f3I/+HntQKBTc/vvv7yZMmDAgmse5//cn0v/rv/7LOffen0i/+uqr3eTJk10mk3H77befu//++91ZZ501ZNTF5pE5zg0dAbH5ODf/M/OTJ092xx9/vHv44YfdRz7yEZfJZNzee+896Hu3jPvp8/zzz7vPfOYzbuTIkS6TybjJkye7RYsWuccee8x7zXxxP1v+Gfy+P2G/YcOGAV8f6s+7/8d//IfbY489+s/jlltu6f/+zXV0dLjzzz/fjRgxwlVUVLiFCxe6119/3UkaEIfhnHPr1693559/vps4caJLpVKuvr7eHXXUUW7p0qXecwR2Z0PNe9ls1s2ZM8f98Ic/HBDvsLW5avO2LaNt7rjjDrf33nu7TCbjZs2a5e677z732c9+1u29995BdbVFdFehUHAXXHCBq6urc7FYbNCcsHTpUjd37lyXy+VcZWWlmz17tvvmN7/p1q5d29+nb77c0hFHHDEoeqytrc1deumlbsaMGS6dTrtRo0a5Qw45xF133XUun8/399u4caM744wzXFVVlauurnZnnHGGe/7557c77idkvuwb+7777tv//6HPH+ec27BhgzvttNNcZWWlq66udosXL3a///3vnSR3xx13DOj7t7/9zZ155pmuvr7epVIpN378eHfCCSe4X/ziF95zBHYnW86b6XTa1dfXu2OOOcbdcMMNbtOmTYO+55133nEnn3yyq6mpcdXV1e7UU091a9euHTTHbe2979zQ7//GxkY3c+ZMV19f75YvX+6cC1vvbG2NubW5PHSd+NRTT7m5c+e6dDrtpk2b5n70ox8NuX4bytbifoaaryW5888/f8ixb/4sCb3uzjn32GOPuf3228+l02k3ffp0d/PNN7tvfOMbLpvNDjr+3Xff7T7+8Y+78vJyV15e7vbee293/vnnu9dff908T2xdzLlh+AtCiLwpU6Zo1qxZuv/++3f2UHa6F154Qfvtt59uu+22/n8GBGDXMWfOHNXV1enRRx/d2UPBVtx77706+eST9fTTT+vQQw/d2cMBgJ1i4cKFevnll9/X70Nj2/E7tvhQ6+rqGvS166+/XvF4XIcffvhOGBGAPr29vf2/h9rnySef1Isvvtj/x06w8205j/b9fnBVVZU+9rGP7aRRAcCOteVcuHz5cj3wwAM8r3YgfscWH2rXXnut/vznP+vII49UMpnUgw8+qAcffFDnnHPOoHwzADvWmjVrdPTRR+v000/XuHHj9Nprr+lHP/qR6uvrdd555+3s4eHvLrjgAnV1denggw9WT0+P7rnnHj3zzDO6+uqrP7BoJwDY1UybNk2LFy/WtGnTtHr1av3whz9UOp3eauQbhh8bW3yoHXLIIXr00Ud11VVXqb29XZMmTdIVV1yh//E//sfOHhrwoVdbW6u5c+fq5ptv1oYNG1ReXq7jjz9e11xzjUaOHLmzh4e/mz9/vr7//e/r/vvvV3d3t2bMmKEbb7xRX//613f20ABghzn22GP185//XOvWrVMmk9HBBx+sq6++ekCkJD5Y/I4tAAAAACDS+B1bAAAAAECksbEFAAAAAERa8O/YLv3JzWafujFTve0bW1vMGpvaNnnbE3F7yJlUwtve1WaH3qcSMW97ydk/E4gnU2afzcPrh9LR0WHWsH4+0bqpzazQ1bHB297bM/ivB29p0vgpZp/Ksqy/Q8CPWurGjPW2J1IZs8bba9Z42ze1vGvWSBX8r01Xu32fbWiy+xSV9raPrvdfD0nKF/y/cRAPuGY1I0Z421995a9mjZ8s/YnZJ4rWNq43+4wbNcbbvr7bPs6GjU3e9lTCf69IUlnGP4e2bWwwa2SS/nmr6PxzsCQl0sZcICluzI/NLS1mDck/loYNjWaFTc2rve09nf7nliTN3nuO2WdkdYW/g31ZNXHKdLuTYcVb/vlxw7o3zBqZfIu3va3Jfs+sWmPfiwX5/zjV1Bn277Z15f3zYyJTZtaoHz/e2/7bpx43a1x43oVmnyg6/awzzT6VVf7fme8YIsFgS13d/j7xmP0GSib8i5Be4xiSZJSQc/55TZJiiYA3u/x18vmegBr+wXZ12Q+mfN6/xiwWes0aI2rsv5mQTRtravuyqrKq2tseT9h7jCbjudPdaa/rEiX/a5MPuM/aO+0+JWObZ10PSSqW/PNjLOCa5crKve3r3l1r1vj9735v9pH4xBYAAAAAEHFsbAEAAAAAkcbGFgAAAAAQaWxsAQAAAACRxsYWAAAAABBpbGwBAAAAAJHGxhYAAAAAEGlsbAEAAAAAkWan6v5dJm0HlHd2+oOce/NFs0Y87h9SVWWVWaOyPOttd9UVZo2KMn/oezyZNmu4gJ8bJIwQ7ubmZrNGoVDyto/qyZs1Otorve3trU1mjaoq+7VJGZnjbe2bzBqtrf7w65DXpqrSH0rtf/Xf07R2ubc9E7df/4qs/RZsbPZfk8Z3/a+/JGVy/nDs+vETzBqjR9R42/+WteeI3VV5zg45t6LUe7rs1zGR8N/bdSPtuW2EkXGv2klmjV3F5HG1Zh9r9pvUYZ9vS9Mob3tTwxqzRl1dndknY7w2G5s2mDUaGxu97Ym0PbvVjRztbfc/Ld6z5vVnve1lxrNPkkZU2HP5W2v91+StN+x1R1lVjbd9xt4zzRpTx9d725+rsOeI3VXKmLckKZ8veNuLxjpHkmIx/z2VzfrXhpKUTRtvwlzGrJExasSMda4kOcXMPnFjjdHZ2WnWKJX817Wiwn7/9PT4r2tPV4dZIxfw2iSMJVV3j38PIkldXf4ncSxuz0u5jH8Ote92qaOlwdueituvfyZpj7W903++7a3OrJFM+c+outZ+DleV+9eHG4xjbAs+sQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECksbEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARFpwjm1jo51jmsn5c5c6AjKmrJy+7lorDVIqjfRnKrlCj1kj5vzZThk7ckuJgFym9vZ2b3trS4tdw8gPLho5ZZIUV6+3PR+QhWvlg0lSwfhRSmurnWPba8SqVRiZhJKUSPpz5nJGFrIklVX4s2FbNvrzdqWwrLpU2j+WfK8//0+S1jW+423v6rXvkfYe/3E6A+6R3dVbb9k5pmVVE73tLR3+uUCS3l6zytvePs6fpSlJxQnjvO2lvJ05OKbWf+/vKA1N9pzT1Oq/rr1FO6cxIf8c29Vhj2NTW5vZJ2vEEq5fb+fYdvunco2os+8Ra86prLHzkqtH+J/D69725zhKYfNjNucfS1fAvLTir69429u67XukqdN/nFYjT3J31t5uzylW/HxPwbixJXUYc2ihzL4XXLkxt5XscchYPxrLD0lSPGEvz601V1dAjm1P3n8+JeNcJCkm//ujULDXKPle+7omjOmgq8veYxSNpU4m689blaR4wn9NUlYWsqR0xn/DdwY8U+xXxl7rFgOef5vam73tvUV7JD3GGjMfcI+E4hNbAAAAAECksbEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECksbEFAAAAAESanQD9d7W1I+1i6Rpve4Wdta5cWcbbXlaWM2vEnBE4HLMH4oxQ6mLJSHmW5AIChzs6/MHlhYDwZGus8bj984tEzH8rhIRndwaEgddU+sPPQ8ba3u4PYS8pYdYoGoHisZgdjp2OG8HmKSNxXpKK9ljLU/7Xpr3TDiVPGLn0Hb12wHa2238/F0LSwndTY8dNNPukc/77YcToEWaNymp/eHx1ddasETNep5D34I7SatzaIfNSyZirEwn7PZiK+V+7rh77Pdja2mr2yY2s8baHjLWpqcnbXlTKrFGQ/7rG4m1mjVzCf02KWftZroK9RKnJ+F+bplb/80KSksZ039xjT24V7f5JNm8vGXZbZeX+574kxRP+uS0TsH5Mp/33ttUuSTHnf6FcwPrRYq3ZJKlUstd++XyPv4ZxLpJkjSQWcL7xmP+ZUQxYx+bzxiJFUlnWvz8IGWtPj/+auYDP+0ryX9dYzH4uJWL+a+IC5nol/ddDkjJGne68Pda4sZXpKdr3c6rgP9/SMK4fd50VDAAAAAAA7wMbWwAAAABApLGxBQAAAABEGhtbAAAAAECksbEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARFpwju1+H5tn9slbWZgB8V9FI7srJNsrZmRMxQPGETfysAJiyFQKCGaqrfFnV1rX470+/vZY0s5ucyV/tlfPXjMDagRkWVkZmQEXNt/rD9WKGZlqklQywjydszPVVPT3ScTsHLJY3M66jSX8b9PeXvsesdLs4nF7rMmU/z4qFO3c5t3VqOqAzOJhUDvGzqndbrmAfNEdxIrlrc5W2UXGBPQx1Xlb95oyZRiOYZuy55475DjAcJo4abLZJyDq1GTltrqAXFcr2TUkxXY41o8hWbdlOX8+cEiOrbVsiwWsDZwzMu7HjDVrmIG6khJmTq1dpGAsmGMBr7C1fpQLuJmNaxYP+dwxZm/hYsaau2htIBSSdWyPNW7k6Ybcq6H4xBYAAAAAEGlsbAEAAAAAkcbGFgAAAAAQaWxsAQAAAACRxsYWAAAAABBpbGwBAAAAAJHGxhYAAAAAEGlsbAEAAAAAkWan+/azQ4tjMgKHQ0J840awdcwOi47HU972mBnybIdjFwPSxI08YklSMmmM1S4hZwQwu4R93UulrLe9srrWHkdIwnbBH8KcCDjjZNJ/21qB1JLMhPSQ0Opi0X+/h9xnIax7cTjOFwCAD0bIs9C/pgp5nlrrBxewBrWOEws4F3MtVLLXFyHnGzcWmUHrR+s4xppckkol/zo2mysLGEmAkrEWCiiRiBsL86B1m38czhinJJWse2B4lo/WUIflfHc1fGILAAAAAIg0NrYAAAAAgEhjYwsAAAAAiDQ2tgAAAACASGNjCwAAAACINDa2AAAAAIBIY2MLAAAAAIi04BxbM3NJdt6m1S4NT1pSoeDPFw0RN7JBrXYp8Hyta2ZWkEqFvLe9sbHRrDFqZJ23vbvbvqZxKx9MUirhv+V6jWxYaXheX8twZdAOC+seCchUHg7WNQm53wEAHy4huZ521npIfuz2KwVk2FtiRvZrLCBP18zCley1gV3BXNu3t7ebNSrKK7ztvXn7msYDrknCWHcXA/Ypw/H6WoZl+Thcyymjzo5atVnXZDiXj3xiCwAAAACINDa2AAAAAIBIY2MLAAAAAIg0NrYAAAAAgEhjYwsAAAAAiDQ2tgAAAACASGNjCwAAAACINDa2AAAAAIBIS4Z2dAHpuVYfKwg69Dg7gjXW2LAkMNvHCbkc76xZ7W1//Y1lZo395x3obW9oaDFrjK4ba/YZNWqkv0PACZfMsPftv4dC7sPhuAeCahh9hudOtO0q701gW1hPnWf+/CezxsfnHuBt35S3x1GVtvsAuyMX8Ey2Hy8h68ew8XzQnLVGiQ3PQEvWCQccprllo7d9/fo1Zo3Jk6d629vaOs0alZXVZp+KigpvezzguprLx2FZP9p9YsOwcgtaghp9dtz6cQcdSHxiCwAAAACIODa2AAAAAIBIY2MLAAAAAIg0NrYAAAAAgEhjYwsAAAAAiDQ2tgAAAACASGNjCwAAAACItOAc25AMWiuoaBeJGBu2DNrhEI8bGaUx+2cPq1a96W3/2/KX7YEUi97mstwIs8SEMRPMPr35Xm97PGG/NvbLt/2v73DkNsfjAT83CnhTWBmAw5G5OxwZtbvS+wro88Irb3jbn3v2CbtIr3/eqq4ab5aYPXOKfRxgNxT2fLGec7vG82VXeszFrcEY60tJ2rix0du+oWGtPRBjf5BOl5slaqtqzT7Fgn+dGrLkClhh2kUMQbnNRh/ztX2vyHZ3CRmrlbkbUmN7j7Et+MQWAAAAABBpbGwBAAAAAJHGxhYAAAAAEGlsbAEAAAAAkcbGFgAAAAAQaWxsAQAAAACRxsYWAAAAABBpbGwBAAAAAJGWDO0YCwkLNroE5Q0bOb9B4zCPsf1hwsNRQwo5H/s4pXyvt310TbVZwxW6vO1lZSmzxjvr7CDvcRMnetsrK+0gb+smGZ7XJiDG2+oSG6afGxmnUyr6w9Ele6whAdtxI+w9zs/JsAsqdvV426fWjzFrlPJt3vbq6qxZY1O32UVVdhkgcmIBz1PrCTQ860e7xvYeI6hGwPM2hHVdYwHHcYWit72yLGfXKPnXoOl0wqzRvKnV7FNTW+ttz2YzZg1z/Tgsr03A+tHssGPWj65krx+twYa8J2LG+jFkjgjFShQAAAAAEGlsbAEAAAAAkcbGFgAAAAAQaWxsAQAAAACRxsYWAAAAABBpbGwBAAAAAJHGxhYAAAAAEGlsbAEAAAAAkZYM7xoSnmsE8AYEDlsB2m4Y0rFjASndIX0spYDgY+s4iYQdbD1h/Hhv+5rlL5g1enq6vO3vrGswa0zd82Nmn2l77+Vt90eF/51xzQLips1E6VLJvs+swGlXtM8m7D4zjhNQwRiqXMA4zODyUtCrB+xQM/fe29v+2rMPmTU6Ozd5219ZsdKs8bGDjzf7HLDPJLMPsHsynkFB6zajw7CsH7e/UyxgPe1C1iDWJYvba+6amhpve3PD22aNQm+vv8amNrPGqNH23FdXP8bbHrT2My5a2C1irR8DhmG8NK4Ysn+wj7OrrB/ta7b9780+fGILAAAAAIg0NrYAAAAAgEhjYwsAAAAAiDQ2tgAAAACASGNjCwAAAACINDa2AAAAAIBIY2MLAAAAAIi04BzbRMLeA5dKVj5USC6XlYW7/fmywyFkHPGADDHrmoRkO40d68+xTWZyZo3nX3ref4yJU80aM/faw+yTiPlvORcQhWpm/9olZGVqBcQHKxH3d4qlArLqgt4T/otSKObNGiUjEy0W8DOukOw9YFdTXp7ytqfLK80aDzz6oLd9z333M2uQUYsPq7gVhKmA/NCQgFEz2HXXeIYFPUtDPnYyrknIJauurvG2J5L++VOS3lrjz7qtrh1l1hhbP9rsY65TQoJszYzhEMb6MeC1ixtBtsO3fvRflGLJXnRbmcoh9/OOXD/yiS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINLY2AIAAAAAIi05nMXicf8+uVgMCAI2AocTiYRZIzYMIdwhwceWkLH29vb6O8TsceQLBW97V6993TPZnLc9l83YNezTVcp4bYpG8LUkJY3rat2HkuScP7S6o6PNrNHQ3ORtb2uza/R0d5t94kn/6zd+/BizRm2tP/y8VLTfM/G4f7pwAUHfwK5mU7d//pSk8opKb3tlRflwDedDoyNguuhst/sk0v5n6IhcKnBE2JliMf9zu1TyP7MlSca6LWRtoO1fPipgGWOKG9dDkorGMzcWsH4sGtc1X7Sveyrlf4+lU/ZWIxnw0iSM9WPIut26rrF4wA1gHKenx17XtXV2eNu7A9aGBWPtL0mxuP/1q62pMmuUlfmffyHbpVjMv2631uTbgk9sAQAAAACRxsYWAAAAABBpbGwBAAAAAJHGxhYAAAAAEGlsbAEAAAAAkcbGFgAAAAAQaWxsAQAAAACRNqw5tlZ+bDJpH86qEZJlZmVZBUWMGZ1CMnmbmhrMPhUVFd72yko7Y6qpucXb/m7DRrNGtsyfw9jZYQcK/ukPvzf7fPLYEf7jdPWYNdasWeNt37Bhg1nj3XVrve1vvf03s8aGBv9xQnJsi0U7h0wxK8d2vFniE0d80tt+0IGHmzUyaeP9G5L/BuxgXUZU+PKVb5s1Kqprve2tLf5Ma0n67VNPmX0OP+IIs4+lvcvfvmrVW2aN5Ste97Yve/k5s8aqlau97RsbG80avYW82Ucx/xy6zz57myUWn/lVb/vsffa0x4HtYzw+4gn7c5iYUSQk59Ra+w1DRG3QOjZkzZXJZL3t2ay/XZI6Oju97a1t/rxVSUqmM972fI+9rlv1txVmn5mz/OvUfN6Y7CW1tLR429va7Oveuslfo6nZXoO2b/KvD7sDrlnJyDH+ey9va02t/9kmSXvtMdPbPnXqHmaNZNKfY2vt/bYFn9gCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINKSoR1DwnOt0OmgAF6jjx1rLZWK/sD2VMIeR9Los/zN5WaNNWvXmX0OOPAQb3u+1w5pfuHFF7ztTc0tZo3p08d628uy/gBuSVr20vNmn7Xvvuttb2zaaNZYtWqVt72jwx84LkmFgj/IOxazg68TRmB8SDi6VUOSnBHCvTrgXryveZO3fezo8WaNWbPmetu78vZ1B/q8+sbbZp999py43cd56JHHve1r3rXn6Xnz9vS2V1eUmTUee/QBs8/rb7zhbX9rzTtmjRdeeMHb3tLSatbI57u97bGY/xkrSalUwtteUVFh1kgm/TUkyRX9c/mLf/6jWeN7azd425f++DazRsB0/+EVsPZz1vpRATWMLs6sIJWM520ibo/DWmI2bGwwazS32u/TqVOne9sLxlpYkt5+xz8Pd3baz/W6umpvezqVMmusWWM/D1qMa9Le2WHW2NjoX2Pm83mzRrHov0diMXunEjfuo2TANYuH7KmcfyxNG9abJV7s6PK2V1fVmDXGjZvkbe8t2Nc9FJ/YAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAiLTjH1sqoHS5F508aKwbkNmUz/tMqdtr5YK+8tszbvvqt1WaN/fb/uNknk/aH37V1t9k1yv0Zs4d+/DCzxpjR/hzGhnVrzRob1zeZfV7+qz/rtrXdPt9i0X+PJOL2bZ0tq/TXCLjP4gn/OKwcR0lKp+2xJmL+OqWSnVWXyflrtHfY74m4kSnZ22mPA7uH7lZ/9t1Ly14yaxzw8WOGazheZTX+ue3zp51u1pg+1Z/TuHLF62aNd95cY/Z58vEHve3rmxrNGoWCf15KJtJmjYrqUf4aAfNjIuUfh/WclqRczh5rMu7PeywW7XzE8ip/jaYW+7qPq/dfsw8zVwpJkB2G4xhJtaWA2E/ruV3K+zM9Jenddf73+sYmf5aqJE2cPMPsk0z479vuXn8etSQljTXI9Bl7mDWqKv3v07ZNLWaN9k12Bu27a/1Zt1099vlaW5lYzP68z1q3B0QdyzpMwgpDlpRM2GvMuHEg5/yZvJKUTPtrdPfY74lY3F+jOIx7TD6xBQAAAABEGhtbAAAAAECksbEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECk2QnpfR2Tdlfn/OHYsYBQd1l9AmpsbNrgbX/p/z5j1mhvbfK27zvnY2aNsZPsgO1CyR+wnEvVmDWO/dSnve2ZmB18nM+3etsfffABs0Ysbt8jtbU13vZUxq7R3Z33trtSSMB2zl+jYIdWJxL++z0dcC7l5f5xSFKx6D9OvrfXrDFluv9enDRlqlmj5Pz3UU9Pj1kDu75ly5aZfZrWr/G2H3H0scM1nO224NCDPvBjrF/rf+ZIUiyRNvuMHVfvbc+U2zXa27u87a7of+ZIUlmu0l8jXzBrJJP++SIXcC61NVVmn96C/zhd3fa8NGfeAd72cfWjzBrYunjCfiY74zkXU8j60RhHwPqxvaPN275m9Ztmje6uDm/7uAmTzBrVI0abfUrOfz7pRJlZY9bsj3rbk/K/LpJUKPrnnFf/+lezRixm3yNlZf7zSSTtGr29/rWdM66pJCWTKX8H416WpHjc3yfkXDIZew4tlfzHKRTtte6oOv+9OGKkPT864z7qLdjPlFB8YgsAAAAAiDQ2tgAAAACASGNjCwAAAACINDa2AAAAAIBIY2MLAAAAAIg0NrYAAAAAgEhjYwsAAAAAiDQ2tgAAAACASEsOazUj1ziRsIPhnTOCjZ0/jF2SWtv8AdtVI+3g6zlz/YHt5bV1Zo22gBD7XNb/EpTydnhyKpXxtsdjdlh0WcofOL3f3EPNGps2dZt93n57ubc9FsuZNZIx/32UD7juVeVZb3siIAw+aQRol5X5XxdJSmXst2Dzpnb/cbJVZo2PzvHfz2PGTTRrtHd1etvLy8vNGtj11U2YavaZPXv2DhhJdBx55PFmnw0b/O9jSXr55We97fFYpVkjHfPPKV1debNGXU2Ftz0V8DPxdNo/T1dXl5k1MuVps8+7G5r846iwn9ULjj3Z7IOdKx6377mirPWjvRbq6u7xtmfL7ffghElTvO2ZMrtGTzFk7edft5UKdo1Ewj9f2CshKW2s7SdOmm7W6OrqNfs0Nzf4O8Ts+SIe868PCwV7j5FL+697POCqxRP+Pum0vTZMJO09VWe3f12eTtlr7gkTp3jbq2pqzRo9ef9zJ5O2X7tQfGILAAAAAIg0NrYAAAAAgEhjYwsAAAAAiDQ2tgAAAACASGNjCwAAAACINDa2AAAAAIBIY2MLAAAAAIi04BzbbiMLSZJ6e/05VNmsPztUknqMGgVn53LVjx3nbR87brxZw9LVY48jFrPzsLqKHd72eMnOwyrKn2XVHZDdFnf+XK6Ro+yc06nT9zD7tDav9bZ3B2Tuul7/tU/G7J/XpOL+61pdEZAXaeSMpTN2xlgiab++nXl/rl66zM4QGzfB/9qUAqYCF/fnkIXk3WHXV1/rzzDF+/Ox/Q80+zS8+7q3vT1gfiz1+HMa03F7Xsom/HPo6BEjzRq5nD+XMFfuf+ZIUiptzyqtRr52rnqsWWP8GDvrFu9fwVjXSVLRym21bxcVjBolZ6/Jqqur/e01NfZADL0BWakKeK+rZDyTQ0oYn2/1BqwfY8YatKLCXqOMqhtt9unqbPG2F0JOuOi/9iEZtAlj/ZjL2HudhDHHJlP2OjYg2ln5gv+1SabtPPHqGv9r4wI+I3Vx/3NpOD9l5RNbAAAAAECksbEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECksbEFAAAAAERaMrhjKiAd21Ao+AN6JSkmf8ByNpMxa7iYPzy5EBCOHU/4L00qIOhbpXazy9rVb3jbN21sNWtMnzHL256qHmnWSMgfKB13abPGHnvubfZ5681l3vYNPZ1mjfKc/x7o6vKHlktSPt/tbe8t2PfZ6DH+6zpiZI1Zo1Sy3xM9xv3c3m3fi12dXd72QsEfbC9JxjAUCwg2B7ZFSf738oZ1680aY+onDtdwtsuMqVPMPuPHj/e2r+qwnwe1lWXe9k1t/rlAkrq6/M+unrz/GJI0dbr/uo+fUG/WKBbtubwj5v/5fFO7PbdZMyifAGyfeCKx3TVKRfs5Zz2BUkl7HeuMIqWSf40qSTHjnkzE7RpyPWaXlo3++a+7w36v1432zzmJXLlZIyb/dY3H7ddu9Bh7PmhqXONtby/Y80U65V/b98qeLwqFXm97MWlvrSqrqr3t5eX2HOtcwFiNhVt3r30v9ub951sqBrwnhqFHKOZrAAAAAECksbEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECkBefYdnZ0mH0yRsZszArClJRK+POwnJFzK0lWxGw8HrCfN4rEknYuV3e3nSGWL/j7lNdUmjWyFf6csWRIhpzz56mWinZeVu2I0WafWR/Zz9v+dOO7Zo1Mwnj9rCA6SZu6/Llce8z+iFlj//3nedtD7rN83s6qK1u1wtv+5z/+0azxm/tu87YvOPEUs8a0vfx5ye1tbWYNYFt0lTZ522vrR+2gkewY8485ztv+s7f8ueeSVJ4yciedPS9t2OTP+T7w6GPMGocfcbTZZzhUj/+zt/3+e+42ayz9X9/ztp/3/12yTWPCQPkeO180aeSLBiwflYj51zoh68eY0SVkHSvjOLGAHNteIytVkgolf590Wdaskcykve0JI5P3Pf71oXP2+ZaX22vd8RP82dgr2u2c72Tcev3s17c77z/f0eMnmDWmTJnsH0XAfVYo+tftkpTe2OBtX71ypVnj1Zf8a8x9P/Ixs8aoMf685J5u/zNnW/CJLQAAAAAg0tjYAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAizZ+IvZli0R9ILEndRsBuMmkfLh7377Xz+YCgb+M4IeMo9PqDr2MJ+2cCZbkas89HPnqQt71UtI9TKvpDyeMBAdvWde/psYOgYzH7uu4zc463/cXn/EHQklSW8geKu1ibWSNb7Q8u/+SnTjZr5HL+Gr3GPSRJmUzG7BNL+K/r68uWmTXyXf73ZnPjerOG23OWt/2td+0awLYoj4/a2UPYoaqrx3nbR46caNfI5rztpVijWaNidIW3/fAjjjZr7Ch77jnX2z6i+jdmja5N7d729WvWmjXGjPe/dl1mBcn/ykVXyZXMPtbzMhH3r3MkKZaMeduLBXsdGzfWdgljrSQFrJcDaqRT9t0wYcJUb7sr2cdxzn/NYgGff8Vi/hoFZ6+FFLNf3/qx/vnv7VUrzRppYz3l5F8rSVIql/K2z5w9x66R8tcI2XOlAvYyMeNeW7dmjVmjmPe/fp3tm8waGjPe29zUGlAjEJ/YAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAiLTjHtrq62uxTKPizTkNymXp6erztVt5qyDhCaljZT84FZMMGpNJ1d/hzeZ0zSyiT8b+MAaerUsmfM5cysmMlyYgykyT1FPx1Ekl/fqIkjRw92tve2LLarDFnzv7e9opKOz+zt+DP9kqm/Tm3ktTZ7b/fJammZoy3PVNmvzfLyv0vTsrI5JWktq5Ob3uvs3PoALx/qfQIs8/Eqf5sy7fWvWjWOPbYhaFD2uWVVfvnT0mqrvHPj9lK+7lksdMxd98c21zOPrNS0b8GsdYokr32s/JWQ8YRUiMWMxZdRnbsezXsNVdv3n++Clg/JpP+53bIus4ZC9WEkR373oHsLoWitda11zEVlZXe9vbOjWaNiROneNszWXu+sPZDiaQ/51aS8sb9LklluSpvezJtvzfTaf+LkzAyeSWpO+/f6xSH8XNWPrEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECksbEFAAAAAEQaG1sAAAAAQKQFpCa/JyyU2gjxTfiDoEP6xOP2Xry3t9fbnjeCgoMEhEmnUnZIczLhD0eO25dMsbg/6DkWs4skk/5bwWqX7HB0yQ6Ujhlh4ZLUY7y+1SNGmDX2mzfP296Z7zFrWKHkqYDQahe3b6TyKv/5VNeMNmukjaGEBGwn0/7XZmx9nVkDwPsXS9vzcEd3t7d9zPjxZo299qoPHtOubkz9VLNPLuNvT2az2z2O2u2uEF2xkAWT0SVk7Rc3PqsJWccWi/71VLHgbw8ScDkSCeOmlJSI+Z/bAUs/KeZfxwSt/Y3XJhHw2hVLpYA+xlo3YY+1YLy+ufJys8bEyZO97dY6V5JkrB9D9ksu4D5K5/znk8tVmjWsZXksYKzxpH+w1VX2fikUn9gCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAijY0tAAAAACDS2NgCAAAAACItOMfWyuyU7ByqkBpW3lVIVqqVu5VKp80azvmzrvL5TrNGa6s/b1WSKiv8GaXt7S1mjc7uTd72kbVjzBrJpJ1jaukJyH7t7G73ttePtzNZR1ZXe9tTZR1mjXTOf+uXZGcdl+S/n0u9do1kQH5sqWQF/Nk1qmr8WWVWNrAkJZP+92Y2JDMPwPs2Yx87k3XiaP98n61uHq7hRENAHmhd/Shve6eRDSxJ5QHrig8rZzwrJXt9GLJ+jMf8z6iSkYMqSVZsazwkX9T518LFor026Oqyx5rNlHnbe3q6zBr5Xn+f8rIqs0bINbGErO3zvf41ZlWNPdaKXM7bnkjb69hk2n++Tva5WHdzycjblQKzbq0DBYQdZ8v8Od5WNrBk7+1S8WHIh/47PrEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECksbEFAAAAAEQaG1sAAAAAQKQlQzvmA8Kx8yV/KHV3lx0WHTdCfHsDQpyTRmhxNusPG5YkGSHdPca5SlLJHqqam1q87a/97XmzxuhxNd72USP94fOS5FzK297S0mrW6C102Mcp+YPux9SPN2vMmjnH2/7KK6+aNZa9+Bdv+177zjZrJOL++6wU8J4JiTVvaNjgbR85coRZo7Kqwtve0rbJrJGS/55P5gLeV8AwWrm+yewzdYz9/oiK6TP2Mfvk0v73+l5VE8wa65r88339iGqzxq5iwgT7mTKyzn+PrNvon4Mlqa6qKnhMHzbFgGdhoeTv09ubN2vEYv71Y7FUNGskjDVoKulfK703EH9zr3GukuQC1pgdnf419boNb5k1qqrLvO0VFf75RJLk/CuZLmOcklQs9diHcb3e9qqqGrPGuLETve3vvvuuWWPN2/7rOmacPefEY8ZNEsC+i6T2tjZve0VFuVkjm81427u6/et6SUoY68d4KuB9FYhPbAEAAAAAkcbGFgAAAAAQaWxsAQAAAACRxsYWAAAAABBpbGwBAAAAAJHGxhYAAAAAEGlsbAEAAAAAkcbGFgAAAAAQacnQji4gCrjkjADepD/EWZJiRmhxKr79Ib6Foh3SbZ1LKuEPtZakZKZg9nll2f/1tleWZ80aE8ZO9rZ3doWEJ/t/xuGc/TOQsjI76Lm7q9nbXl5ebdYolvz3wKTJ080af37+OW/7H55+xqxx8EEHe9tTafteLfba9+Lbb632ttePG2vWKCvz36/vrF1r1ugxQtbjCfteBbbF+nXrve0jayp20Eh2Dbn09p9vOm3P5ZtaN3nb16xtNGvMnWXPw8Nh7YZWb/v06RO3+xivvP663WnqlO0+zu7KXj3aa8xY3L5vrfVjImavQS1FY20oSa7kP5dEPG3WSMTs47y7xr82yGbsJX5N9Uhvez5vr2Nj5vrR/7pIUjqdMfv05ju97ZlMzqzhnP8eGDGyzqzx1lurvO1vrvibWWPatGne9kTCvldLRfseaWpq8rZXVdtr7nTaf782t/rnYEnqzfd62+PDsLfrrzVslQAAAAAA2AnY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAijY0tAAAAACDS2NgCAAAAACKNjS0AAAAAINKCc2zbWvxZSJKUyfhzqGIlOw+raGTMFkt2blOh15+XFMIZwWu5pJ3ZunyFPytVkja1vOlt/8iUT5g1Uqr0tieS9jWLGflu2aydUVos5c0+G5vbvO11o8aYNVzcP9ZcRZVZ48CDD/G2r179llmjWPLfq+Vp+x7p7PTnsknSuoYN3vZJU6aYNerq/NlsI9e+a9bYsNE/B4wbN8msAfTZsNZ+j21Y92dv+6z6k4drOLuEDmtOMea+4bLnVH/2q/1E2XFWrFzlbR9X99HtPsbEqTO2u8aHWXdnh9knmfIvR2MB+bFWrmfJWthJKhlr0BDWUdIBObYNDf6MWknq6vKvDSaM3MuskZB/3e4S9jWzcmxTxmsrSSVnX/f2zm5ve2XA2s8ZWcfpjL3WnTrdn9G90VgrSZIz7udk0s71zeftNfemNv+ae8RIf46xJFVW+vPTKwJybNs7/HNAdfUIs0YoPrEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECksbEFAAAAAEQaG1sAAAAAQKTZqcl/19jwrtmnstIfjtzQ0GDWiBvhyTW1tWaNjRs3ettdyQ76Lis3AonHlJk1OrrazT6ZTLm3PZcLCJwu+a+ZjGZJisX8Qc+Foh0E3WmEZ0vSpvZOb/u4ifZ1LRo/j7GCryUpnvQHpE+fPsMehxHk3tXVZdbo7rav2cRJU7ztmTL/vSpJ7Z09/mNM8QeOS5KMcPsNDf6w+PfYgfFRZL87JP8dJzW221USxvxYW54ya2zY5L/nSsZ9LUnVtf55y464l5rb7BD78vKagEq7jw1N/qD78lHDF2K/PXaln4jPmv3RD/wY40fZz2FsXXub/76WpGzWP2u0tbWZNWLGYqes3F5ftLd3+DsErC/SGf+5ZCutp4GU77XXBslkxtueSgfMxM5aP/qf++/1KXibA5bcyuf9NSSpu8f/jKypta9ryZq9Al7fWNy/daqrG22Pw7govb32eqC3t9fsUztipLc9lfbfQ5LUY7w2tSPrzBoybqP2Nnu/FGpXej4BAAAAALDN2NgCAAAAACKNjS0AAAAAINLY2AIAAAAAIo2NLQAAAAAg0tjYAgAAAAAijY0tAAAAACDSgnNsc2k7H7GrfZO3vbLMztQqFY1sp25/DqokVeT8uUy5bM6s4YzQpWSZnXU1drKdhdq+0Z/dlCm386EKRoaYSv4MU0nq6PRnSq5ds9asMWG8fb6zZs/2tqcyds6ciyX87QGZaYWS/5rFS3aWZzzu/7lQMmm/vSorK80+e++7r7fdBQQVW5lpFUauryQlE/7zjZcC8u52U/bVs42qsKsY02OQEVX+edj/7ho+e+41x+zTtGH4su0+SF2yM6tzsp87U3aRnNooGWFfVuxk6aQ9q/T2+HNbswFr0JLxDCoGZINm0v7ndjppj8N6EsbT9rOyeqSdhdrd7l/bJdP2+qIUMx4qzs5Kzef96/KWlhazRm2Nfb7jxo/3ticC1jEysuBdyf68r+SM9WNIFq4xjnjcfs9ks3af+nHjrJGYNZxxPhkj11eSEnH/cWJu+NaPfGILAAAAAIg0NrYAAAAAgEhjYwsAAAAAiDQ2tgAAAACASGNjCwAAAACINDa2AAAAAIBIY2MLAAAAAIg0NrYAAAAAgEizU3X/zgXsga1w5FLJDi3uzftDuku9/mBkSSovL/cfo2CPo1DyH6ejo9WsEU/a16xyxEhve1ePP/hakkoqetszKTu0um1Tl9HDDoJOpezg8kyZ/7Vxzr5mxYJxDwSEY8sIgw45F2fUSCbtt1fIe6LojGDreMDPpxL+sZRK/ntIkuIx/3HSafsewfbpNm79YtF+Haty2/86WUcZrjthRF3FMFX6oAU/SoEPHSf/M0ySYnH/e8gFPNeLxrqtEDA/ZjIZ4xj+574kFY2x9uSt9ZYUi9vXLGuudfNmDSf/WJMJezbv7rKOE7B/CDhOMu1fyzpjrSRJzlpzGeu6v3fytoaci3WYZDLgXALGat2uIfeZ9XxzMfu9GYv5j5MIWccG4hNbAAAAAECksbEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECkBYfv5Qt2XlKh0Ottj4fkFBlZZqmUnQ9l5X52dfuzciUplfQfZ/Xf3jJrNDU1mn0mTpjsbV+xvNmsUSr5z7eqaoRZY4IxjtGjzBJhOcVd/py5kHvESt0KycOycplD8kCtPiE1rMw8yc4hLhUDcpmN7N9kIuC9aWSmhbz+uyv7lZbyxuUJeQmsgNhsQJaw9Sq12dGHyhjR2Osa15s11qyx59B9Z37U297TE/I+9c8YddVZs4YlJzv3GviwKgRMkFaWupWD+V4n/ySaMPLcJalkrB97e/3r3PeO4x9H04Yms0ZHR7vZp7bWv7ZraOg0a1jZr7lsmVmjpnakt70yII48JJO1aDxEwzJZ/eIh95nzv74ha6GSETAbUiOZtO/npHHPB2XhGmvMeMh1Nw4TMo5QfGILAAAAAIg0NrYAAAAAgEhjYwsAAAAAiDQ2tgAAAACASGNjCwAAAACINDa2AAAAAIBIY2MLAAAAAIg0NrYAAAAAgEiLueFMxQUAAAAAYAfjE1sAAAAAQKSxsQUAAAAARBobWwAAAABApLGxBQAAAABEGhtbAAAAAECksbEFAAAAAEQaG1sAAAAAQKSxsQUAAAAARBobWwAAAABApP3/+jxK4pT1H2gAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "trigger value: [[0.691134393]]\n", "condition: [[0]]\n", "Chosen Path: [[\"Path 1\"]]\n", "1/1 [==============================] - 0s 73ms/step\n", "trigger value: [[0.90812844]]\n", "condition: [[1]]\n", "Chosen Path: [[\"Path 2\"]]\n", "1/1 [==============================] - 0s 20ms/step\n", "trigger value: [[0.41468063]]\n", "condition: [[0]]\n", "Chosen Path: [[\"Path 1\"]]\n", "1/1 [==============================] - 0s 21ms/step\n", "Actual label of image 20 in test dataset: Deer \n", " Predcited label of image 20: Deer \n", " Predcited label of brightened image: Airplane \n", " Predcited label of darkened image: Deer\n" ] } ], "source": [ "pp_model = tf.keras.models.load_model('./neural_parallel_path/cifar_10_pp_model')\n", "\n", "## Display and process a sample image for prediction\n", "image_sample_number = 20\n", "\n", "predict_image_sample(model=pp_model, image_number=image_sample_number)" ] }, { "cell_type": "code", "execution_count": null, "id": "13970df9-4cc5-4ec7-aa2c-e9238085bdcc", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "2797d41f-d110-451d-8649-66decd95ca86", "metadata": {}, "source": [ "#### access aia models:" ] }, { "cell_type": "code", "execution_count": 19, "id": "47c1d5b6-f768-46db-8994-6d43cf20bb11", "metadata": {}, "outputs": [], "source": [ "import boto3\n", "from botocore.config import Config\n", "import traceback" ] }, { "cell_type": "code", "execution_count": 20, "id": "74cb2ede-4a4a-40ca-a594-a09b44d3c2bc", "metadata": {}, "outputs": [], "source": [ "\n", "# Your credentials and the self-hosted S3 service endpoint\n", "access_key = 'at1-1004887-np-usr'\n", "secret_key = 'UNAUxUnhCmWdiQt4zl7b72QQqBJsiuOoFozGTgrl'\n", "endpoint_url = 'http://cloudstorage-colo.dell.com' # Replace with your S3-compatible endpoint\n", "\n", "# Create an S3 client\n", "s3_client = boto3.client(\n", " service_name='s3',\n", " aws_access_key_id=access_key,\n", " aws_secret_access_key=secret_key,\n", " endpoint_url=endpoint_url,\n", " config=Config(s3={'addressing_style': 'path'})\n", ")\n" ] }, { "cell_type": "code", "execution_count": 21, "id": "5da67d2e-09e2-48b5-b1f0-d7a601e4840c", "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "expected string or bytes-like object", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[21], line 6\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 5\u001b[0m bucket \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmlflow-mlp-npa-1\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m----> 6\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43ms3_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlist_buckets\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBuckets:\u001b[39m\u001b[38;5;124m\"\u001b[39m, response[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBuckets\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mRecursionError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/client.py:569\u001b[0m, in \u001b[0;36mClientCreator._create_api_method.._api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 565\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 566\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpy_operation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m() only accepts keyword arguments.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 567\u001b[0m )\n\u001b[1;32m 568\u001b[0m \u001b[38;5;66;03m# The \"self\" in this scope is referring to the BaseClient.\u001b[39;00m\n\u001b[0;32m--> 569\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_api_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/client.py:1005\u001b[0m, in \u001b[0;36mBaseClient._make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m 1001\u001b[0m maybe_compress_request(\n\u001b[1;32m 1002\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmeta\u001b[38;5;241m.\u001b[39mconfig, request_dict, operation_model\n\u001b[1;32m 1003\u001b[0m )\n\u001b[1;32m 1004\u001b[0m apply_request_checksum(request_dict)\n\u001b[0;32m-> 1005\u001b[0m http, parsed_response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1006\u001b[0m \u001b[43m \u001b[49m\u001b[43moperation_model\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrequest_dict\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrequest_context\u001b[49m\n\u001b[1;32m 1007\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1009\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmeta\u001b[38;5;241m.\u001b[39mevents\u001b[38;5;241m.\u001b[39memit(\n\u001b[1;32m 1010\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mafter-call.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mservice_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00moperation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 1011\u001b[0m http_response\u001b[38;5;241m=\u001b[39mhttp,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1014\u001b[0m context\u001b[38;5;241m=\u001b[39mrequest_context,\n\u001b[1;32m 1015\u001b[0m )\n\u001b[1;32m 1017\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m http\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m300\u001b[39m:\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/client.py:1029\u001b[0m, in \u001b[0;36mBaseClient._make_request\u001b[0;34m(self, operation_model, request_dict, request_context)\u001b[0m\n\u001b[1;32m 1027\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_make_request\u001b[39m(\u001b[38;5;28mself\u001b[39m, operation_model, request_dict, request_context):\n\u001b[1;32m 1028\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1029\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_endpoint\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmake_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_model\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrequest_dict\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1030\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 1031\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmeta\u001b[38;5;241m.\u001b[39mevents\u001b[38;5;241m.\u001b[39memit(\n\u001b[1;32m 1032\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mafter-call-error.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_service_model\u001b[38;5;241m.\u001b[39mservice_id\u001b[38;5;241m.\u001b[39mhyphenize()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00moperation_model\u001b[38;5;241m.\u001b[39mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 1033\u001b[0m exception\u001b[38;5;241m=\u001b[39me,\n\u001b[1;32m 1034\u001b[0m context\u001b[38;5;241m=\u001b[39mrequest_context,\n\u001b[1;32m 1035\u001b[0m )\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/endpoint.py:119\u001b[0m, in \u001b[0;36mEndpoint.make_request\u001b[0;34m(self, operation_model, request_dict)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmake_request\u001b[39m(\u001b[38;5;28mself\u001b[39m, operation_model, request_dict):\n\u001b[1;32m 114\u001b[0m logger\u001b[38;5;241m.\u001b[39mdebug(\n\u001b[1;32m 115\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMaking request for \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m with params: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 116\u001b[0m operation_model,\n\u001b[1;32m 117\u001b[0m request_dict,\n\u001b[1;32m 118\u001b[0m )\n\u001b[0;32m--> 119\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest_dict\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moperation_model\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/endpoint.py:200\u001b[0m, in \u001b[0;36mEndpoint._send_request\u001b[0;34m(self, request_dict, operation_model)\u001b[0m\n\u001b[1;32m 196\u001b[0m request \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcreate_request(request_dict, operation_model)\n\u001b[1;32m 197\u001b[0m success_response, exception \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_response(\n\u001b[1;32m 198\u001b[0m request, operation_model, context\n\u001b[1;32m 199\u001b[0m )\n\u001b[0;32m--> 200\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_needs_retry\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 201\u001b[0m \u001b[43m \u001b[49m\u001b[43mattempts\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 202\u001b[0m \u001b[43m \u001b[49m\u001b[43moperation_model\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 203\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest_dict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 204\u001b[0m \u001b[43m \u001b[49m\u001b[43msuccess_response\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 205\u001b[0m \u001b[43m \u001b[49m\u001b[43mexception\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 206\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 207\u001b[0m attempts \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 208\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_update_retries_context(context, attempts, success_response)\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/endpoint.py:352\u001b[0m, in \u001b[0;36mEndpoint._needs_retry\u001b[0;34m(self, attempts, operation_model, request_dict, response, caught_exception)\u001b[0m\n\u001b[1;32m 350\u001b[0m service_id \u001b[38;5;241m=\u001b[39m operation_model\u001b[38;5;241m.\u001b[39mservice_model\u001b[38;5;241m.\u001b[39mservice_id\u001b[38;5;241m.\u001b[39mhyphenize()\n\u001b[1;32m 351\u001b[0m event_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mneeds-retry.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mservice_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00moperation_model\u001b[38;5;241m.\u001b[39mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 352\u001b[0m responses \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_event_emitter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43memit\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 353\u001b[0m \u001b[43m \u001b[49m\u001b[43mevent_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 354\u001b[0m \u001b[43m \u001b[49m\u001b[43mresponse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mresponse\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 355\u001b[0m \u001b[43m \u001b[49m\u001b[43mendpoint\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 356\u001b[0m \u001b[43m \u001b[49m\u001b[43moperation\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moperation_model\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 357\u001b[0m \u001b[43m \u001b[49m\u001b[43mattempts\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattempts\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 358\u001b[0m \u001b[43m \u001b[49m\u001b[43mcaught_exception\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcaught_exception\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 359\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest_dict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 360\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 361\u001b[0m handler_response \u001b[38;5;241m=\u001b[39m first_non_none_response(responses)\n\u001b[1;32m 362\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m handler_response \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/hooks.py:412\u001b[0m, in \u001b[0;36mEventAliaser.emit\u001b[0;34m(self, event_name, **kwargs)\u001b[0m\n\u001b[1;32m 410\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21memit\u001b[39m(\u001b[38;5;28mself\u001b[39m, event_name, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 411\u001b[0m aliased_event_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_alias_event_name(event_name)\n\u001b[0;32m--> 412\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_emitter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43memit\u001b[49m\u001b[43m(\u001b[49m\u001b[43maliased_event_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/hooks.py:256\u001b[0m, in \u001b[0;36mHierarchicalEmitter.emit\u001b[0;34m(self, event_name, **kwargs)\u001b[0m\n\u001b[1;32m 245\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21memit\u001b[39m(\u001b[38;5;28mself\u001b[39m, event_name, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 246\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 247\u001b[0m \u001b[38;5;124;03m Emit an event by name with arguments passed as keyword args.\u001b[39;00m\n\u001b[1;32m 248\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[38;5;124;03m handlers.\u001b[39;00m\n\u001b[1;32m 255\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 256\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_emit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/hooks.py:239\u001b[0m, in \u001b[0;36mHierarchicalEmitter._emit\u001b[0;34m(self, event_name, kwargs, stop_on_response)\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m handler \u001b[38;5;129;01min\u001b[39;00m handlers_to_call:\n\u001b[1;32m 238\u001b[0m logger\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEvent \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m: calling handler \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m, event_name, handler)\n\u001b[0;32m--> 239\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mhandler\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 240\u001b[0m responses\u001b[38;5;241m.\u001b[39mappend((handler, response))\n\u001b[1;32m 241\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m stop_on_response \u001b[38;5;129;01mand\u001b[39;00m response \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/utils.py:1792\u001b[0m, in \u001b[0;36mS3RegionRedirectorv2.redirect_from_error\u001b[0;34m(self, request_dict, response, operation, **kwargs)\u001b[0m\n\u001b[1;32m 1790\u001b[0m bucket \u001b[38;5;241m=\u001b[39m request_dict[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcontext\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms3_redirect\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbucket\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 1791\u001b[0m client_region \u001b[38;5;241m=\u001b[39m request_dict[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcontext\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mclient_region\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m-> 1792\u001b[0m new_region \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_bucket_region\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbucket\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1794\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m new_region \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1795\u001b[0m logger\u001b[38;5;241m.\u001b[39mdebug(\n\u001b[1;32m 1796\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mS3 client configured for region \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mclient_region\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m but the \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1797\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbucket \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mbucket\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m is not in that region and the proper region \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1798\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcould not be automatically determined.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1799\u001b[0m )\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/utils.py:1861\u001b[0m, in \u001b[0;36mS3RegionRedirectorv2.get_bucket_region\u001b[0;34m(self, bucket, response)\u001b[0m\n\u001b[1;32m 1859\u001b[0m \u001b[38;5;66;03m# Finally, HEAD the bucket. No other choice sadly.\u001b[39;00m\n\u001b[1;32m 1860\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1861\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhead_bucket\u001b[49m\u001b[43m(\u001b[49m\u001b[43mBucket\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbucket\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1862\u001b[0m headers \u001b[38;5;241m=\u001b[39m response[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mResponseMetadata\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHTTPHeaders\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 1863\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ClientError \u001b[38;5;28;01mas\u001b[39;00m e:\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/client.py:569\u001b[0m, in \u001b[0;36mClientCreator._create_api_method.._api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 565\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 566\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpy_operation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m() only accepts keyword arguments.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 567\u001b[0m )\n\u001b[1;32m 568\u001b[0m \u001b[38;5;66;03m# The \"self\" in this scope is referring to the BaseClient.\u001b[39;00m\n\u001b[0;32m--> 569\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_api_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/client.py:964\u001b[0m, in \u001b[0;36mBaseClient._make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m 953\u001b[0m logger\u001b[38;5;241m.\u001b[39mdebug(\n\u001b[1;32m 954\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mWarning: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m() is deprecated\u001b[39m\u001b[38;5;124m'\u001b[39m, service_name, operation_name\n\u001b[1;32m 955\u001b[0m )\n\u001b[1;32m 956\u001b[0m request_context \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 957\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mclient_region\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmeta\u001b[38;5;241m.\u001b[39mregion_name,\n\u001b[1;32m 958\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mclient_config\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmeta\u001b[38;5;241m.\u001b[39mconfig,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 961\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124munsigned_payload\u001b[39m\u001b[38;5;124m'\u001b[39m: operation_model\u001b[38;5;241m.\u001b[39munsigned_payload,\n\u001b[1;32m 962\u001b[0m }\n\u001b[0;32m--> 964\u001b[0m api_params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_emit_api_params\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 965\u001b[0m \u001b[43m \u001b[49m\u001b[43mapi_params\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mapi_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 966\u001b[0m \u001b[43m \u001b[49m\u001b[43moperation_model\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moperation_model\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 967\u001b[0m \u001b[43m \u001b[49m\u001b[43mcontext\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest_context\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 968\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 969\u001b[0m (\n\u001b[1;32m 970\u001b[0m endpoint_url,\n\u001b[1;32m 971\u001b[0m additional_headers,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 974\u001b[0m operation_model, api_params, request_context\n\u001b[1;32m 975\u001b[0m )\n\u001b[1;32m 976\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m properties:\n\u001b[1;32m 977\u001b[0m \u001b[38;5;66;03m# Pass arbitrary endpoint info with the Request\u001b[39;00m\n\u001b[1;32m 978\u001b[0m \u001b[38;5;66;03m# for use during construction.\u001b[39;00m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/client.py:1083\u001b[0m, in \u001b[0;36mBaseClient._emit_api_params\u001b[0;34m(self, api_params, operation_model, context)\u001b[0m\n\u001b[1;32m 1075\u001b[0m responses \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmeta\u001b[38;5;241m.\u001b[39mevents\u001b[38;5;241m.\u001b[39memit(\n\u001b[1;32m 1076\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mprovide-client-params.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mservice_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00moperation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 1077\u001b[0m params\u001b[38;5;241m=\u001b[39mapi_params,\n\u001b[1;32m 1078\u001b[0m model\u001b[38;5;241m=\u001b[39moperation_model,\n\u001b[1;32m 1079\u001b[0m context\u001b[38;5;241m=\u001b[39mcontext,\n\u001b[1;32m 1080\u001b[0m )\n\u001b[1;32m 1081\u001b[0m api_params \u001b[38;5;241m=\u001b[39m first_non_none_response(responses, default\u001b[38;5;241m=\u001b[39mapi_params)\n\u001b[0;32m-> 1083\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmeta\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mevents\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43memit\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1084\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mbefore-parameter-build.\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mservice_id\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m.\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43moperation_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1085\u001b[0m \u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mapi_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1086\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moperation_model\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1087\u001b[0m \u001b[43m \u001b[49m\u001b[43mcontext\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcontext\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1088\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1089\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m api_params\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/hooks.py:412\u001b[0m, in \u001b[0;36mEventAliaser.emit\u001b[0;34m(self, event_name, **kwargs)\u001b[0m\n\u001b[1;32m 410\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21memit\u001b[39m(\u001b[38;5;28mself\u001b[39m, event_name, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 411\u001b[0m aliased_event_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_alias_event_name(event_name)\n\u001b[0;32m--> 412\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_emitter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43memit\u001b[49m\u001b[43m(\u001b[49m\u001b[43maliased_event_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/hooks.py:256\u001b[0m, in \u001b[0;36mHierarchicalEmitter.emit\u001b[0;34m(self, event_name, **kwargs)\u001b[0m\n\u001b[1;32m 245\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21memit\u001b[39m(\u001b[38;5;28mself\u001b[39m, event_name, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 246\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 247\u001b[0m \u001b[38;5;124;03m Emit an event by name with arguments passed as keyword args.\u001b[39;00m\n\u001b[1;32m 248\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[38;5;124;03m handlers.\u001b[39;00m\n\u001b[1;32m 255\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 256\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_emit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/hooks.py:239\u001b[0m, in \u001b[0;36mHierarchicalEmitter._emit\u001b[0;34m(self, event_name, kwargs, stop_on_response)\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m handler \u001b[38;5;129;01min\u001b[39;00m handlers_to_call:\n\u001b[1;32m 238\u001b[0m logger\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEvent \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m: calling handler \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m, event_name, handler)\n\u001b[0;32m--> 239\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mhandler\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 240\u001b[0m responses\u001b[38;5;241m.\u001b[39mappend((handler, response))\n\u001b[1;32m 241\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m stop_on_response \u001b[38;5;129;01mand\u001b[39;00m response \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/.local/lib/python3.10/site-packages/botocore/handlers.py:291\u001b[0m, in \u001b[0;36mvalidate_bucket_name\u001b[0;34m(params, **kwargs)\u001b[0m\n\u001b[1;32m 289\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 290\u001b[0m bucket \u001b[38;5;241m=\u001b[39m params[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBucket\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m--> 291\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[43mVALID_BUCKET\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msearch\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbucket\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m VALID_S3_ARN\u001b[38;5;241m.\u001b[39msearch(bucket):\n\u001b[1;32m 292\u001b[0m error_msg \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 293\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mInvalid bucket name \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mbucket\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m: Bucket name must match \u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 294\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mthe regex \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mVALID_BUCKET\u001b[38;5;241m.\u001b[39mpattern\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m or be an ARN matching \u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 295\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mthe regex \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mVALID_S3_ARN\u001b[38;5;241m.\u001b[39mpattern\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 296\u001b[0m )\n\u001b[1;32m 297\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ParamValidationError(report\u001b[38;5;241m=\u001b[39merror_msg)\n", "\u001b[0;31mTypeError\u001b[0m: expected string or bytes-like object" ] } ], "source": [ "# Now you can use s3_client to interact with your bucket\n", "# For example, list all buckets\n", "\n", "try:\n", " bucket = 'mlflow-mlp-npa-1'\n", " response = s3_client.list_buckets()\n", " print(\"Buckets:\", response['Buckets'])\n", "except RecursionError as e:\n", " traceback.print_exc()\n" ] }, { "cell_type": "code", "execution_count": null, "id": "b90a4a89-4951-4ddb-b21e-f136a9c17b2d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 22, "id": "6fc38233-27ae-4fa2-bcf1-0a9705604fd7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1201, 215, 540, 1614, 1698, 243, 1374, 1445, 236, 873, 1671, 222, 1049, 1502, 235, 1246, 590, 1394, 1246, 1471]\n" ] } ], "source": [ "import random\n", "\n", "# Generate 20 random numbers between 1 and 1769\n", "random_numbers = [random.randint(1, 1769) for _ in range(20)]\n", "\n", "print(random_numbers)" ] }, { "cell_type": "code", "execution_count": 23, "id": "c3fa61da-0b37-46d3-a338-3233250ede8f", "metadata": {}, "outputs": [], "source": [ "random_numbers.sort()" ] }, { "cell_type": "code", "execution_count": 24, "id": "9d498d8f-a737-4df1-a5ec-c862c32254bf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[215,\n", " 222,\n", " 235,\n", " 236,\n", " 243,\n", " 540,\n", " 590,\n", " 873,\n", " 1049,\n", " 1201,\n", " 1246,\n", " 1246,\n", " 1374,\n", " 1394,\n", " 1445,\n", " 1471,\n", " 1502,\n", " 1614,\n", " 1671,\n", " 1698]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_numbers" ] }, { "cell_type": "code", "execution_count": null, "id": "c54ef496-6374-40cf-8709-c0e257b973ec", "metadata": {}, "outputs": [], "source": [ "15,\n", " 22,\n", " 35,\n", " 74,\n", " 92,\n", " 1012,\n", " 1040,\n", " 1201,\n", " 1246,\n", " 1374,\n", " 1394,\n", " 1445,\n", " 1471,\n", " 1556,\n", " 1614" ] }, { "cell_type": "code", "execution_count": 25, "id": "e143d724-29db-4920-9177-8708b12f8ef0", "metadata": {}, "outputs": [], "source": [ "import os\n", "def gather_filepaths(directory):\n", " filepaths = []\n", " for dirpath, _, filenames in os.walk(directory):\n", " for filename in filenames:\n", " filepath = os.path.join(dirpath, filename)\n", " filepaths.append(filepath)\n", " return filepaths" ] }, { "cell_type": "code", "execution_count": 26, "id": "2c8ab77e-35a1-4acb-92d0-461a2c77acef", "metadata": {}, "outputs": [], "source": [ "# Example usage\n", "directory = './traditional_ml_modelscanning/hl_files'\n", "all_filepaths = gather_filepaths(directory)\n", "\n", "# Print the gathered file paths\n", "for path in all_filepaths:\n", " print(path)" ] }, { "cell_type": "code", "execution_count": null, "id": "c254ec5b-df27-4482-8695-fc5afe4d070a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "e1d670f9-14ad-45d0-97b2-fc43d28327e6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4e5f2511-a5fa-49ec-8747-5f3e4812f9ae", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "2854f711-be34-4077-8107-9d692c5e3882", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "7a091469-0b78-4676-9dd8-5794ca054c3f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "9a1044c9-d228-4be9-a197-f3ff0210f0bc", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d14eeefb-2ee0-45d6-9bf7-ae1d0290be05", "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.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }