From 5c51468740577e3ae2238130685ffa4eaa46771e Mon Sep 17 00:00:00 2001 From: GitHub Action <52708150+marcpinet@users.noreply.github.com> Date: Sun, 21 Apr 2024 15:14:04 +0200 Subject: [PATCH 1/3] docs: change examples to notebook --- .../mnist_loading_saved_model.ipynb | 220 ++++++++++ .../mnist_loading_saved_model.py | 38 -- .../simple_cancer_binary.ipynb | 336 +++++++++++++++ .../simple_cancer_binary.py | 70 ---- .../simple_diabete_regression.ipynb | 311 ++++++++++++++ .../simple_diabete_regression.py | 62 --- .../simple_mnist_multiclass.ipynb | 378 +++++++++++++++++ .../simple_mnist_multiclass.py | 74 ---- .../simple_cnn_classification_mnist.ipynb | 389 ++++++++++++++++++ .../simple_cnn_classification_mnist.py | 79 ---- neuralnetlib/model.py | 5 +- neuralnetlib/utils.py | 34 ++ 12 files changed, 1672 insertions(+), 324 deletions(-) create mode 100644 examples/classification-regression/mnist_loading_saved_model.ipynb delete mode 100644 examples/classification-regression/mnist_loading_saved_model.py create mode 100644 examples/classification-regression/simple_cancer_binary.ipynb delete mode 100644 examples/classification-regression/simple_cancer_binary.py create mode 100644 examples/classification-regression/simple_diabete_regression.ipynb delete mode 100644 examples/classification-regression/simple_diabete_regression.py create mode 100644 examples/classification-regression/simple_mnist_multiclass.ipynb delete mode 100644 examples/classification-regression/simple_mnist_multiclass.py create mode 100644 examples/cnn-classification/simple_cnn_classification_mnist.ipynb delete mode 100644 examples/cnn-classification/simple_cnn_classification_mnist.py diff --git a/examples/classification-regression/mnist_loading_saved_model.ipynb b/examples/classification-regression/mnist_loading_saved_model.ipynb new file mode 100644 index 0000000..718ebdf --- /dev/null +++ b/examples/classification-regression/mnist_loading_saved_model.ipynb @@ -0,0 +1,220 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# MNIST Loading Saved Model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:52:21.706906Z", + "start_time": "2024-04-21T12:52:18.726598200Z" + } + }, + "outputs": [], + "source": [ + "from tensorflow.keras.datasets import mnist # Dataset for testing\n", + "\n", + "from neuralnetlib.model import Model\n", + "from neuralnetlib.utils import one_hot_encode, train_test_split\n", + "from neuralnetlib.metrics import accuracy_score, confusion_matrix" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Loading the MNIST dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:52:21.915810200Z", + "start_time": "2024-04-21T12:52:21.706906Z" + } + }, + "outputs": [], + "source": [ + "(x_train, y_train), (x_test, y_test) = mnist.load_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:52:22.072282500Z", + "start_time": "2024-04-21T12:52:21.916810900Z" + } + }, + "outputs": [], + "source": [ + "x_train = x_train.reshape(-1, 28 * 28) / 255.0\n", + "x_test = x_test.reshape(-1, 28 * 28) / 255.0\n", + "y_train = one_hot_encode(y_train, num_classes=10)\n", + "y_test = one_hot_encode(y_test, num_classes=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Split the training data into training and validation sets" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:52:22.233389700Z", + "start_time": "2024-04-21T12:52:22.073284800Z" + } + }, + "outputs": [], + "source": [ + "_, x_val, _, y_val = train_test_split(x_train, y_train, test_size=0.2, random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Load the model" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:52:22.258467800Z", + "start_time": "2024-04-21T12:52:22.234388100Z" + } + }, + "outputs": [], + "source": [ + "model = Model.load('my_mnist_model.npz')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Predict and evaluate on the validation set" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:52:22.323518700Z", + "start_time": "2024-04-21T12:52:22.257467100Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Validation Accuracy: 0.899\n" + ] + } + ], + "source": [ + "y_pred_val = model.predict(x_val)\n", + "accuracy_val = accuracy_score(y_pred_val, y_val)\n", + "print(f'Validation Accuracy: {accuracy_val}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Optionally, you can still evaluate on the test set" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:52:22.393768500Z", + "start_time": "2024-04-21T12:52:22.318518600Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test Accuracy: 0.8863\n", + "Confusion Matrix:\n", + "[[ 937 0 0 1 11 7 2 18 1 3]\n", + " [ 0 1097 3 4 0 3 2 4 19 3]\n", + " [ 13 9 858 36 26 1 23 38 16 12]\n", + " [ 8 6 18 899 2 33 2 16 12 14]\n", + " [ 1 0 1 0 944 0 7 2 1 26]\n", + " [ 19 0 0 82 30 701 12 5 23 20]\n", + " [ 18 2 0 0 70 15 849 1 2 1]\n", + " [ 0 9 10 5 15 0 0 945 4 40]\n", + " [ 6 22 3 3 37 26 9 2 803 63]\n", + " [ 3 2 1 11 137 2 0 15 8 830]]\n" + ] + } + ], + "source": [ + "y_pred_test = model.predict(x_test)\n", + "accuracy_test = accuracy_score(y_pred_test, y_test)\n", + "print(f'Test Accuracy: {accuracy_test}')\n", + "print(f'Confusion Matrix:\\n{confusion_matrix(y_pred_test, y_test)}')" + ] + } + ], + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/classification-regression/mnist_loading_saved_model.py b/examples/classification-regression/mnist_loading_saved_model.py deleted file mode 100644 index d506791..0000000 --- a/examples/classification-regression/mnist_loading_saved_model.py +++ /dev/null @@ -1,38 +0,0 @@ -from sklearn.model_selection import train_test_split -from tensorflow.keras.datasets import mnist - -from neuralnetlib.metrics import accuracy_score, confusion_matrix -from neuralnetlib.model import Model -from neuralnetlib.utils import one_hot_encode - - -def main(): - # 1. Loading the MNIST dataset - (x_train, y_train), (x_test, y_test) = mnist.load_data() - - # 2. Preprocessing - x_train = x_train.reshape(-1, 28 * 28) / 255.0 - x_test = x_test.reshape(-1, 28 * 28) / 255.0 - y_train = one_hot_encode(y_train, num_classes=10) - y_test = one_hot_encode(y_test, num_classes=10) - - # 3. Split the training data into training and validation sets - _, x_val, _, y_val = train_test_split(x_train, y_train, test_size=0.2, random_state=42) - - # 4. Load the model - model: Model = Model.load('my_mnist_model.npz') - - # 5. Predict and evaluate on the validation set - y_pred_val = model.predict(x_val) - accuracy_val = accuracy_score(y_pred_val, y_val) - print(f'Validation Accuracy: {accuracy_val}') - - # 6. Optionally, you can still evaluate on the test set - y_pred_test = model.predict(x_test) - accuracy_test = accuracy_score(y_pred_test, y_test) - print(f'Test Accuracy: {accuracy_test}') - print(f'Confusion Matrix:\n{confusion_matrix(y_pred_test, y_test)}') - - -if __name__ == '__main__': - main() diff --git a/examples/classification-regression/simple_cancer_binary.ipynb b/examples/classification-regression/simple_cancer_binary.ipynb new file mode 100644 index 0000000..ab0f31b --- /dev/null +++ b/examples/classification-regression/simple_cancer_binary.ipynb @@ -0,0 +1,336 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simple cancer binary classification" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:15.070975300Z", + "start_time": "2024-04-21T12:58:13.242684600Z" + } + }, + "outputs": [], + "source": [ + "from sklearn.datasets import load_breast_cancer\n", + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "from neuralnetlib.activations import Sigmoid, ReLU\n", + "from neuralnetlib.layers import Input, Activation, Dense\n", + "from neuralnetlib.losses import BinaryCrossentropy\n", + "from neuralnetlib.model import Model\n", + "from neuralnetlib.optimizers import Adam\n", + "from neuralnetlib.metrics import accuracy_score, f1_score, recall_score, precision_score\n", + "from neuralnetlib.utils import train_test_split" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Loading a dataset (in this case, Breast Cancer dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:15.071976700Z", + "start_time": "2024-04-21T12:58:14.916652300Z" + } + }, + "outputs": [], + "source": [ + "data = load_breast_cancer()\n", + "X, y = data.data, data.target" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:15.071976700Z", + "start_time": "2024-04-21T12:58:14.938959600Z" + } + }, + "outputs": [], + "source": [ + "x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "scaler = StandardScaler()\n", + "x_train = scaler.fit_transform(x_train)\n", + "x_test = scaler.transform(x_test)\n", + "y_train = y_train.reshape(-1, 1)\n", + "y_test = y_test.reshape(-1, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Model definition" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:15.072974200Z", + "start_time": "2024-04-21T12:58:14.948473300Z" + } + }, + "outputs": [], + "source": [ + "input_neurons = x_train.shape[1:][0] # Cancer dataset has 30 features\n", + "num_hidden_layers = 5 # Number of hidden layers\n", + "hidden_neurons = 100 # Number of neurons in each hidden layer\n", + "output_neurons = 1 # Binary classification-regression\n", + "\n", + "model = Model()\n", + "model.add(Input(input_neurons))\n", + "model.add(Dense(hidden_neurons, weights_init='he', random_state=42))\n", + "model.add(Activation(ReLU()))\n", + "\n", + "for _ in range(num_hidden_layers - 1):\n", + " model.add(Dense(hidden_neurons, weights_init='he', random_state=42))\n", + " model.add(Activation(ReLU()))\n", + "\n", + "model.add(Dense(output_neurons, random_state=42))\n", + "model.add(Activation(Sigmoid()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Model compilation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:15.073976600Z", + "start_time": "2024-04-21T12:58:14.957996100Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model\n", + "-------------------------------------------------\n", + "Layer 1: Input(input_shape=(30,))\n", + "Layer 2: Dense(units=100)\n", + "Layer 3: Activation(ReLU)\n", + "Layer 4: Dense(units=100)\n", + "Layer 5: Activation(ReLU)\n", + "Layer 6: Dense(units=100)\n", + "Layer 7: Activation(ReLU)\n", + "Layer 8: Dense(units=100)\n", + "Layer 9: Activation(ReLU)\n", + "Layer 10: Dense(units=100)\n", + "Layer 11: Activation(ReLU)\n", + "Layer 12: Dense(units=1)\n", + "Layer 13: Activation(Sigmoid)\n", + "-------------------------------------------------\n", + "Loss function: BinaryCrossentropy\n", + "Optimizer: Adam(learning_rate=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)\n", + "-------------------------------------------------\n" + ] + } + ], + "source": [ + "model.compile(loss_function=BinaryCrossentropy(), optimizer=Adam(learning_rate=0.0001))\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Model training" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:15.898121100Z", + "start_time": "2024-04-21T12:58:14.985368600Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[==============================] 100% Epoch 1/20 - loss: 0.6860 - accuracy_score: 0.6308 - 0.06s\n", + "[==============================] 100% Epoch 2/20 - loss: 0.6677 - accuracy_score: 0.7055 - 0.04s\n", + "[==============================] 100% Epoch 3/20 - loss: 0.6323 - accuracy_score: 0.8066 - 0.05s\n", + "[==============================] 100% Epoch 4/20 - loss: 0.5702 - accuracy_score: 0.8901 - 0.04s\n", + "[==============================] 100% Epoch 5/20 - loss: 0.4731 - accuracy_score: 0.9143 - 0.04s\n", + "[==============================] 100% Epoch 6/20 - loss: 0.3540 - accuracy_score: 0.9297 - 0.04s\n", + "[==============================] 100% Epoch 7/20 - loss: 0.2499 - accuracy_score: 0.9429 - 0.04s\n", + "[==============================] 100% Epoch 8/20 - loss: 0.1816 - accuracy_score: 0.9473 - 0.05s\n", + "[==============================] 100% Epoch 9/20 - loss: 0.1418 - accuracy_score: 0.9648 - 0.05s\n", + "[==============================] 100% Epoch 10/20 - loss: 0.1182 - accuracy_score: 0.9714 - 0.05s\n", + "[==============================] 100% Epoch 11/20 - loss: 0.1034 - accuracy_score: 0.9758 - 0.05s\n", + "[==============================] 100% Epoch 12/20 - loss: 0.0927 - accuracy_score: 0.9758 - 0.05s\n", + "[==============================] 100% Epoch 13/20 - loss: 0.0844 - accuracy_score: 0.9802 - 0.04s\n", + "[==============================] 100% Epoch 14/20 - loss: 0.0777 - accuracy_score: 0.9802 - 0.04s\n", + "[==============================] 100% Epoch 15/20 - loss: 0.0722 - accuracy_score: 0.9824 - 0.04s\n", + "[==============================] 100% Epoch 16/20 - loss: 0.0675 - accuracy_score: 0.9846 - 0.04s\n", + "[==============================] 100% Epoch 17/20 - loss: 0.0635 - accuracy_score: 0.9890 - 0.06s\n", + "[==============================] 100% Epoch 18/20 - loss: 0.0600 - accuracy_score: 0.9890 - 0.04s\n", + "[==============================] 100% Epoch 19/20 - loss: 0.0569 - accuracy_score: 0.9890 - 0.04s\n", + "[==============================] 100% Epoch 20/20 - loss: 0.0542 - accuracy_score: 0.9912 - 0.04s\n" + ] + } + ], + "source": [ + "model.train(x_train, y_train, epochs=20, batch_size=48, metrics=[accuracy_score], random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Model evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:15.909122600Z", + "start_time": "2024-04-21T12:58:15.897122100Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test loss: 0.06351246680217817\n" + ] + } + ], + "source": [ + "loss = model.evaluate(x_test, y_test)\n", + "print(f'Test loss: {loss}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Model prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:15.926122700Z", + "start_time": "2024-04-21T12:58:15.909122600Z" + } + }, + "outputs": [], + "source": [ + "y_pred = model.predict(x_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Printing some metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:15.960120500Z", + "start_time": "2024-04-21T12:58:15.915125800Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.9736842105263158\n", + "Precision: 0.9741062479117941\n", + "Recall: 0.9692460317460317\n", + "F1 Score: 0.9716700622635057\n" + ] + } + ], + "source": [ + "accuracy = accuracy_score(y_pred, y_test)\n", + "precision = precision_score(y_pred, y_test)\n", + "recall = recall_score(y_pred, y_test)\n", + "f1 = f1_score(y_pred, y_test)\n", + "\n", + "print(f\"Accuracy: {accuracy}\")\n", + "print(f\"Precision: {precision}\")\n", + "print(f\"Recall: {recall}\")\n", + "print(f\"F1 Score: {f1}\")" + ] + } + ], + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/classification-regression/simple_cancer_binary.py b/examples/classification-regression/simple_cancer_binary.py deleted file mode 100644 index c3d8a82..0000000 --- a/examples/classification-regression/simple_cancer_binary.py +++ /dev/null @@ -1,70 +0,0 @@ -from sklearn.datasets import load_breast_cancer -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import StandardScaler - -from neuralnetlib.activations import Sigmoid, ReLU -from neuralnetlib.layers import Input, Activation, Dense -from neuralnetlib.losses import BinaryCrossentropy -from neuralnetlib.metrics import accuracy_score, f1_score, recall_score, precision_score -from neuralnetlib.model import Model -from neuralnetlib.optimizers import Adam - - -def main(): - # 1. Loading a dataset (in this case, Breast Cancer dataset) - data = load_breast_cancer() - X, y = data.data, data.target - - # 2. Preprocessing - x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) - scaler = StandardScaler() - x_train = scaler.fit_transform(x_train) - x_test = scaler.transform(x_test) - y_train = y_train.reshape(-1, 1) - y_test = y_test.reshape(-1, 1) - - # 4. Model definition - input_neurons = x_train.shape[1:][0] # Cancer dataset has 30 features - num_hidden_layers = 5 # Number of hidden layers - hidden_neurons = 100 # Number of neurons in each hidden layer - output_neurons = 1 # Binary classification-regression - - model = Model() - model.add(Input(input_neurons)) - model.add(Dense(hidden_neurons, weights_init='he', random_state=42)) - model.add(Activation(ReLU())) - - for _ in range(num_hidden_layers - 1): - model.add(Dense(hidden_neurons, weights_init='he', random_state=42)) - model.add(Activation(ReLU())) - - model.add(Dense(output_neurons, random_state=42)) - model.add(Activation(Sigmoid())) - - # 5. Model compilation - model.compile(loss_function=BinaryCrossentropy(), optimizer=Adam(learning_rate=0.0001)) - - # 6. Model training - model.train(x_train, y_train, epochs=20, batch_size=48, metrics=[accuracy_score], random_state=42) - - # 7. Model evaluation - loss = model.evaluate(x_test, y_test) - print(f'Test loss: {loss}') - - # 8. Model prediction - y_pred = model.predict(x_test) - - # 9. Printing some metrics - accuracy = accuracy_score(y_pred, y_test) - precision = precision_score(y_pred, y_test) - recall = recall_score(y_pred, y_test) - f1 = f1_score(y_pred, y_test) - - print(f"Accuracy: {accuracy}") - print(f"Precision: {precision}") - print(f"Recall: {recall}") - print(f"F1 Score: {f1}") - - -if __name__ == '__main__': - main() diff --git a/examples/classification-regression/simple_diabete_regression.ipynb b/examples/classification-regression/simple_diabete_regression.ipynb new file mode 100644 index 0000000..6800376 --- /dev/null +++ b/examples/classification-regression/simple_diabete_regression.ipynb @@ -0,0 +1,311 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simple diabete regression " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:42.208044400Z", + "start_time": "2024-04-21T12:58:41.563710800Z" + } + }, + "outputs": [], + "source": [ + "from sklearn.datasets import load_diabetes\n", + "from sklearn.preprocessing import MinMaxScaler, StandardScaler\n", + "\n", + "\n", + "from neuralnetlib.activations import Linear, LeakyReLU\n", + "from neuralnetlib.layers import Input, Dense, Activation\n", + "from neuralnetlib.losses import MeanSquaredError, MeanAbsoluteError\n", + "from neuralnetlib.model import Model\n", + "from neuralnetlib.optimizers import Adam\n", + "from neuralnetlib.utils import train_test_split" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Loading a dataset (in this case, the diabetes dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:42.240734100Z", + "start_time": "2024-04-21T12:58:42.210041800Z" + } + }, + "outputs": [], + "source": [ + "x, y = load_diabetes(return_X_y=True)\n", + "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:42.249254500Z", + "start_time": "2024-04-21T12:58:42.239316100Z" + } + }, + "outputs": [], + "source": [ + "scaler_x = MinMaxScaler()\n", + "x_train = scaler_x.fit_transform(x_train)\n", + "x_test = scaler_x.transform(x_test)\n", + "scaler_y = StandardScaler()\n", + "y_train = scaler_y.fit_transform(y_train.reshape(-1, 1)).flatten()\n", + "y_test = scaler_y.transform(y_test.reshape(-1, 1)).flatten()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Model definition" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:42.256446500Z", + "start_time": "2024-04-21T12:58:42.251389300Z" + } + }, + "outputs": [], + "source": [ + "input_neurons = x_train.shape[1:][0]\n", + "num_hidden_layers = 2\n", + "hidden_neurons = 2\n", + "output_neurons = 1\n", + "\n", + "model = Model()\n", + "model.add(Input(input_neurons))\n", + "model.add(Dense(hidden_neurons, weights_init='he', random_state=42))\n", + "model.add(Activation(LeakyReLU()))\n", + "\n", + "for _ in range(num_hidden_layers - 1):\n", + " model.add(Dense(hidden_neurons, weights_init='he', random_state=42))\n", + " model.add(Activation(LeakyReLU()))\n", + "\n", + "model.add(Dense(output_neurons, random_state=42))\n", + "model.add(Activation(Linear()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Model compilation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:42.279592100Z", + "start_time": "2024-04-21T12:58:42.258549800Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model\n", + "-------------------------------------------------\n", + "Layer 1: Input(input_shape=(10,))\n", + "Layer 2: Dense(units=2)\n", + "Layer 3: Activation(LeakyReLU)\n", + "Layer 4: Dense(units=2)\n", + "Layer 5: Activation(LeakyReLU)\n", + "Layer 6: Dense(units=1)\n", + "Layer 7: Activation(Linear)\n", + "-------------------------------------------------\n", + "Loss function: MeanSquaredError\n", + "Optimizer: Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)\n", + "-------------------------------------------------\n" + ] + } + ], + "source": [ + "model.compile(loss_function=MeanSquaredError(), optimizer=Adam(learning_rate=0.001))\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Model training" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:42.421362900Z", + "start_time": "2024-04-21T12:58:42.281678Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[==============================] 100% Epoch 1/10 - loss: 1.2716 - - 0.01s\n", + "[==============================] 100% Epoch 2/10 - loss: 1.2699 - - 0.01s\n", + "[==============================] 100% Epoch 3/10 - loss: 1.2680 - - 0.01s\n", + "[==============================] 100% Epoch 4/10 - loss: 1.2659 - - 0.01s\n", + "[==============================] 100% Epoch 5/10 - loss: 1.2636 - - 0.01s\n", + "[==============================] 100% Epoch 6/10 - loss: 1.2612 - - 0.01s\n", + "[==============================] 100% Epoch 7/10 - loss: 1.2587 - - 0.01s\n", + "[==============================] 100% Epoch 8/10 - loss: 1.2560 - - 0.01s\n", + "[==============================] 100% Epoch 9/10 - loss: 1.2531 - - 0.01s\n", + "[==============================] 100% Epoch 10/10 - loss: 1.2501 - - 0.01s\n" + ] + } + ], + "source": [ + "model.train(x_train, y_train, epochs=10, batch_size=32, random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Model evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:42.422436100Z", + "start_time": "2024-04-21T12:58:42.395311800Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test loss: 1.0980764954172244 function=MeanSquaredError\n" + ] + } + ], + "source": [ + "loss = model.evaluate(x_test, y_test)\n", + "print(f'Test loss: {loss}', \"function=\" + model.loss_function.__class__.__name__)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Model prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:42.435843800Z", + "start_time": "2024-04-21T12:58:42.400690600Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAE: 0.8728417081866269\n" + ] + } + ], + "source": [ + "y_pred = model.predict(x_test)\n", + "print(\"MAE: \", MeanAbsoluteError()(y_test, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Printing some metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T12:58:42.486010400Z", + "start_time": "2024-04-21T12:58:42.416724800Z" + } + }, + "outputs": [], + "source": [ + "# 8. We don't print metrics such as accuracy or f1-score because this is a regression problem\n", + "# not a classification-regression one." + ] + } + ], + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/classification-regression/simple_diabete_regression.py b/examples/classification-regression/simple_diabete_regression.py deleted file mode 100644 index dc3b9b9..0000000 --- a/examples/classification-regression/simple_diabete_regression.py +++ /dev/null @@ -1,62 +0,0 @@ -from sklearn.datasets import load_diabetes -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import MinMaxScaler, StandardScaler - -from neuralnetlib.activations import Linear, LeakyReLU -from neuralnetlib.layers import Input, Dense, Activation -from neuralnetlib.losses import MeanSquaredError, MeanAbsoluteError -from neuralnetlib.model import Model -from neuralnetlib.optimizers import Adam - - -def main(): - # 1. Loading a dataset (in this case, the diabetes dataset) - x, y = load_diabetes(return_X_y=True) - x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) - - # 2. Preprocessing the dataset - scaler_x = MinMaxScaler() - x_train = scaler_x.fit_transform(x_train) - x_test = scaler_x.transform(x_test) - scaler_y = StandardScaler() - y_train = scaler_y.fit_transform(y_train.reshape(-1, 1)).flatten() - y_test = scaler_y.transform(y_test.reshape(-1, 1)).flatten() - - # 3. Model definition - input_neurons = x_train.shape[1:][0] - num_hidden_layers = 2 - hidden_neurons = 2 - output_neurons = 1 - - model = Model() - model.add(Input(input_neurons)) - model.add(Dense(hidden_neurons, weights_init='he', random_state=42)) - model.add(Activation(LeakyReLU())) - - for _ in range(num_hidden_layers - 1): - model.add(Dense(hidden_neurons, weights_init='he', random_state=42)) - model.add(Activation(LeakyReLU())) - - model.add(Dense(output_neurons, random_state=42)) - model.add(Activation(Linear())) - - # 4. Model compilation - model.compile(loss_function=MeanSquaredError(), optimizer=Adam(learning_rate=0.001)) - - # 5. Model training - model.train(x_train, y_train, epochs=10, batch_size=32, random_state=42) - - # 6. Model evaluation - loss = model.evaluate(x_test, y_test) - print(f'Test loss: {loss}', "function=" + model.loss_function.__class__.__name__) - - # 7. Model prediction and a loss metric (specific to regression) - y_pred = model.predict(x_test) - print("MAE: ", MeanAbsoluteError()(y_test, y_pred)) - - # 8. We won't print metrics such as accuracy or f1-score because this is a regression problem - # not a classification-regression one. - - -if __name__ == '__main__': - main() diff --git a/examples/classification-regression/simple_mnist_multiclass.ipynb b/examples/classification-regression/simple_mnist_multiclass.ipynb new file mode 100644 index 0000000..6d25eb1 --- /dev/null +++ b/examples/classification-regression/simple_mnist_multiclass.ipynb @@ -0,0 +1,378 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simple MNIST multiclass classification" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:09:57.920117100Z", + "start_time": "2024-04-21T13:09:53.090418500Z" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from tensorflow.keras.datasets import mnist\n", + "\n", + "from neuralnetlib.activations import Sigmoid, Softmax\n", + "from neuralnetlib.layers import Input, Dense, Activation\n", + "from neuralnetlib.losses import CategoricalCrossentropy\n", + "from neuralnetlib.model import Model\n", + "from neuralnetlib.optimizers import SGD\n", + "from neuralnetlib.utils import one_hot_encode\n", + "from neuralnetlib.metrics import accuracy_score, f1_score, recall_score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Loading a dataset (in this case, MNIST)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:09:58.104511Z", + "start_time": "2024-04-21T13:09:57.923629Z" + } + }, + "outputs": [], + "source": [ + "(x_train, y_train), (x_test, y_test) = mnist.load_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:09:58.215354700Z", + "start_time": "2024-04-21T13:09:58.105511Z" + } + }, + "outputs": [], + "source": [ + "x_train = x_train.reshape(-1, 28 * 28) / 255.0 # Normalization and flattening of the images\n", + "x_test = x_test.reshape(-1, 28 * 28) / 255.0 # Normalization and flattening of the images\n", + "y_train = one_hot_encode(y_train, num_classes=10) # One-hot encoding of the labels\n", + "y_test = one_hot_encode(y_test, num_classes=10) # One-hot encoding of the labels" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Model definition" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:09:58.222377500Z", + "start_time": "2024-04-21T13:09:58.217869300Z" + } + }, + "outputs": [], + "source": [ + "input_neurons = x_train.shape[1:][0] # MNIST images are 28x28\n", + "num_hidden_layers = 2 # Number of hidden layers\n", + "hidden_neurons = 30 # Number of neurons in each hidden layer\n", + "output_neurons = 10 # Assuming 10 classes for MNIST\n", + "\n", + "model = Model()\n", + "model.add(Input(input_neurons))\n", + "model.add(Dense(hidden_neurons, weights_init='lecun', random_state=42)) # First hidden layer\n", + "model.add(Activation(Sigmoid())) # ...and its function activation\n", + "\n", + "for _ in range(num_hidden_layers - 1): # Add the rest of the hidden layers\n", + " model.add(Dense(hidden_neurons, weights_init='lecun',\n", + " random_state=42)) # Hidden layer must have the same number of neurons as the previous one\n", + " model.add(Activation(Sigmoid())) # ...and its function activation\n", + "\n", + "model.add(Dense(output_neurons, random_state=42)) # Output layer\n", + "model.add(Activation(Softmax())) # ...and its function activation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Model compilation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:09:58.255484400Z", + "start_time": "2024-04-21T13:09:58.223384700Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model\n", + "-------------------------------------------------\n", + "Layer 1: Input(input_shape=(784,))\n", + "Layer 2: Dense(units=30)\n", + "Layer 3: Activation(Sigmoid)\n", + "Layer 4: Dense(units=30)\n", + "Layer 5: Activation(Sigmoid)\n", + "Layer 6: Dense(units=10)\n", + "Layer 7: Activation(Softmax)\n", + "-------------------------------------------------\n", + "Loss function: CategoricalCrossentropy\n", + "Optimizer: SGD(learning_rate=0.1)\n", + "-------------------------------------------------\n" + ] + } + ], + "source": [ + "model.compile(loss_function=CategoricalCrossentropy(), optimizer=SGD(learning_rate=0.1))\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Model training" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:12:25.560796300Z", + "start_time": "2024-04-21T13:09:58.240940Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[==============================] 100% Epoch 1/20 - loss: 0.5726 - accuracy_score: 0.8099 - 9.12s\n", + "[==============================] 100% Epoch 2/20 - loss: 0.2319 - accuracy_score: 0.9333 - 8.09s\n", + "[==============================] 100% Epoch 3/20 - loss: 0.1948 - accuracy_score: 0.9432 - 7.56s\n", + "[==============================] 100% Epoch 4/20 - loss: 0.1726 - accuracy_score: 0.9502 - 7.38s\n", + "[==============================] 100% Epoch 5/20 - loss: 0.1587 - accuracy_score: 0.9530 - 7.27s\n", + "[==============================] 100% Epoch 6/20 - loss: 0.1487 - accuracy_score: 0.9563 - 7.69s\n", + "[==============================] 100% Epoch 7/20 - loss: 0.1386 - accuracy_score: 0.9587 - 7.58s\n", + "[==============================] 100% Epoch 8/20 - loss: 0.1349 - accuracy_score: 0.9603 - 7.49s\n", + "[==============================] 100% Epoch 9/20 - loss: 0.1320 - accuracy_score: 0.9609 - 7.48s\n", + "[==============================] 100% Epoch 10/20 - loss: 0.1222 - accuracy_score: 0.9635 - 7.24s\n", + "[==============================] 100% Epoch 11/20 - loss: 0.1165 - accuracy_score: 0.9658 - 7.21s\n", + "[==============================] 100% Epoch 12/20 - loss: 0.1131 - accuracy_score: 0.9666 - 7.07s\n", + "[==============================] 100% Epoch 13/20 - loss: 0.1111 - accuracy_score: 0.9667 - 7.02s\n", + "[==============================] 100% Epoch 14/20 - loss: 0.1065 - accuracy_score: 0.9677 - 6.84s\n", + "[==============================] 100% Epoch 15/20 - loss: 0.1028 - accuracy_score: 0.9685 - 7.02s\n", + "[==============================] 100% Epoch 16/20 - loss: 0.1039 - accuracy_score: 0.9683 - 7.09s\n", + "[==============================] 100% Epoch 17/20 - loss: 0.1000 - accuracy_score: 0.9700 - 7.28s\n", + "[==============================] 100% Epoch 18/20 - loss: 0.0927 - accuracy_score: 0.9719 - 7.05s\n", + "[==============================] 100% Epoch 19/20 - loss: 0.0925 - accuracy_score: 0.9720 - 6.83s\n", + "[==============================] 100% Epoch 20/20 - loss: 0.0917 - accuracy_score: 0.9726 - 6.97s\n" + ] + } + ], + "source": [ + "model.train(x_train, y_train, epochs=20, batch_size=48, metrics=[accuracy_score], random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Model evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:12:25.625272Z", + "start_time": "2024-04-21T13:12:25.570874800Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test loss: 0.1739562576224733\n" + ] + } + ], + "source": [ + "loss = model.evaluate(x_test, y_test)\n", + "print(f'Test loss: {loss}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Model prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:12:25.669005800Z", + "start_time": "2024-04-21T13:12:25.619723700Z" + } + }, + "outputs": [], + "source": [ + "y_pred = model.predict(x_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Printing some metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:12:25.670014500Z", + "start_time": "2024-04-21T13:12:25.653477500Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "accuracy: 0.9568\n", + "f1_score: 0.9565405449722376\n", + "recall_score 0.9562654244701111\n" + ] + } + ], + "source": [ + "print(\"accuracy:\", accuracy_score(y_pred, y_test))\n", + "print(\"f1_score:\", f1_score(y_pred, y_test))\n", + "print(\"recall_score\", recall_score(y_pred, y_test))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 9. Plot the first 10 test images, their predicted labels, and the true labels." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:12:25.942550200Z", + "start_time": "2024-04-21T13:12:25.662547800Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnIAAAMsCAYAAADQ3U+mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACBBElEQVR4nO3deXRURfr/8U8HyB4whATIAAGiuLCIbCoimywSlnFBjKAiIxqU1RlBBUZWcdxYBiTqjBCHBFREQBwERAkg7ogwIDiARGBA2RP2EFK/P/ilv3Ruh3RCJ92XvF/n5BzqSd3qp2+a1JPqW7cdxhgjAAAA2E6ArxMAAABA8VDIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNUcgBAADYFIUcAACATVHIAQAA2BSFHAAAgE3ZrpCrXbu2HnnkEWc7PT1dDodD6enpPsspv/w54vK0bdtWbdu29XUaAFAg5qay55FHHlHt2rV9nUbRCrmUlBQ5HA7nV3BwsOrVq6dBgwbp999/L6kcS8TSpUs1duxYX6dhMXbsWJdznP9r3bp1lzX+1q1bnT+7Y8eOFXucSZMmadGiRZeVS2nI/5rN/5WWlubrFAFcJuamkrdt2zaNGDFCjRs3VkREhKpXr66uXbvq+++/98r4x44dU3BwsBwOh7Zu3VrscWbOnKmUlBSv5FSSDh8+rFdeeUWtW7dWdHS0rrrqKt1yyy167733ijxW+eIkMH78eNWpU0dnzpzRF198oeTkZC1dulSbN29WaGhocYYsttatW+v06dMKDAws0nFLly7V66+/7nf/Ye655x5dffXVlvjIkSN14sQJNW/e/LLGT01NVbVq1XT06FF98MEH6t+/f7HGmTRpknr27Km77rrrsvIpaa1bt9acOXMs8SlTpmjjxo264447fJAVgJLA3FRy/vnPf+rtt9/WvffeqyeffFKZmZl68803dcstt2jZsmXq0KHDZY0/f/58ORwOVatWTWlpaZo4cWKxxpk5c6aqVKni9yuPX331lUaNGqWEhASNHj1a5cuX14IFC5SYmKiffvpJ48aN83isYhVyXbp0UbNmzSRJ/fv3V1RUlCZPnqzFixfrgQcecHvMyZMnFRYWVpyHu6SAgAAFBwd7fVxfadSokRo1auQS27Nnj/bu3av+/fsX+ZfCxYwxmjt3rnr37q1du3YpLS2t2IWcXdStW1d169Z1iZ0+fVpPPvmk2rdvr2rVqvkoMwDextxUch544AGNHTtW4eHhztif/vQnXX/99Ro7duxlF3KpqalKSEhQXFyc5s6dW+xCzi7q16+v7du3Ky4uzhl78skn1aFDB7300ksaMWKEx69Lr1wj1759e0nSrl27JF143zg8PFw7d+5UQkKCIiIi1KdPH0lSbm6upk6dqvr16ys4OFhVq1ZVUlKSjh496jKmMUYTJ05UjRo1FBoaqnbt2mnLli2Wxy7oOoRvvvlGCQkJioyMVFhYmBo1aqRp06Y583v99dclyWU5Po+3c5SknTt3aufOnZ6eUhfz5s2TMcZ5Dotr3bp1ysjIUGJiohITE7VmzRrt3bvX0i83N1fTpk1Tw4YNFRwcrOjoaN15553OJXSHw6GTJ0/qnXfecZ67vL9+CrpmIO8t44vNnj1b7du3V0xMjIKCgnTDDTcoOTnZo+eye/dubdu2rWgn4P9bsmSJjh8/ftnnE4B/Y27y3tzUtGlTlyJOkqKionT77bdf1luh0oXf52vXrnXOTbt27dKXX37ptm9qaqpatGih0NBQRUZGqnXr1lqxYoWkC9cAbtmyRatXr3aeu7zrq93NQdL/vS2fkZHhjC1evFhdu3ZVbGysgoKCFB8frwkTJuj8+fOFPpf9+/dr27ZtOnfu3CX71alTx6WIky78zO+66y6dPXtWv/zyS6GPladYK3L55b0IoqKinLGcnBx17txZrVq10quvvupc1k5KSlJKSor69eunIUOGaNeuXZoxY4Y2bNigdevWqUKFCpKk559/XhMnTlRCQoISEhL0ww8/qFOnTsrOzi40n08//VTdunVT9erVNXToUFWrVk1bt27Vxx9/rKFDhyopKUn79u3Tp59+6vZtt5LIMe8tvItfLJ5KS0tTzZo11bp16yIfm3+c+Ph4NW/eXA0aNFBoaKjmzZun4cOHu/R79NFHlZKSoi5duqh///7KycnR2rVr9fXXX6tZs2aaM2eO+vfvrxYtWujxxx+XJMXHxxc5n+TkZNWvX189evRQ+fLltWTJEj355JPKzc3VwIEDL3nsww8/rNWrV8sYU+THTUtLU0hIiO65554iHwvAPpibSnZukqTffvtNVapUKdaxeebNm6ewsDB169ZNISEhio+PV1pamlq2bOnSb9y4cRo7dqxatmyp8ePHKzAwUN98840+//xzderUSVOnTtXgwYMVHh6uUaNGSZKqVq1a5HxSUlIUHh6uP//5zwoPD9fnn3+u559/XllZWXrllVcueexzzz2nd955R7t27SrWRojffvtNkop2Tk0RzJ4920gyK1euNAcPHjR79uwx7777romKijIhISFm7969xhhj+vbtaySZZ5991uX4tWvXGkkmLS3NJb5s2TKX+IEDB0xgYKDp2rWryc3NdfYbOXKkkWT69u3rjK1atcpIMqtWrTLGGJOTk2Pq1Klj4uLizNGjR10e5+KxBg4caNw9/ZLI0Rhj4uLiTFxcnOXxCrN582YjyYwYMaLIx14sOzvbREVFmVGjRjljvXv3NjfeeKNLv88//9xIMkOGDLGMcfHzDAsLszxHYy787N09zzFjxljO96lTpyz9OnfubOrWresSa9OmjWnTpo0lVsSXrzHGmMOHD5vAwEDTq1evIh8LwD8xN5X+3GSMMWvWrDEOh8P89a9/LdbxeRo2bGj69OnjbI8cOdJUqVLFnDt3zhnbvn27CQgIMHfffbc5f/68y/EXP8/69etb5gtj3M9Bxvzfa2fXrl3OmLu5KSkpyYSGhpozZ844Y+7mu7zX2MXjeerw4cMmJibG3H777UU6rlhvrXbo0EHR0dGqWbOmEhMTFR4eroULF+oPf/iDS78nnnjCpT1//nxVqlRJHTt21KFDh5xfeUu2q1atkiStXLlS2dnZGjx4sMtS6LBhwwrNbcOGDdq1a5eGDRumq666yuV77pZV8yupHDMyMoq9Gifpst8G/OSTT3T48GGX60QeeOABbdy40WXJfcGCBXI4HBozZoxlDE/OX1GEhIQ4/52ZmalDhw6pTZs2+uWXX5SZmXnJY9PT04u1GvfBBx8oOzubt1WBKxBzU+nNTQcOHFDv3r1Vp04djRgxosjH59m0aZP+85//WOamQ4cOafny5c7YokWLlJubq+eff14BAa6lS0nOTcePH9ehQ4d0++2369SpU4Ve0pOSkiJjTJFX43Jzc9WnTx8dO3ZM06dPL9KxxXpr9fXXX1e9evVUvnx5Va1aVddee63lxJYvX141atRwiW3fvl2ZmZmKiYlxO+6BAwckSb/++qsk6ZprrnH5fnR0tCIjIy+ZW95SeoMGDTx/QqWco6fM/9+c0KBBA8sGiKJKTU1VnTp1FBQUpB07dki68HZoaGio0tLSNGnSJEkXzl9sbKwqV6582fkXZt26dRozZoy++uornTp1yuV7mZmZqlSpktcfMy0tTZUrV1aXLl28PjYA32JuKp256eTJk+rWrZuOHz+uL774wnLtXFGkpqYqLCxMdevWdc5NwcHBql27ttLS0tS1a1dJF85fQECAbrjhBq88h0vZsmWLRo8erc8//1xZWVku3ytskaG4Bg8erGXLlulf//qXbrzxxiIdW6xCrkWLFs6dQQUJCgqy/AfKzc1VTExMgffuio6OLk46XuVPOa5bt06//vqrXnzxxcsaJysrS0uWLNGZM2cs/7klae7cuXrhhRe88ldNQWPkv0h0586duuOOO3Tddddp8uTJqlmzpgIDA7V06VJNmTJFubm5l51LfnkX1D7++OPOa0kAXDmYm0pedna27rnnHm3atEnLly8vdmEqXVismDdvnk6ePOm2QDtw4IBOnDhxWYViHk/npmPHjqlNmzaqWLGixo8fr/j4eAUHB+uHH37QM888UyJz07hx4zRz5kz97W9/00MPPVTk472y2cFT8fHxWrlypW677TaXpcv88nZybN++3eXWEQcPHrTsznH3GJK0efPmS26HLuiHWho5eiotLU0Oh0O9e/e+rHE+/PBDnTlzRsnJyZYLKH/++WeNHj1a69atU6tWrRQfH6/ly5fryJEjl1yVK+j8RUZGur3RcN5fiXmWLFmis2fP6qOPPlKtWrWc8by3B0qCt3b/AriyMDd5Jjc3Vw8//LA+++wzvf/++2rTps1ljbd69Wrt3btX48eP1/XXX+/yvaNHj+rxxx/XokWL9OCDDyo+Pl65ubn66aef1Lhx4wLHvNTcJF0o1C5+azv/3JSenq7Dhw/rww8/dNlgmLfz2dvy7hk4bNgwPfPMM8Uao1Q/oqtXr146f/68JkyYYPleTk6OswDo0KGDKlSooOnTp7tcBzV16tRCH6NJkyaqU6eOpk6daikoLh4r7/4s+fuUVI5Fvf3IuXPnNH/+fLVq1cql0CmO1NRU1a1bVwMGDFDPnj1dvp5++mmFh4c7/8q79957ZYxxezPC/OfPXcEWHx+vzMxMbdq0yRnbv3+/Fi5c6NKvXLlyljEzMzM1e/Zsj55TcW4/MnfuXNWqVUutWrUq0nEArmzMTZ7NTYMHD9Z7772nmTNnemXXf97bqsOHD7fMTY899piuueYa59x01113KSAgQOPHj7esink6N0nSmjVrnLG822hdzN3clJ2drZkzZ3r0nDy9/YgkvffeexoyZIj69OmjyZMnezS+O6W6ItemTRslJSXpxRdf1I8//qhOnTqpQoUK2r59u+bPn69p06apZ8+eio6O1tNPP60XX3xR3bp1U0JCgjZs2KBPPvmk0C25AQEBSk5OVvfu3dW4cWP169dP1atX17Zt27RlyxbnxZNNmzaVJA0ZMkSdO3dWuXLllJiYWGI5FnWL9/Lly3X48OFLrh7lbUOfPXt2gXex3rdvn1atWqUhQ4a4/X5QUJA6d+6s+fPn6+9//7vatWunhx56SH//+9+1fft23XnnncrNzdXatWvVrl07DRo0yHn+Vq5cqcmTJys2NlZ16tTRzTffrMTERD3zzDO6++67NWTIEJ06dUrJycmqV6+efvjhB+fjdurUSYGBgerevbuSkpJ04sQJ/eMf/1BMTIz2799f6Pkp6u1HNm/erE2bNunZZ5/1+oWxAOyNuanwuWnq1KmaOXOmbr31VoWGhio1NdXl+3fffbezCE1PT1e7du00ZsyYAj+h4uzZs1qwYIE6duxY4I2Te/TooWnTpunAgQO6+uqrNWrUKE2YMEG333677rnnHgUFBem7775TbGys8xKkpk2bKjk5WRMnTtTVV1+tmJgYtW/fXp06dVKtWrX06KOPavjw4SpXrpxmzZql6Oho7d692/mYLVu2VGRkpPr27ashQ4bI4XBozpw5Hs81nt5+5Ntvv9XDDz+sqKgo3XHHHZa3zFu2bGm5mX2BirLFNW+b7nfffXfJfn379jVhYWEFfv+tt94yTZs2NSEhISYiIsI0bNjQjBgxwuzbt8/Z5/z582bcuHGmevXqJiQkxLRt29Zs3rzZxMXFXXKLd54vvvjCdOzY0URERJiwsDDTqFEjM336dOf3c3JyzODBg010dLRxOByWbcnezNGYom/xTkxMNBUqVDCHDx8usM/06dONJLNs2bIC+7z22mtGkvnss88K7JOSkmIkmcWLFxtjLpybV155xVx33XUmMDDQREdHmy5dupj169c7j9m2bZtp3bq1CQkJsWxpX7FihWnQoIEJDAw01157rUlNTXW79fujjz4yjRo1MsHBwaZ27drmpZdeMrNmzbJs3fbG7UeeffZZI8ls2rTJ42MA2ANzU8nPTXm3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BwUFqXPnzpo/f77+/ve/q127dnrooYf097//Xdu3b9edd96p3NxcrV27Vu3atdOgQYOc52/lypWaPHmyYmNjVadOHd18881KTEzUM888o7vvvltDhgzRqVOnlJycrHr16umHH35wPm6nTp0UGBio7t27KykpSSdOnNA//vEPxcTEaP/+/QWeozye3n7E3fnMW4Hr0qVLoa8nAFc+5ibPbj8yZ84c/frrr85rmtesWaOJEydKkh566CHnamB6erratWunMWPGFPgxXmfPntWCBQvUsWNHBQcHu+3To0cPTZs2TQcOHNDVV1+tUaNGacKECbr99tt1zz33KCgoSN99951iY2P14osvOs9fcnKyJk6cqKuvvloxMTFq3769OnXqpFq1aunRRx/V8OHDVa5cOc2aNUvR0dHavXu38zFbtmypyMhI9e3bV0OGDJHD4dCcOXM83lxXlNuPrFmzxllYHjx4UCdPnnSez9atW3v+qSBF2eKat033u+++u2S/wm6X8dZbb5mmTZuakJAQExERYRo2bGhGjBhh9u3b5+xz/vx5M27cOFO9enUTEhJi2rZtazZv3mzi4uIuucU7zxdffGE6duxoIiIiTFhYmGnUqJGZPn268/s5OTlm8ODBJjo62jgcDsu2ZG/maEzxtnjnKeh8Tp8+3Ugyy5YtK/DY1157zUgyn332WYF9UlJSjCSzePFiY8yFc/PKK6+Y6667zgQGBpro6GjTpUsXs379eucx27ZtM61btzYhISGWLe0rVqwwDRo0MIGBgebaa681qampbrd+f/TRR6ZRo0YmODjY1K5d27z00ktm1qxZlq3bl3v7kfy4/QhwZWFuKp25Ke/3rruvi5/nkiVLjCTzxhtvFDjWggULjCTz9ttvF9gnPT3dSDLTpk1zxmbNmmVuuukmExQUZCIjI02bNm3Mp59+6vz+b7/9Zrp27WoiIiKMJJe5Y/369ebmm282gYGBplatWmby5Mlubz+ybt06c8stt5iQkBATGxtrRowYYZYvX255npd7+5G8ucjdV1Fu7eIwxsMyE36nV69eysjI0LfffuvrVAAAkCSNGDFC8+bN044dOxQUFOTrdK54pfrWKrzHGKP09PQS+cw7AACKa9WqVfrrX/9KEVdKWJEDAACwqVLdtQoAAADvoZADAACwKQo5AAAAm6KQAwAAsCm/2rWam5ur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y5stW7YYYy6cz7CwMI+OLUh2draJiooyo0aNcsZ69+5tbrzxRpd+n3/+uZFkhgwZYhnj4ucZFhZmeY55ubp7nmPGjLGc71OnTln6de7c2dStW9cl1qZNG9OmTRtLzNOX78aNG025cuXM8uXLXXI5ePCgR8cD8G/MTSU/N3Xv3t1cddVVJisryyV+6623Gknm1VdfLXQMd8rq3DR48GATEBBgMjIyXOKJiYlGkhk0aFChY+Qp1lurHTp0UHR0tGrWrKnExESFh4dr4cKF+sMf/uDS74knnnBpz58/X5UqVVLHjh116NAh51fTpk0VHh7u3P2ycuVKZWdna/DgwS5LnsOGDSs0tw0bNmjXrl0aNmyY5S00Tz5epaRyzMjI8Gg1Ljs7W0899ZQGDBigG264odD+nvrkk090+PBhPfDAA87YAw88oI0bN7osuS9YsEAOh0NjxoyxjOHtj6e5+K+RzMxMHTp0SG3atNEvv/yizMzMSx6bnp7u8WrckCFD1KVLF3Xq1Omy8gXg35ibSm5ueuKJJ3Ts2DHdf//92rBhg/773/9q2LBhzrc1T58+XegY7pTVual///4qV66cevXqpS+//FI7d+7Uiy++qIULF0oq2vks1lurr7/+uurVq6fy5curatWquvbaay0XdJYvX141atRwiW3fvl2ZmZmKiYlxO+6BAwckSb/++qskWZZpo6Oj3S7tXixvKb1BgwaeP6FSzvFSpkyZokOHDnl911Jqaqrq1KmjoKAg7dixQ9KFJefQ0FClpaVp0qRJki6cv9jYWFWuXNmrj+/OunXrNGbMGH311VeWXWWZmZmqVKnSZT/Ge++9py+//FKbN2++7LEA+DfmppKbm7p06aLp06fr2WefVZMmTSRJV199tV544QWNGDGi2LfIKqtzU6NGjTR37lwNGDBAt912mySpWrVqmjp1qp544okinc9iFXItWrRQs2bNLtknKCjI8h8oNzdXMTExBe5IiY6OLk46XuXLHDMzMzVx4kQ9+eSTysrKUlZWlqQLtyExxigjI0OhoaEF/kcuSFZWlpYsWaIzZ864vYZh7ty5euGFF7zyV01BY5w/f96lvXPnTt1xxx267rrrNHnyZNWsWVOBgYFaunSppkyZotzc3MvORZKGDx+u++67T4GBgc6/OvPuUbRnzx5lZ2crNjbWK48FwLeYm0rWoEGD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sMRq1qxZ6FjuNkkcPny4eInBa1iRAwAAsCkKOQAAAJuikAMAALApCjkAAACbchhjjK+TyJOVleX20wVKW6dOnSyxTz75pNDjqlWrZokdPHjQKzl5W/369S2x//znP5bYwoULXdqPPPKIpc/x48e9lpc7mZmZbi+yBYCS5i/zkqdq1Kjh0t6wYYOlT1RUlCXmSSngbtPfoEGDLLEjR44UOtaVwF/mJlbkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmyvwnO8TExFhi9957r0fHPvrooy5tO21sWLlypUfH5t/sUNIbGwAAxff000+7tPN/AtHluP/++y2xO++80xJz98kR06dPd2lnZ2d7La+yjhU5AAAAm6KQAwAAsCkKOQAAAJsq89fIvfbaa5bYgw8+aImtX7/eEps/f36J5ORtt99+uyVWtWpVSywlJcUSS01NLYmUAACXKS4uzhLr169focdt2rTJEvv9998tsQ4dOhQ6lrubJee/Tk+S0tLSXNq//fZboWPDM6zIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNlfnNDsYYSyw3N9cS27dvnyXmDzc0DAkJscRGjhzp0n7yySctfdw97z/96U/eSwwAUKIaN25siUVERLi0165da+nTpk0bSyw4ONgSe+CBB1za+ecWSYqPj7fEqlWrZoktXrzYpd2lSxdLnyNHjlhiKBwrcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgU2V+s4OnunbtaomtWLHCpX3s2DFLn+TkZK/l4O4C1bZt21pit9xyS6FjffDBB95ICQDgI0FBQZZY/o1sU6ZM8WisM2fOWGKzZ892ad93332WPnXr1vVo/FOnTrm0/WGz4JWCFTkAAACbopADAACwKQo5AAAAm6KQAwAAsKkyv9lh2rRplli7du0ssdjYWEusdevWLm2Hw2Hp06NHj8vIzpW78d19QkN+v/zyiyXm7g7dAAD7yP/JC+6426i3aNGiYj1es2bNinWcJH399dcu7RMnThR7LLhiRQ4AAMCmKOQAAABsikIOAADApsr8NXLr16+3xBo1amSJNW7c2BK78847XdrDhw+39Dl48KAl9s477xQhw/8zZ84cS2zjxo2FHvfll19aYjt37ixWDgAA/zBv3jxLLP912c2bN7f0ue666yyxhg0bWmJ33323SzsyMtLSx92N8N31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40xcXJxxOBwmNTW10OMB+D/mppKfmzIyMkyLFi3MxIkTzT//+U/z1FNPmZCQEHPTTTdZdrIyN3lWWl1//fXm+eefN//85z/NqFGjTOXKlU1cXJxzl7WnSr2QM8aYt956yzRt2tSEhISYiIgI07BhQzNixAizb98+Z5/z58+bcePGmerVq5uQkBDTtm1bs3nzZhMXF1fofxZjjPniiy9Mx44dTUREhAkLCzONGjVy+WHn5OSYwYMHm+joaONwOCwn3ps5GuP5f5a5c+ea1q1bm+joaFO+fHlTpUoVc/fdd5v169db+k6fPt1IMsuWLStwvNdee81IMp999lmBfVJSUowks3jxYue5eeWVV8x1111nAgMDTXR0tOnSpYtLDtu2bTOtW7c2ISEhli3tK1asMA0aNDCBgYHm2muvNampqW63eH/00UemUaNGJjg42NSuXdu89NJLZtasWV79z7JixQrTsWNHU61aNVOhQgVz1VVXmU6dOl3yfACwF+amkp+bjhw5Yv74xz+aatWqmcDAQFOnTh3zzDPPWIo4Y5ibPC3kEhMTTc2aNU1gYKCJjY01AwYMML///rtHx17MYYyH93CA3+nVq5cyMjL07bff+joVAAAkMTeVtlLd7ADvMcYoPT1dqampvk4FAABJzE2+wIocAACATZXqrlUAAAB4D4UcAACATVHIAQAA2BSFHAAAgE351a7V3Nxc7du3TxEREV75bDXYmzFGx48fV2xsrOWzEQGgNDAvIT9/m5v8qpDbt2+f88PMgTx79uxRjRo1fJ0GgDKIeQkF8Ze5yfel5EUiIiJ8nQL8EK8LAL7C7x8UxF9eG35VyLFsDXd4XQDwFX7/oCD+8trwq0IOAAAAnqOQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALCp8r5OAN4XGRnp0q5Vq1axx/r1119d2k899ZSlz+bNmy2x//73v5bYxo0bi50HAACwYkUOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKzQ420rVrV0usR48elljbtm1d2ldffXWxHzP/poW4uDhLn6CgII/GKleuXLHzAAAAVqzIAQAA2BSFHAAAgE1RyAEAANgU18j5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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(10, 10))\n", + "for i in range(10):\n", + " ax = fig.add_subplot(5, 2, i + 1, xticks=[], yticks=[])\n", + " ax.imshow(x_test[i].reshape(28, 28), cmap='gray')\n", + " ax.set_title(f\"Predicted: {np.argmax(y_pred[i])}, Actual: {np.argmax(y_test[i])}\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 10. Save the model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:12:26.112578100Z", + "start_time": "2024-04-21T13:12:25.931021900Z" + } + }, + "outputs": [], + "source": [ + "model.save(\"my_mnist_model.npz\")" + ] + } + ], + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/classification-regression/simple_mnist_multiclass.py b/examples/classification-regression/simple_mnist_multiclass.py deleted file mode 100644 index 5919f15..0000000 --- a/examples/classification-regression/simple_mnist_multiclass.py +++ /dev/null @@ -1,74 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -from tensorflow.keras.datasets import mnist - -from neuralnetlib.activations import Sigmoid, Softmax -from neuralnetlib.layers import Input, Dense, Activation -from neuralnetlib.losses import CategoricalCrossentropy -from neuralnetlib.metrics import accuracy_score, f1_score, recall_score -from neuralnetlib.model import Model -from neuralnetlib.optimizers import SGD -from neuralnetlib.utils import one_hot_encode - - -def main(): - # 1. Loading a dataset (in this case, MNIST) - (x_train, y_train), (x_test, y_test) = mnist.load_data() - - # 2. Preprocessing - x_train = x_train.reshape(-1, 28 * 28) / 255.0 # Normalization and flattening of the images - x_test = x_test.reshape(-1, 28 * 28) / 255.0 # Normalization and flattening of the images - y_train = one_hot_encode(y_train, num_classes=10) # One-hot encoding of the labels - y_test = one_hot_encode(y_test, num_classes=10) # One-hot encoding of the labels - - # 3. Model definition - input_neurons = x_train.shape[1:][0] # MNIST images are 28x28 - num_hidden_layers = 2 # Number of hidden layers - hidden_neurons = 30 # Number of neurons in each hidden layer - output_neurons = 10 # Assuming 10 classes for MNIST - - model = Model() - model.add(Input(input_neurons)) - model.add(Dense(hidden_neurons, weights_init='lecun', random_state=42)) # First hidden layer - model.add(Activation(Sigmoid())) # ...and its function activation - - for _ in range(num_hidden_layers - 1): # Add the rest of the hidden layers - model.add(Dense(hidden_neurons, weights_init='lecun', - random_state=42)) # Hidden layer must have the same number of neurons as the previous one - model.add(Activation(Sigmoid())) # ...and its function activation - - model.add(Dense(output_neurons, random_state=42)) # Output layer - model.add(Activation(Softmax())) # ...and its function activation - - # 4. Model compilation - model.compile(loss_function=CategoricalCrossentropy(), optimizer=SGD(learning_rate=0.1)) - - # 5. Model training - model.train(x_train, y_train, epochs=20, batch_size=48, metrics=[accuracy_score], random_state=42) - - # 6. Model evaluation - loss = model.evaluate(x_test, y_test) - print(f'Test loss: {loss}') - - # 7. Model prediction - y_pred = model.predict(x_test) - - # 8. Print some metrics - print("accuracy:", accuracy_score(y_pred, y_test)) - print("f1_score:", f1_score(y_pred, y_test)) - print("recall_score", recall_score(y_pred, y_test)) - - # 8.5. Plot the first 10 test images, their predicted labels, and the true labels. - fig = plt.figure(figsize=(10, 10)) - for i in range(10): - ax = fig.add_subplot(5, 2, i + 1, xticks=[], yticks=[]) - ax.imshow(x_test[i].reshape(28, 28), cmap='gray') - ax.set_title(f"Predicted: {np.argmax(y_pred[i])}, Actual: {np.argmax(y_test[i])}") - plt.show() - - # 9. Save the model - model.save("my_mnist_model.npz") - - -if __name__ == '__main__': - main() diff --git a/examples/cnn-classification/simple_cnn_classification_mnist.ipynb b/examples/cnn-classification/simple_cnn_classification_mnist.ipynb new file mode 100644 index 0000000..cfbca99 --- /dev/null +++ b/examples/cnn-classification/simple_cnn_classification_mnist.ipynb @@ -0,0 +1,389 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simple MNIST multiclass classification (using CNN)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:02:23.680426300Z", + "start_time": "2024-04-21T13:02:23.578846800Z" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from tensorflow.keras.datasets import mnist\n", + "\n", + "from neuralnetlib.activations import ReLU, Softmax\n", + "from neuralnetlib.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, Activation\n", + "from neuralnetlib.losses import CategoricalCrossentropy\n", + "from neuralnetlib.model import Model\n", + "from neuralnetlib.optimizers import Adam\n", + "from neuralnetlib.utils import one_hot_encode\n", + "from neuralnetlib.metrics import accuracy_score, f1_score, recall_score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Loading a dataset (in this case, MNIST)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:02:23.865530500Z", + "start_time": "2024-04-21T13:02:23.587363100Z" + } + }, + "outputs": [], + "source": [ + "(x_train, y_train), (x_test, y_test) = mnist.load_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:02:24.363006100Z", + "start_time": "2024-04-21T13:02:23.866530700Z" + } + }, + "outputs": [], + "source": [ + "x_train = x_train.reshape(-1, 1, 28, 28) / 255.0 # Normalization and reshaping of the images for CNN\n", + "x_test = x_test.reshape(-1, 1, 28, 28) / 255.0 # Normalization and reshaping of the images for CNN\n", + "y_train = one_hot_encode(y_train, num_classes=10) # One-hot encoding of the labels\n", + "y_test = one_hot_encode(y_test, num_classes=10) # One-hot encoding of the labels" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Model definition" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:02:24.381541800Z", + "start_time": "2024-04-21T13:02:24.371022600Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "\"\\n Side note: if you set the following:\\n \\n - filters to 8 and 16 (in this order)\\n - padding of the Conv2D layers to 'same'\\n - weights initialization to 'he'\\n \\n you'll get an accuracy of ~0.9975 which is actually pretty cool\\n\"" + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = Model()\n", + "model.add(Input(input_shape=(1, 28, 28)))\n", + "model.add(Conv2D(filters=4, kernel_size=2, random_state=42))\n", + "model.add(Activation(ReLU()))\n", + "model.add(MaxPooling2D(pool_size=2))\n", + "model.add(Conv2D(filters=8, kernel_size=2, random_state=42))\n", + "model.add(Activation(ReLU()))\n", + "model.add(MaxPooling2D(pool_size=2))\n", + "model.add(Flatten())\n", + "model.add(Dense(64, random_state=42))\n", + "model.add(Activation(ReLU()))\n", + "model.add(Dense(10, random_state=42))\n", + "model.add(Activation(Softmax()))\n", + "\n", + "\"\"\"\n", + " Side note: if you set the following:\n", + " \n", + " - filters to 8 and 16 (in this order)\n", + " - padding of the Conv2D layers to 'same'\n", + " - weights initialization to 'he'\n", + " \n", + " you'll get an accuracy of ~0.9975 which is actually pretty cool\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Model compilation" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:02:24.436650200Z", + "start_time": "2024-04-21T13:02:24.380542200Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model\n", + "-------------------------------------------------\n", + "Layer 1: Input(input_shape=(1, 28, 28))\n", + "Layer 2: Conv2D(num_filters=4, kernel_size=(2, 2), stride=(1, 1), padding=valid)\n", + "Layer 3: Activation(ReLU)\n", + "Layer 4: MaxPooling2D(pool_size=(2, 2), stride=(2, 2), padding=valid)\n", + "Layer 5: Conv2D(num_filters=8, kernel_size=(2, 2), stride=(1, 1), padding=valid)\n", + "Layer 6: Activation(ReLU)\n", + "Layer 7: MaxPooling2D(pool_size=(2, 2), stride=(2, 2), padding=valid)\n", + "Layer 8: Flatten\n", + "Layer 9: Dense(units=64)\n", + "Layer 10: Activation(ReLU)\n", + "Layer 11: Dense(units=10)\n", + "Layer 12: Activation(Softmax)\n", + "-------------------------------------------------\n", + "Loss function: CategoricalCrossentropy\n", + "Optimizer: Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)\n", + "-------------------------------------------------\n" + ] + } + ], + "source": [ + "model.compile(loss_function=CategoricalCrossentropy(), optimizer=Adam())\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Model training" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:07:13.446324100Z", + "start_time": "2024-04-21T13:02:24.396579200Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[==============================] 100% Epoch 1/10 - loss: 0.7568 - accuracy_score: 0.7469 - 29.07s - val_accuracy: 0.8824\n", + "[==============================] 100% Epoch 2/10 - loss: 0.3492 - accuracy_score: 0.8896 - 28.25s - val_accuracy: 0.9090\n", + "[==============================] 100% Epoch 3/10 - loss: 0.2760 - accuracy_score: 0.9131 - 27.70s - val_accuracy: 0.9248\n", + "[==============================] 100% Epoch 4/10 - loss: 0.2290 - accuracy_score: 0.9287 - 26.66s - val_accuracy: 0.9306\n", + "[==============================] 100% Epoch 5/10 - loss: 0.1984 - accuracy_score: 0.9385 - 26.46s - val_accuracy: 0.9359\n", + "[==============================] 100% Epoch 6/10 - loss: 0.1761 - accuracy_score: 0.9453 - 26.47s - val_accuracy: 0.9403\n", + "[==============================] 100% Epoch 7/10 - loss: 0.1575 - accuracy_score: 0.9516 - 26.47s - val_accuracy: 0.9446\n", + "[==============================] 100% Epoch 8/10 - loss: 0.1420 - accuracy_score: 0.9566 - 26.98s - val_accuracy: 0.9495\n", + "[==============================] 100% Epoch 9/10 - loss: 0.1281 - accuracy_score: 0.9613 - 26.54s - val_accuracy: 0.9552\n", + "[==============================] 100% Epoch 10/10 - loss: 0.1161 - accuracy_score: 0.9649 - 27.12s - val_accuracy: 0.9597\n" + ] + } + ], + "source": [ + "model.train(x_train, y_train, epochs=10, batch_size=128, metrics=[\n", + " accuracy_score], random_state=42, validation_data=(x_test, y_test))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Model evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:07:15.165781800Z", + "start_time": "2024-04-21T13:07:13.470118200Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test loss: 0.12603648371640921\n" + ] + } + ], + "source": [ + "loss = model.evaluate(x_test, y_test)\n", + "print(f'Test loss: {loss}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Model prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:07:16.940258200Z", + "start_time": "2024-04-21T13:07:15.162657600Z" + } + }, + "outputs": [], + "source": [ + "y_pred = model.predict(x_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Printing some metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:07:16.963571600Z", + "start_time": "2024-04-21T13:07:16.941256300Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "accuracy: 0.9597\n", + "f1_score: 0.9598821526984709\n", + "recall_score 0.9590605438944056\n" + ] + } + ], + "source": [ + "print(\"accuracy:\", accuracy_score(y_pred, y_test))\n", + "print(\"f1_score:\", f1_score(y_pred, y_test))\n", + "print(\"recall_score\", recall_score(y_pred, y_test))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 9. Plot the first 10 test images, their predicted labels, and the true labels." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:07:17.435508900Z", + "start_time": "2024-04-21T13:07:16.963571600Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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ueYa59x01113KSAgQOPHj7esink6N0nSmjVrnLG822hdzN3clJ2drZkzZ3r0nDy9/YgkvffeexoyZIj69OmjyZMnezS+O6W6ItemTRslJSXpxRdf1I8//qhOnTqpQoUK2r59u+bPn69p06apZ8+eio6O1tNPP60XX3xR3bp1U0JCgjZs2KBPPvmk0C25AQEBSk5OVvfu3dW4cWP169dP1atX17Zt27RlyxbnxZNNmzaVJA0ZMkSdO3dWuXLllJiYWGI5FnWL9/Lly3X48OFLrh7lbUOfPXt2gXex3rdvn1atWqUhQ4a4/X5QUJA6d+6s+fPn6+9//7vatWunhx56SH//+9+1fft23XnnncrNzdXatWvVrl07DRo0yHn+Vq5cqcmTJys2NlZ16tTRzTffrMTERD3zzDO6++67NWTIEJ06dUrJycmqV6+efvjhB+fjdurUSYGBgerevbuSkpJ04sQJ/eMf/1BMTIz2799f6Pkp6u1HNm/erE2bNunZZ5/1+oWxAOyNuanwuWnq1KmaOXOmbr31VoWGhio1NdXl+3fffbezCE1PT1e7du00ZsyYAj+h4uzZs1qwYIE6duxY4I2Te/TooWnTpunAgQO6+uqrNWrUKE2YMEG333677rnnHgUFBem7775TbGys8xKkpk2bKjk5WRMnTtTVV1+tmJgYtW/fXp06dVKtWrX06KOPavjw4SpXrpxmzZql6Oho7d692/mYLVu2VGRkpPr27ashQ4bI4XBozpw5Hs81nt5+5Ntvv9XDDz+sqKgo3XHHHZa3zFu2bGm5mX2BirLFNW+b7nfffXfJfn379jVhYWEFfv+tt94yTZs2NSEhISYiIsI0bNjQjBgxwuzbt8/Z5/z582bcuHGmevXqJiQkxLRt29Zs3rzZxMXFXXKLd54vvvjCdOzY0URERJiwsDDTqFEjM336dOf3c3JyzODBg010dLRxOByWbcnezNGYom/xTkxMNBUqVDCHDx8usM/06dONJLNs2bIC+7z22mtGkvnss88K7JOSkmIkmcWLFxtjLpybV155xVx33XUmMDDQREdHmy5dupj169c7j9m2bZtp3bq1CQkJsWxpX7FihWnQoIEJDAw01157rUlNTXW79fujjz4yjRo1MsHBwaZ27drmpZdeMrNmzbJs3fbG7UeeffZZI8ls2rTJ42MA2ANzU8nPTXm3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BwUFqXPnzpo/f77+/ve/q127dnrooYf097//Xdu3b9edd96p3NxcrV27Vu3atdOgQYOc52/lypWaPHmyYmNjVadOHd18881KTEzUM888o7vvvltDhgzRqVOnlJycrHr16umHH35wPm6nTp0UGBio7t27KykpSSdOnNA//vEPxcTEaP/+/QWeozye3n7E3fnMW4Hr0qVLoa8nAFc+5ibPbj8yZ84c/frrr85rmtesWaOJEydKkh566CHnamB6erratWunMWPGFPgxXmfPntWCBQvUsWNHBQcHu+3To0cPTZs2TQcOHNDVV1+tUaNGacKECbr99tt1zz33KCgoSN99951iY2P14osvOs9fcnKyJk6cqKuvvloxMTFq3769OnXqpFq1aunRRx/V8OHDVa5cOc2aNUvR0dHavXu38zFbtmypyMhI9e3bV0OGDJHD4dCcOXM83lxXlNuPrFmzxllYHjx4UCdPnnSez9atW3v+qSBF2eKat033u+++u2S/wm6X8dZbb5mmTZuakJAQExERYRo2bGhGjBhh9u3b5+xz/vx5M27cOFO9enUTEhJi2rZtazZv3mzi4uIuucU7zxdffGE6duxoIiIiTFhYmGnUqJGZPn268/s5OTlm8ODBJjo62jgcDsu2ZG/maEzxtnjnKeh8Tp8+3Ugyy5YtK/DY1157zUgyn332WYF9UlJSjCSzePFiY8yFc/PKK6+Y6667zgQGBpro6GjTpUsXs379eucx27ZtM61btzYhISGWLe0rVqwwDRo0MIGBgebaa681qampbrd+f/TRR6ZRo0YmODjY1K5d27z00ktm1qxZlq3bl3v7kfy4/QhwZWFuKp25Ke/3rruvi5/nkiVLjCTzxhtvFDjWggULjCTz9ttvF9gnPT3dSDLTpk1zxmbNmmVuuukmExQUZCIjI02bNm3Mp59+6vz+b7/9Zrp27WoiIiKMJJe5Y/369ebmm282gYGBplatWmby5Mlubz+ybt06c8stt5iQkBATGxtrRowYYZYvX255npd7+5G8ucjdV1Fu7eIwxsMyE36nV69eysjI0LfffuvrVAAAkCSNGDFC8+bN044dOxQUFOTrdK54pfrWKrzHGKP09PQS+cw7AACKa9WqVfrrX/9KEVdKWJEDAACwqVLdtQoAAADvoZADAACwKQo5AAAAm6KQAwAAsCm/2rWam5ur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y5stW7YYYy6cz7CwMI+OLUh2draJiooyo0aNcsZ69+5tbrzxRpd+n3/+uZFkhgwZYhnj4ucZFhZmeY55ubp7nmPGjLGc71OnTln6de7c2dStW9cl1qZNG9OmTRtLzNOX78aNG025cuXM8uXLXXI5ePCgR8cD8G/MTSU/N3Xv3t1cddVVJisryyV+6623Gknm1VdfLXQMd8rq3DR48GATEBBgMjIyXOKJiYlGkhk0aFChY+Qp1lurHTp0UHR0tGrWrKnExESFh4dr4cKF+sMf/uDS74knnnBpz58/X5UqVVLHjh116NAh51fTpk0VHh7u3P2ycuVKZWdna/DgwS5LnsOGDSs0tw0bNmjXrl0aNmyY5S00Tz5epaRyzMjI8Gg1Ljs7W0899ZQGDBigG264odD+nvrkk090+PBhPfDAA87YAw88oI0bN7osuS9YsEAOh0NjxoyxjOHtj6e5+K+RzMxMHTp0SG3atNEvv/yizMzMSx6bnp7u8WrckCFD1KVLF3Xq1Omy8gXg35ibSm5ueuKJJ3Ts2DHdf//92rBhg/773/9q2LBhzrc1T58+XegY7pTVual///4qV66cevXqpS+//FI7d+7Uiy++qIULF0oq2vks1lurr7/+uurVq6fy5curatWquvbaay0XdJYvX141atRwiW3fvl2ZmZmKiYlxO+6BAwckSb/++qskWZZpo6Oj3S7tXixvKb1BgwaeP6FSzvFSpkyZokOHDnl911Jqaqrq1KmjoKAg7dixQ9KFJefQ0FClpaVp0qRJki6cv9jYWFWuXNmrj+/OunXrNGbMGH311VeWXWWZmZmqVKnSZT/Ge++9py+//FKbN2++7LEA+DfmppKbm7p06aLp06fr2WefVZMmTSRJV199tV544QWNGDGi2LfIKqtzU6NGjTR37lwNGDBAt912mySpWrVqmjp1qp544okinc9iFXItWrRQs2bNLtknKCjI8h8oNzdXMTExBe5IiY6OLk46XuXLHDMzMzVx4kQ9+eSTysrKUlZWlqQLtyExxigjI0OhoaEF/kcuSFZWlpYsWaIzZ864vYZh7ty5euGFF7zyV01BY5w/f96lvXPnTt1xxx267rrrNHnyZNWsWVOBgYFaunSppkyZotzc3MvORZKGDx+u++67T4GBgc6/OvPuUbRnzx5lZ2crNjbWK48FwLeYm0rWoEGD1K9fP23atEmBgYFq3Lix3n77bUlSvXr1ijxeWZ6bJKlnz57q0aOHNm7cqPPnz6tJkybOzTFFOZ/e2Q7pofj4eK1cuVK33Xab24v88sTFxUm68BdI3bp1nfGDBw9adue4ewxJ2rx5szp06FBgv4J+qKWRY0GOHj2qEydO6OWXX9bLL79s+X6dOnX0xz/+scj3yPnwww915swZJScnq0qVKi7f+/nnnzV69GitW7dOrVq1Unx8vJYvX64jR45c8i+fgs5fZGSk25s55v2VmGfJkiU6e/asPvroI9WqVcsZ99bNJfPs2bNHc+fOdXtfniZNmujGG2/Ujz/+6NXHBGAvzE2eCwsL06233upsr1y5UiEhIc5VpaIoy3NTnsDAQDVv3tzZXrlypSRd8jWSX6ne4KZXr146f/68212DOTk5zpPcoUMHVahQQdOnT3d5r3nq1KmFPkaTJk1Up04dTZ061fJDu3isvJvC5u9TUjl6ssU7JiZGCxcutHy1a9dOwcHBWrhwoZ577rlLjuFOamqq6tatqwEDBqhnz54uX08//bTCw8Odf+Xde++9Msa4fWs3//lz958iPj5emZmZ2rRpkzO2f/9+5/v+ecqVK2cZMzMzU7Nnz/boOXm6xdvd+bz//vslSf/61780ZcoUjx4PwJWLucnzW2Nd7Msvv9SHH36oRx99tFhvN5blucmd7du364033lC3bt2KtsLp8bYI8387g7777rtL9rvULsukpCQjyXTp0sVMmTLFzJgxwwwdOtTExsaa+fPnO/s999xzRpJJSEgwM2bMMI8++qiJjY01VapUueTOIGMu7OKpUKGCiYuLM2PHjjVvvvmmeeqpp0ynTp2cfd5//30jyTz00EMmNTXVzJs3r8RyNKZou1Y9PZ95P4/Zs2cXeOz//vc/ExAQYIYNG1Zgn3vvvddERUWZ7OxsY4wxDz30kPP5T5s2zUyZMsXcc889Zvr06c5jEhISTFhYmHnttdfMvHnzzNdff22MMebQoUMmLCzM1K1b10ydOtVMmjTJ1KxZ0zRp0sRlJ8+2bdtMYGCgadiwoZkxY4b529/+ZuLj482NN95oJJldu3Y5+17urtX82LUKXFmYm0p+bsrIyDAtWrQwEydONP/85z/NU089ZUJCQsxNN91k2cnK3OTZ3HT99deb559/3vzzn/80o0aNMpUrVzZxcXHOXdaeKvVCzhhj3nrrLdO0aVMTEhJiIiIiTMOGDc2IESPMvn37nH3Onz9vxo0bZ6pXr25CQkJM27ZtzebNm01cXFyh/1mMMeaLL74wHTt2NBERESYsLMw0atTI5Yedk5NjBg8ebKKjo43D4bCceG/maEzJFHLTp083ksyyZcsKPPa1114zksxnn31WYJ+UlBQjySxevNgYc+HcvPLKK+a6664zgYGBJjo62nTp0sWsX7/eecy2bdtM69atTUhIiGVL+4oVK0yDBg1MYGCgufbaa01qaqrbLd4fffSRadSokQkODja1a9c2L730kpk1axaFHIAiYW4q+bnpyJEj5o9//KOpVq2aCQwMNHXq1DHPPPOMpYgzhrnJ07kpMTHR1KxZ0wQGBprY2FgzYMAA8/vvv3t07MUcxnh4Dwf4nV69eikjI0Pffvutr1MBAEASc1NpK9XNDvAeY4zS09OVmprq61QAAJDE3OQLrMgBAADYVKnuWgUAAID3UMgBAADYFIUcAACATVHIAQAA2JRf7VrNzc3Vvn37FBER4ZXPVoO9GWN0/PhxxcbGWj4bEQBKA/MS8vO3ucmvCrl9+/apZs2avk4DfmbPnj2qUaOGr9MAUAYxL6Eg/jI3+b6UvEhERISvU4Af4nUBwFf4/YOC+Mtrw68KOZat4Q6vCwC+wu8fFMRfXht+VcgBAADAcxRyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgUxRyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgUxRyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgUxRyAAAANkUhBwAAYFPlfZ2AncXExLi033//fUufL7/80hJ76623LLGMjAyv5eVNlSpVcmm3bt3a0mfZsmWW2Llz50osJwAAcAErcgAAADZFIQcAAGBTFHIAAAA2xTVyHoqMjLTEtmzZ4tLOfz2ZJP3++++WmF2uh5Ok9evXu7Sjo6MtfZo2bWqJ7dixw3uJAQC8pmLFipbYiy++aIk1aNDApd2hQwdLH66H9j1W5AAAAGyKQg4AAMCmKOQAAABsikIOAADAptjs4EaVKlUssffee88Sq1y5skt75syZlj6DBw/2XmIlbPTo0ZZYnTp1XNpJSUmWPmxsAAD/1KdPH0vshRdesMRq1qxZ6FjuNkkcPny4eInBa1iRAwAAsCkKOQAAAJuikAMAALApCjkAAACbchhjjK+TyJOVleX20wVKW6dOnSyxTz75pNDjqlWrZokdPHjQKzl5W/369S2x//znP5bYwoULXdqPPPKIpc/x48e9lpc7mZmZbi+yBYCS5i/zkqdq1Kjh0t6wYYOlT1RUlCXmSSngbtPfoEGDLLEjR44UOtaVwF/mJlbkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmyvwnO8TExFhi9957r0fHPvrooy5tO21sWLlypUfH5t/sUNIbGwAAxff000+7tPN/AtHluP/++y2xO++80xJz98kR06dPd2lnZ2d7La+yjhU5AAAAm6KQAwAAsCkKOQAAAJsq89fIvfbaa5bYgw8+aImtX7/eEps/f36J5ORtt99+uyVWtWpVSywlJcUSS01NLYmUAACXKS4uzhLr169focdt2rTJEvv9998tsQ4dOhQ6lrubJee/Tk+S0tLSXNq//fZboWPDM6zIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNlfnNDsYYSyw3N9cS27dvnyXmDzc0DAkJscRGjhzp0n7yySctfdw97z/96U/eSwwAUKIaN25siUVERLi0165da+nTpk0bSyw4ONgSe+CBB1za+ecWSYqPj7fEqlWrZoktXrzYpd2lSxdLnyNHjlhiKBwrcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgU2V+s4OnunbtaomtWLHCpX3s2DFLn+TkZK/l4O4C1bZt21pit9xyS6FjffDBB95ICQDgI0FBQZZY/o1sU6ZM8WisM2fOWGKzZ892ad93332WPnXr1vVo/FOnTrm0/WGz4JWCFTkAAACbopADAACwKQo5AAAAm6KQAwAAsKkyv9lh2rRplli7du0ssdjYWEusdevWLm2Hw2Hp06NHj8vIzpW78d19QkN+v/zyiyXm7g7dAAD7yP/JC+6426i3aNGiYj1es2bNinWcJH399dcu7RMnThR7LLhiRQ4AAMCmKOQAAABsikIOAADApsr8NXLr16+3xBo1amSJNW7c2BK78847XdrDhw+39Dl48KAl9s477xQhw/8zZ84cS2zjxo2FHvfll19aYjt37ixWDgAA/zBv3jxLLP912c2bN7f0ue666yyxhg0bWmJ33323SzsyMtLSx92N8N31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40xcXJxxOBwmNTW10OMB+D/mppKfmzIyMkyLFi3MxIkTzT//+U/z1FNPmZCQEHPTTTdZdrIyN3lWWl1//fXm+eefN//85z/NqFGjTOXKlU1cXJxzl7WnSr2QM8aYt956yzRt2tSEhISYiIgI07BhQzNixAizb98+Z5/z58+bcePGmerVq5uQkBDTtm1bs3nzZhMXF1fofxZjjPniiy9Mx44dTUREhAkLCzONGjVy+WHn5OSYwYMHm+joaONwOCwn3ps5GuP5f5a5c+ea1q1bm+joaFO+fHlTpUoVc/fdd5v169db+k6fPt1IMsuWLStwvNdee81IMp999lmBfVJSUowks3jxYue5eeWVV8x1111nAgMDTXR0tOnSpYtLDtu2bTOtW7c2ISEhli3tK1asMA0aNDCBgYHm2muvNampqW63eH/00UemUaNGJjg42NSuXdu89NJLZtasWV79z7JixQrTsWNHU61aNVOhQgVz1VVXmU6dOl3yfACwF+amkp+bjhw5Yv74xz+aatWqmcDAQFOnTh3zzDPPWIo4Y5ibPC3kEhMTTc2aNU1gYKCJjY01AwYMML///rtHx17MYYyH93CA3+nVq5cyMjL07bff+joVAAAkMTeVtlLd7ADvMcYoPT1dqampvk4FAABJzE2+wIocAACATZXqrlUAAAB4D4UcAACATVHIAQAA2BSFHAAAgE351a7V3Nxc7du3TxEREV75bDXYmzFGx48fV2xsrOWzEQGgNDAvIT9/m5v8qpDbt2+f88PMgTx79uxRjRo1fJ0GgDKIeQkF8Ze5yfel5EUiIiJ8nQL8EK8LAL7C7x8UxF9eG35VyLFsDXd4XQDwFX7/oCD+8trwq0IOAAAAnqOQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALCp8r5OAN4XGRnp0q5Vq1axx/r1119d2k899ZSlz+bNmy2x//73v5bYxo0bi50HAACwYkUOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKzQ420rVrV0usR48elljbtm1d2ldffXWxHzP/poW4uDhLn6CgII/GKleuXLHzAAAAVqzIAQAA2BSFHAAAgE1RyAEAANgU18j5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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(10, 10))\n", + "for i in range(10):\n", + " ax = fig.add_subplot(5, 2, i + 1, xticks=[], yticks=[])\n", + " ax.imshow(x_test[i].reshape(28, 28), cmap='gray')\n", + " ax.set_title(f\"Predicted: {np.argmax(y_pred[i])}, Actual: {np.argmax(y_test[i])}\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 10. Save the model" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-21T13:07:17.638232900Z", + "start_time": "2024-04-21T13:07:17.436513100Z" + } + }, + "outputs": [], + "source": [ + "model.save(\"my_mnist_model.npz\")" + ] + } + ], + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/cnn-classification/simple_cnn_classification_mnist.py b/examples/cnn-classification/simple_cnn_classification_mnist.py deleted file mode 100644 index f2b1ec0..0000000 --- a/examples/cnn-classification/simple_cnn_classification_mnist.py +++ /dev/null @@ -1,79 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -from tensorflow.keras.datasets import mnist - -from neuralnetlib.activations import ReLU, Softmax -from neuralnetlib.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, Activation -from neuralnetlib.losses import CategoricalCrossentropy -from neuralnetlib.metrics import accuracy_score, f1_score, recall_score -from neuralnetlib.model import Model -from neuralnetlib.optimizers import Adam -from neuralnetlib.utils import one_hot_encode - - -def main(): - # 1. Loading a dataset (in this case, MNIST) - (x_train, y_train), (x_test, y_test) = mnist.load_data() - - # 2. Preprocessing - x_train = x_train.reshape(-1, 1, 28, 28) / 255.0 # Normalization and reshaping of the images for CNN - x_test = x_test.reshape(-1, 1, 28, 28) / 255.0 # Normalization and reshaping of the images for CNN - y_train = one_hot_encode(y_train, num_classes=10) # One-hot encoding of the labels - y_test = one_hot_encode(y_test, num_classes=10) # One-hot encoding of the labels - - # 3. Model definition - model = Model() - model.add(Input(input_shape=(1, 28, 28))) - model.add(Conv2D(filters=4, kernel_size=2, random_state=42)) - model.add(Activation(ReLU())) - model.add(MaxPooling2D(pool_size=2)) - model.add(Conv2D(filters=8, kernel_size=2, random_state=42)) - model.add(Activation(ReLU())) - model.add(MaxPooling2D(pool_size=2)) - model.add(Flatten()) - model.add(Dense(64, random_state=42)) - model.add(Activation(ReLU())) - model.add(Dense(10, random_state=42)) - model.add(Activation(Softmax())) - """ - Side note: if you set the following: - - - filters to 8 and 16 (in this order) - - padding of the Conv2D layers to 'same' - - weights initialization to 'he' - - you'll get an accuracy of ~0.9975 which is actually pretty cool - """ - # 4. Model compilation - model.compile(loss_function=CategoricalCrossentropy(), optimizer=Adam()) - - # 5. Model training - model.train(x_train, y_train, epochs=10, batch_size=128, metrics=[accuracy_score], random_state=42, - validation_data=(x_test, y_test)) - - # 6. Model evaluation - loss = model.evaluate(x_test, y_test) - print(f'Test loss: {loss}') - - # 7. Model prediction - y_pred = model.predict(x_test) - - # 8. Print some metrics - print("accuracy:", accuracy_score(y_pred, y_test)) - print("f1_score:", f1_score(y_pred, y_test)) - print("recall_score", recall_score(y_pred, y_test)) - - # 8.5. Plot the first 10 test images, their predicted labels, and the true labels. - fig = plt.figure(figsize=(10, 10)) - for i in range(10): - ax = fig.add_subplot(5, 2, i + 1, xticks=[], yticks=[]) - ax.imshow(x_test[i].reshape(28, 28), cmap='gray') - ax.set_title(f"Predicted: {np.argmax(y_pred[i])}, Actual: {np.argmax(y_test[i])}") - plt.show() - - # 9. Save the model - model.save("my_mnist_cnn_model.npz") - - -if __name__ == '__main__': - main() diff --git a/neuralnetlib/model.py b/neuralnetlib/model.py index e175d4d..7f63137 100644 --- a/neuralnetlib/model.py +++ b/neuralnetlib/model.py @@ -28,6 +28,9 @@ def __str__(self): model_summary += f'Optimizer: {str(self.optimizer)}\n' model_summary += '-------------------------------------------------\n' return model_summary + + def summary(self): + print(str(self)) def add(self, layer: Layer): if self.layers and len(self.layers) != 0 and not isinstance(self.layers[-1], Input) and isinstance(layer, @@ -43,7 +46,7 @@ def add(self, layer: Layer): raise ValueError("Cannot add consecutive Dropout layers.") self.layers.append(layer) - def compile(self, loss_function: LossFunction, optimizer: Optimizer, verbose: bool = True): + def compile(self, loss_function: LossFunction, optimizer: Optimizer, verbose: bool = False): self.loss_function = loss_function self.optimizer = optimizer if verbose: diff --git a/neuralnetlib/utils.py b/neuralnetlib/utils.py index 60a3250..c7281c5 100644 --- a/neuralnetlib/utils.py +++ b/neuralnetlib/utils.py @@ -18,6 +18,7 @@ def one_hot_encode(labels: np.ndarray, num_classes: int) -> np.ndarray: def dict_with_ndarray_to_dict_with_list(d: dict) -> dict: + """Converts all numpy arrays in a dictionary to lists. This is useful for serializing the dictionary to JSON.""" for k, v in d.items(): if isinstance(v, np.ndarray): d[k] = v.tolist() @@ -25,6 +26,7 @@ def dict_with_ndarray_to_dict_with_list(d: dict) -> dict: def dict_with_list_to_dict_with_ndarray(d: dict) -> dict: + """Converts all lists in a dictionary to numpy arrays. This is useful for deserializing the dictionary from JSON.""" for k, v in d.items(): if isinstance(v, list): d[k] = np.array(v) @@ -37,6 +39,7 @@ def apply_threshold(y_pred, threshold: float = 0.5): def shuffle(x, y, random_state: int = None) -> tuple: + """Shuffles the data along the first axis.""" rng = np.random.default_rng(random_state if random_state is not None else int(time.time_ns())) indices = rng.permutation(len(x)) return x[indices], y[indices] @@ -143,8 +146,39 @@ def col2im(col, input_shape, filter_h, filter_w, stride=1, pad=0): def progress_bar(current: int, total: int, width: int = 30, message: str = "") -> None: + """ + Prints a progress bar to the console. + + Args: + current (int): current progress + total (int): total progress + width (int): width of the progress bar + message (str): message to display next to the progress bar + """ progress = current / total bar = '=' * int(width * progress) + '-' * (width - int(width * progress)) percent = int(100 * progress) sys.stdout.write(f'\r[{bar}] {percent}% {message}') sys.stdout.flush() + + +def train_test_split(x, y, test_size: float = 0.2, random_state: int = None) -> tuple: + """ + Splits the data into training and test sets. + + Args: + x (np.ndarray): input data + y (np.ndarray): target data + test_size (float): the proportion of the dataset to include in the test split + random_state (int): seed for the random number generator + + Returns: + tuple: x_train, x_test, y_train, y_test + """ + rng = np.random.default_rng(random_state if random_state is not None else int(time.time_ns())) + indices = np.arange(len(x)) + rng.shuffle(indices) + split_index = int(len(x) * (1 - test_size)) + x_train, x_test = x[indices[:split_index]], x[indices[split_index:]] + y_train, y_test = y[indices[:split_index]], y[indices[split_index:]] + return x_train, x_test, y_train, y_test \ No newline at end of file From 3fdde3b85c38d48f3c580f17bf4966a697aebbb1 Mon Sep 17 00:00:00 2001 From: GitHub Action <52708150+marcpinet@users.noreply.github.com> Date: Sun, 21 Apr 2024 15:23:30 +0200 Subject: [PATCH 2/3] feat: add StandardScaler and MinMaxScaler --- .../mnist_loading_saved_model.ipynb | 3 +- .../simple_cancer_binary.ipynb | 70 ++++---- .../simple_diabete_regression.ipynb | 41 +++-- .../simple_mnist_multiclass.ipynb | 10 +- .../simple_cnn_classification_mnist.ipynb | 14 +- neuralnetlib/__init__.py | 1 + neuralnetlib/layers.py | 2 +- neuralnetlib/metrics.py | 2 +- neuralnetlib/model.py | 2 +- neuralnetlib/preprocessing.py | 168 ++++++++++++++++++ neuralnetlib/utils.py | 118 ------------ 11 files changed, 244 insertions(+), 187 deletions(-) create mode 100644 neuralnetlib/preprocessing.py diff --git a/examples/classification-regression/mnist_loading_saved_model.ipynb b/examples/classification-regression/mnist_loading_saved_model.ipynb index 718ebdf..d12febb 100644 --- a/examples/classification-regression/mnist_loading_saved_model.ipynb +++ b/examples/classification-regression/mnist_loading_saved_model.ipynb @@ -30,7 +30,8 @@ "from tensorflow.keras.datasets import mnist # Dataset for testing\n", "\n", "from neuralnetlib.model import Model\n", - "from neuralnetlib.utils import one_hot_encode, train_test_split\n", + "from neuralnetlib.preprocessing import one_hot_encode\n", + "from neuralnetlib.utils import train_test_split\n", "from neuralnetlib.metrics import accuracy_score, confusion_matrix" ] }, diff --git a/examples/classification-regression/simple_cancer_binary.ipynb b/examples/classification-regression/simple_cancer_binary.ipynb index ab0f31b..0509f99 100644 --- a/examples/classification-regression/simple_cancer_binary.ipynb +++ b/examples/classification-regression/simple_cancer_binary.ipynb @@ -21,15 +21,15 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:15.070975300Z", - "start_time": "2024-04-21T12:58:13.242684600Z" + "end_time": "2024-04-21T13:22:53.026361300Z", + "start_time": "2024-04-21T13:22:52.339942200Z" } }, "outputs": [], "source": [ "from sklearn.datasets import load_breast_cancer\n", - "from sklearn.preprocessing import StandardScaler\n", "\n", + "from neuralnetlib.preprocessing import StandardScaler\n", "from neuralnetlib.activations import Sigmoid, ReLU\n", "from neuralnetlib.layers import Input, Activation, Dense\n", "from neuralnetlib.losses import BinaryCrossentropy\n", @@ -51,8 +51,8 @@ "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:15.071976700Z", - "start_time": "2024-04-21T12:58:14.916652300Z" + "end_time": "2024-04-21T13:22:53.040903100Z", + "start_time": "2024-04-21T13:22:53.026361300Z" } }, "outputs": [], @@ -73,8 +73,8 @@ "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:15.071976700Z", - "start_time": "2024-04-21T12:58:14.938959600Z" + "end_time": "2024-04-21T13:22:53.054442700Z", + "start_time": "2024-04-21T13:22:53.042408400Z" } }, "outputs": [], @@ -99,8 +99,8 @@ "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:15.072974200Z", - "start_time": "2024-04-21T12:58:14.948473300Z" + "end_time": "2024-04-21T13:22:53.059957800Z", + "start_time": "2024-04-21T13:22:53.048922300Z" } }, "outputs": [], @@ -135,8 +135,8 @@ "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:15.073976600Z", - "start_time": "2024-04-21T12:58:14.957996100Z" + "end_time": "2024-04-21T13:22:53.085516700Z", + "start_time": "2024-04-21T13:22:53.058950900Z" } }, "outputs": [ @@ -184,8 +184,8 @@ "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:15.898121100Z", - "start_time": "2024-04-21T12:58:14.985368600Z" + "end_time": "2024-04-21T13:22:53.842873Z", + "start_time": "2024-04-21T13:22:53.081003300Z" } }, "outputs": [ @@ -193,26 +193,26 @@ "name": "stdout", "output_type": "stream", "text": [ - "[==============================] 100% Epoch 1/20 - loss: 0.6860 - accuracy_score: 0.6308 - 0.06s\n", - "[==============================] 100% Epoch 2/20 - loss: 0.6677 - accuracy_score: 0.7055 - 0.04s\n", - "[==============================] 100% Epoch 3/20 - loss: 0.6323 - accuracy_score: 0.8066 - 0.05s\n", - "[==============================] 100% Epoch 4/20 - loss: 0.5702 - accuracy_score: 0.8901 - 0.04s\n", - "[==============================] 100% Epoch 5/20 - loss: 0.4731 - accuracy_score: 0.9143 - 0.04s\n", + "[==============================] 100% Epoch 1/20 - loss: 0.6860 - accuracy_score: 0.6308 - 0.04s\n", + "[==============================] 100% Epoch 2/20 - loss: 0.6677 - accuracy_score: 0.7055 - 0.03s\n", + "[==============================] 100% Epoch 3/20 - loss: 0.6323 - accuracy_score: 0.8066 - 0.04s\n", + "[==============================] 100% Epoch 4/20 - loss: 0.5702 - accuracy_score: 0.8901 - 0.05s\n", + "[==============================] 100% Epoch 5/20 - loss: 0.4731 - accuracy_score: 0.9143 - 0.05s\n", "[==============================] 100% Epoch 6/20 - loss: 0.3540 - accuracy_score: 0.9297 - 0.04s\n", "[==============================] 100% Epoch 7/20 - loss: 0.2499 - accuracy_score: 0.9429 - 0.04s\n", - "[==============================] 100% Epoch 8/20 - loss: 0.1816 - accuracy_score: 0.9473 - 0.05s\n", + "[==============================] 100% Epoch 8/20 - loss: 0.1816 - accuracy_score: 0.9473 - 0.04s\n", "[==============================] 100% Epoch 9/20 - loss: 0.1418 - accuracy_score: 0.9648 - 0.05s\n", - "[==============================] 100% Epoch 10/20 - loss: 0.1182 - accuracy_score: 0.9714 - 0.05s\n", - "[==============================] 100% Epoch 11/20 - loss: 0.1034 - accuracy_score: 0.9758 - 0.05s\n", - "[==============================] 100% Epoch 12/20 - loss: 0.0927 - accuracy_score: 0.9758 - 0.05s\n", - "[==============================] 100% Epoch 13/20 - loss: 0.0844 - accuracy_score: 0.9802 - 0.04s\n", - "[==============================] 100% Epoch 14/20 - loss: 0.0777 - accuracy_score: 0.9802 - 0.04s\n", - "[==============================] 100% Epoch 15/20 - loss: 0.0722 - accuracy_score: 0.9824 - 0.04s\n", - "[==============================] 100% Epoch 16/20 - loss: 0.0675 - accuracy_score: 0.9846 - 0.04s\n", - "[==============================] 100% Epoch 17/20 - loss: 0.0635 - accuracy_score: 0.9890 - 0.06s\n", - "[==============================] 100% Epoch 18/20 - loss: 0.0600 - accuracy_score: 0.9890 - 0.04s\n", + "[==============================] 100% Epoch 10/20 - loss: 0.1182 - accuracy_score: 0.9714 - 0.04s\n", + "[==============================] 100% Epoch 11/20 - loss: 0.1034 - accuracy_score: 0.9758 - 0.03s\n", + "[==============================] 100% Epoch 12/20 - loss: 0.0927 - accuracy_score: 0.9758 - 0.03s\n", + "[==============================] 100% Epoch 13/20 - loss: 0.0844 - accuracy_score: 0.9802 - 0.03s\n", + "[==============================] 100% Epoch 14/20 - loss: 0.0777 - accuracy_score: 0.9802 - 0.03s\n", + "[==============================] 100% Epoch 15/20 - loss: 0.0722 - accuracy_score: 0.9824 - 0.03s\n", + "[==============================] 100% Epoch 16/20 - loss: 0.0675 - accuracy_score: 0.9846 - 0.03s\n", + "[==============================] 100% Epoch 17/20 - loss: 0.0635 - accuracy_score: 0.9890 - 0.03s\n", + "[==============================] 100% Epoch 18/20 - loss: 0.0600 - accuracy_score: 0.9890 - 0.03s\n", "[==============================] 100% Epoch 19/20 - loss: 0.0569 - accuracy_score: 0.9890 - 0.04s\n", - "[==============================] 100% Epoch 20/20 - loss: 0.0542 - accuracy_score: 0.9912 - 0.04s\n" + "[==============================] 100% Epoch 20/20 - loss: 0.0542 - accuracy_score: 0.9912 - 0.03s\n" ] } ], @@ -232,8 +232,8 @@ "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:15.909122600Z", - "start_time": "2024-04-21T12:58:15.897122100Z" + "end_time": "2024-04-21T13:22:53.857412200Z", + "start_time": "2024-04-21T13:22:53.843829400Z" } }, "outputs": [ @@ -262,8 +262,8 @@ "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:15.926122700Z", - "start_time": "2024-04-21T12:58:15.909122600Z" + "end_time": "2024-04-21T13:22:53.863439400Z", + "start_time": "2024-04-21T13:22:53.852402800Z" } }, "outputs": [], @@ -283,8 +283,8 @@ "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:15.960120500Z", - "start_time": "2024-04-21T12:58:15.915125800Z" + "end_time": "2024-04-21T13:22:53.873465Z", + "start_time": "2024-04-21T13:22:53.859930800Z" } }, "outputs": [ diff --git a/examples/classification-regression/simple_diabete_regression.ipynb b/examples/classification-regression/simple_diabete_regression.ipynb index 6800376..ae6e71d 100644 --- a/examples/classification-regression/simple_diabete_regression.ipynb +++ b/examples/classification-regression/simple_diabete_regression.ipynb @@ -21,16 +21,15 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:42.208044400Z", - "start_time": "2024-04-21T12:58:41.563710800Z" + "end_time": "2024-04-21T13:22:31.884628500Z", + "start_time": "2024-04-21T13:22:30.866451700Z" } }, "outputs": [], "source": [ "from sklearn.datasets import load_diabetes\n", - "from sklearn.preprocessing import MinMaxScaler, StandardScaler\n", - "\n", "\n", + "from neuralnetlib.preprocessing import MinMaxScaler, StandardScaler\n", "from neuralnetlib.activations import Linear, LeakyReLU\n", "from neuralnetlib.layers import Input, Dense, Activation\n", "from neuralnetlib.losses import MeanSquaredError, MeanAbsoluteError\n", @@ -51,8 +50,8 @@ "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:42.240734100Z", - "start_time": "2024-04-21T12:58:42.210041800Z" + "end_time": "2024-04-21T13:22:31.904684200Z", + "start_time": "2024-04-21T13:22:31.886631400Z" } }, "outputs": [], @@ -73,8 +72,8 @@ "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:42.249254500Z", - "start_time": "2024-04-21T12:58:42.239316100Z" + "end_time": "2024-04-21T13:22:31.915316200Z", + "start_time": "2024-04-21T13:22:31.905686700Z" } }, "outputs": [], @@ -99,8 +98,8 @@ "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:42.256446500Z", - "start_time": "2024-04-21T12:58:42.251389300Z" + "end_time": "2024-04-21T13:22:31.922833400Z", + "start_time": "2024-04-21T13:22:31.914315800Z" } }, "outputs": [], @@ -135,8 +134,8 @@ "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:42.279592100Z", - "start_time": "2024-04-21T12:58:42.258549800Z" + "end_time": "2024-04-21T13:22:31.965385600Z", + "start_time": "2024-04-21T13:22:31.924269100Z" } }, "outputs": [ @@ -178,8 +177,8 @@ "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:42.421362900Z", - "start_time": "2024-04-21T12:58:42.281678Z" + "end_time": "2024-04-21T13:22:32.074543200Z", + "start_time": "2024-04-21T13:22:31.939804400Z" } }, "outputs": [ @@ -187,7 +186,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[==============================] 100% Epoch 1/10 - loss: 1.2716 - - 0.01s\n", + "[==============================] 100% Epoch 1/10 - loss: 1.2716 - - 0.02s\n", "[==============================] 100% Epoch 2/10 - loss: 1.2699 - - 0.01s\n", "[==============================] 100% Epoch 3/10 - loss: 1.2680 - - 0.01s\n", "[==============================] 100% Epoch 4/10 - loss: 1.2659 - - 0.01s\n", @@ -216,8 +215,8 @@ "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:42.422436100Z", - "start_time": "2024-04-21T12:58:42.395311800Z" + "end_time": "2024-04-21T13:22:32.083579600Z", + "start_time": "2024-04-21T13:22:32.071027500Z" } }, "outputs": [ @@ -246,8 +245,8 @@ "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:42.435843800Z", - "start_time": "2024-04-21T12:58:42.400690600Z" + "end_time": "2024-04-21T13:22:32.095622600Z", + "start_time": "2024-04-21T13:22:32.083579600Z" } }, "outputs": [ @@ -276,8 +275,8 @@ "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:58:42.486010400Z", - "start_time": "2024-04-21T12:58:42.416724800Z" + "end_time": "2024-04-21T13:22:32.136547300Z", + "start_time": "2024-04-21T13:22:32.095622600Z" } }, "outputs": [], diff --git a/examples/classification-regression/simple_mnist_multiclass.ipynb b/examples/classification-regression/simple_mnist_multiclass.ipynb index 6d25eb1..a39c2cd 100644 --- a/examples/classification-regression/simple_mnist_multiclass.ipynb +++ b/examples/classification-regression/simple_mnist_multiclass.ipynb @@ -27,8 +27,8 @@ }, "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", "import numpy as np\n", + "import matplotlib.pyplot as plt\n", "from tensorflow.keras.datasets import mnist\n", "\n", "from neuralnetlib.activations import Sigmoid, Softmax\n", @@ -36,7 +36,7 @@ "from neuralnetlib.losses import CategoricalCrossentropy\n", "from neuralnetlib.model import Model\n", "from neuralnetlib.optimizers import SGD\n", - "from neuralnetlib.utils import one_hot_encode\n", + "from neuralnetlib.preprocessing import one_hot_encode\n", "from neuralnetlib.metrics import accuracy_score, f1_score, recall_score" ] }, @@ -316,8 +316,10 @@ "outputs": [ { "data": { - "text/plain": "
", - "image/png": "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ueYa59x01113KSAgQOPHj7esink6N0nSmjVrnLG822hdzN3clJ2drZkzZ3r0nDy9/YgkvffeexoyZIj69OmjyZMnezS+O6W6ItemTRslJSXpxRdf1I8//qhOnTqpQoUK2r59u+bPn69p06apZ8+eio6O1tNPP60XX3xR3bp1U0JCgjZs2KBPPvmk0C25AQEBSk5OVvfu3dW4cWP169dP1atX17Zt27RlyxbnxZNNmzaVJA0ZMkSdO3dWuXLllJiYWGI5FnWL9/Lly3X48OFLrh7lbUOfPXt2gXex3rdvn1atWqUhQ4a4/X5QUJA6d+6s+fPn6+9//7vatWunhx56SH//+9+1fft23XnnncrNzdXatWvVrl07DRo0yHn+Vq5cqcmTJys2NlZ16tTRzTffrMTERD3zzDO6++67NWTIEJ06dUrJycmqV6+efvjhB+fjdurUSYGBgerevbuSkpJ04sQJ/eMf/1BMTIz2799f6Pkp6u1HNm/erE2bNunZZ5/1+oWxAOyNuanwuWnq1KmaOXOmbr31VoWGhio1NdXl+3fffbezCE1PT1e7du00ZsyYAj+h4uzZs1qwYIE6duxY4I2Te/TooWnTpunAgQO6+uqrNWrUKE2YMEG333677rnnHgUFBem7775TbGys8xKkpk2bKjk5WRMnTtTVV1+tmJgYtW/fXp06dVKtWrX06KOPavjw4SpXrpxmzZql6Oho7d692/mYLVu2VGRkpPr27ashQ4bI4XBozpw5Hs81nt5+5Ntvv9XDDz+sqKgo3XHHHZa3zFu2bGm5mX2BirLFNW+b7nfffXfJfn379jVhYWEFfv+tt94yTZs2NSEhISYiIsI0bNjQjBgxwuzbt8/Z5/z582bcuHGmevXqJiQkxLRt29Zs3rzZxMXFXXKLd54vvvjCdOzY0URERJiwsDDTqFEjM336dOf3c3JyzODBg010dLRxOByWbcnezNGYom/xTkxMNBUqVDCHDx8usM/06dONJLNs2bIC+7z22mtGkvnss88K7JOSkmIkmcWLFxtjLpybV155xVx33XUmMDDQREdHmy5dupj169c7j9m2bZtp3bq1CQkJsWxpX7FihWnQoIEJDAw01157rUlNTXW79fujjz4yjRo1MsHBwaZ27drmpZdeMrNmzbJs3fbG7UeeffZZI8ls2rTJ42MA2ANzU8nPTXm3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BwUFqXPnzpo/f77+/ve/q127dnrooYf097//Xdu3b9edd96p3NxcrV27Vu3atdOgQYOc52/lypWaPHmyYmNjVadOHd18881KTEzUM888o7vvvltDhgzRqVOnlJycrHr16umHH35wPm6nTp0UGBio7t27KykpSSdOnNA//vEPxcTEaP/+/QWeozye3n7E3fnMW4Hr0qVLoa8nAFc+5ibPbj8yZ84c/frrr85rmtesWaOJEydKkh566CHnamB6erratWunMWPGFPgxXmfPntWCBQvUsWNHBQcHu+3To0cPTZs2TQcOHNDVV1+tUaNGacKECbr99tt1zz33KCgoSN99951iY2P14osvOs9fcnKyJk6cqKuvvloxMTFq3769OnXqpFq1aunRRx/V8OHDVa5cOc2aNUvR0dHavXu38zFbtmypyMhI9e3bV0OGDJHD4dCcOXM83lxXlNuPrFmzxllYHjx4UCdPnnSez9atW3v+qSBF2eKat033u+++u2S/wm6X8dZbb5mmTZuakJAQExERYRo2bGhGjBhh9u3b5+xz/vx5M27cOFO9enUTEhJi2rZtazZv3mzi4uIuucU7zxdffGE6duxoIiIiTFhYmGnUqJGZPn268/s5OTlm8ODBJjo62jgcDsu2ZG/maEzxtnjnKeh8Tp8+3Ugyy5YtK/DY1157zUgyn332WYF9UlJSjCSzePFiY8yFc/PKK6+Y6667zgQGBpro6GjTpUsXs379eucx27ZtM61btzYhISGWLe0rVqwwDRo0MIGBgebaa681qampbrd+f/TRR6ZRo0YmODjY1K5d27z00ktm1qxZlq3bl3v7kfy4/QhwZWFuKp25Ke/3rruvi5/nkiVLjCTzxhtvFDjWggULjCTz9ttvF9gnPT3dSDLTpk1zxmbNmmVuuukmExQUZCIjI02bNm3Mp59+6vz+b7/9Zrp27WoiIiKMJJe5Y/369ebmm282gYGBplatWmby5Mlubz+ybt06c8stt5iQkBATGxtrRowYYZYvX255npd7+5G8ucjdV1Fu7eIwxsMyE36nV69eysjI0LfffuvrVAAAkCSNGDFC8+bN044dOxQUFOTrdK54pfrWKrzHGKP09PQS+cw7AACKa9WqVfrrX/9KEVdKWJEDAACwqVLdtQoAAADvoZADAACwKQo5AAAAm6KQAwAAsCm/2rWam5ur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y5stW7YYYy6cz7CwMI+OLUh2draJiooyo0aNcsZ69+5tbrzxRpd+n3/+uZFkhgwZYhnj4ucZFhZmeY55ubp7nmPGjLGc71OnTln6de7c2dStW9cl1qZNG9OmTRtLzNOX78aNG025cuXM8uXLXXI5ePCgR8cD8G/MTSU/N3Xv3t1cddVVJisryyV+6623Gknm1VdfLXQMd8rq3DR48GATEBBgMjIyXOKJiYlGkhk0aFChY+Qp1lurHTp0UHR0tGrWrKnExESFh4dr4cKF+sMf/uDS74knnnBpz58/X5UqVVLHjh116NAh51fTpk0VHh7u3P2ycuVKZWdna/DgwS5LnsOGDSs0tw0bNmjXrl0aNmyY5S00Tz5epaRyzMjI8Gg1Ljs7W0899ZQGDBigG264odD+nvrkk090+PBhPfDAA87YAw88oI0bN7osuS9YsEAOh0NjxoyxjOHtj6e5+K+RzMxMHTp0SG3atNEvv/yizMzMSx6bnp7u8WrckCFD1KVLF3Xq1Omy8gXg35ibSm5ueuKJJ3Ts2DHdf//92rBhg/773/9q2LBhzrc1T58+XegY7pTVual///4qV66cevXqpS+//FI7d+7Uiy++qIULF0oq2vks1lurr7/+uurVq6fy5curatWquvbaay0XdJYvX141atRwiW3fvl2ZmZmKiYlxO+6BAwckSb/++qskWZZpo6Oj3S7tXixvKb1BgwaeP6FSzvFSpkyZokOHDnl911Jqaqrq1KmjoKAg7dixQ9KFJefQ0FClpaVp0qRJki6cv9jYWFWuXNmrj+/OunXrNGbMGH311VeWXWWZmZmqVKnSZT/Ge++9py+//FKbN2++7LEA+DfmppKbm7p06aLp06fr2WefVZMmTSRJV199tV544QWNGDGi2LfIKqtzU6NGjTR37lwNGDBAt912mySpWrVqmjp1qp544okinc9iFXItWrRQs2bNLtknKCjI8h8oNzdXMTExBe5IiY6OLk46XuXLHDMzMzVx4kQ9+eSTysrKUlZWlqQLtyExxigjI0OhoaEF/kcuSFZWlpYsWaIzZ864vYZh7ty5euGFF7zyV01BY5w/f96lvXPnTt1xxx267rrrNHnyZNWsWVOBgYFaunSppkyZotzc3MvORZKGDx+u++67T4GBgc6/OvPuUbRnzx5lZ2crNjbWK48FwLeYm0rWoEGD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sMRq1qxZ6FjuNkkcPny4eInBa1iRAwAAsCkKOQAAAJuikAMAALApCjkAAACbchhjjK+TyJOVleX20wVKW6dOnSyxTz75pNDjqlWrZokdPHjQKzl5W/369S2x//znP5bYwoULXdqPPPKIpc/x48e9lpc7mZmZbi+yBYCS5i/zkqdq1Kjh0t6wYYOlT1RUlCXmSSngbtPfoEGDLLEjR44UOtaVwF/mJlbkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmyvwnO8TExFhi9957r0fHPvrooy5tO21sWLlypUfH5t/sUNIbGwAAxff000+7tPN/AtHluP/++y2xO++80xJz98kR06dPd2lnZ2d7La+yjhU5AAAAm6KQAwAAsCkKOQAAAJsq89fIvfbaa5bYgw8+aImtX7/eEps/f36J5ORtt99+uyVWtWpVSywlJcUSS01NLYmUAACXKS4uzhLr169focdt2rTJEvv9998tsQ4dOhQ6lrubJee/Tk+S0tLSXNq//fZboWPDM6zIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNlfnNDsYYSyw3N9cS27dvnyXmDzc0DAkJscRGjhzp0n7yySctfdw97z/96U/eSwwAUKIaN25siUVERLi0165da+nTpk0bSyw4ONgSe+CBB1za+ecWSYqPj7fEqlWrZoktXrzYpd2lSxdLnyNHjlhiKBwrcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgU2V+s4OnunbtaomtWLHCpX3s2DFLn+TkZK/l4O4C1bZt21pit9xyS6FjffDBB95ICQDgI0FBQZZY/o1sU6ZM8WisM2fOWGKzZ892ad93332WPnXr1vVo/FOnTrm0/WGz4JWCFTkAAACbopADAACwKQo5AAAAm6KQAwAAsKkyv9lh2rRplli7du0ssdjYWEusdevWLm2Hw2Hp06NHj8vIzpW78d19QkN+v/zyiyXm7g7dAAD7yP/JC+6426i3aNGiYj1es2bNinWcJH399dcu7RMnThR7LLhiRQ4AAMCmKOQAAABsikIOAADApsr8NXLr16+3xBo1amSJNW7c2BK78847XdrDhw+39Dl48KAl9s477xQhw/8zZ84cS2zjxo2FHvfll19aYjt37ixWDgAA/zBv3jxLLP912c2bN7f0ue666yyxhg0bWmJ33323SzsyMtLSx92N8N31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40xcXJxxOBwmNTW10OMB+D/mppKfmzIyMkyLFi3MxIkTzT//+U/z1FNPmZCQEHPTTTdZdrIyN3lWWl1//fXm+eefN//85z/NqFGjTOXKlU1cXJxzl7WnSr2QM8aYt956yzRt2tSEhISYiIgI07BhQzNixAizb98+Z5/z58+bcePGmerVq5uQkBDTtm1bs3nzZhMXF1fofxZjjPniiy9Mx44dTUREhAkLCzONGjVy+WHn5OSYwYMHm+joaONwOCwn3ps5GuP5f5a5c+ea1q1bm+joaFO+fHlTpUoVc/fdd5v169db+k6fPt1IMsuWLStwvNdee81IMp999lmBfVJSUowks3jxYue5eeWVV8x1111nAgMDTXR0tOnSpYtLDtu2bTOtW7c2ISEhli3tK1asMA0aNDCBgYHm2muvNampqW63eH/00UemUaNGJjg42NSuXdu89NJLZtasWV79z7JixQrTsWNHU61aNVOhQgVz1VVXmU6dOl3yfACwF+amkp+bjhw5Yv74xz+aatWqmcDAQFOnTh3zzDPPWIo4Y5ibPC3kEhMTTc2aNU1gYKCJjY01AwYMML///rtHx17MYYyH93CA3+nVq5cyMjL07bff+joVAAAkMTeVtlLd7ADvMcYoPT1dqampvk4FAABJzE2+wIocAACATZXqrlUAAAB4D4UcAACATVHIAQAA2BSFHAAAgE351a7V3Nxc7du3TxEREV75bDXYmzFGx48fV2xsrOWzEQGgNDAvIT9/m5v8qpDbt2+f88PMgTx79uxRjRo1fJ0GgDKIeQkF8Ze5yfel5EUiIiJ8nQL8EK8LAL7C7x8UxF9eG35VyLFsDXd4XQDwFX7/oCD+8trwq0IOAAAAnqOQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALCp8r5OAN4XGRnp0q5Vq1axx/r1119d2k899ZSlz+bNmy2x//73v5bYxo0bi50HAACwYkUOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKzQ420rVrV0usR48elljbtm1d2ldffXWxHzP/poW4uDhLn6CgII/GKleuXLHzAAAAVqzIAQAA2BSFHAAAgE1RyAEAANgU18j5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\n" + "image/png": "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ueYa59x01113KSAgQOPHj7esink6N0nSmjVrnLG822hdzN3clJ2drZkzZ3r0nDy9/YgkvffeexoyZIj69OmjyZMnezS+O6W6ItemTRslJSXpxRdf1I8//qhOnTqpQoUK2r59u+bPn69p06apZ8+eio6O1tNPP60XX3xR3bp1U0JCgjZs2KBPPvmk0C25AQEBSk5OVvfu3dW4cWP169dP1atX17Zt27RlyxbnxZNNmzaVJA0ZMkSdO3dWuXLllJiYWGI5FnWL9/Lly3X48OFLrh7lbUOfPXt2gXex3rdvn1atWqUhQ4a4/X5QUJA6d+6s+fPn6+9//7vatWunhx56SH//+9+1fft23XnnncrNzdXatWvVrl07DRo0yHn+Vq5cqcmTJys2NlZ16tTRzTffrMTERD3zzDO6++67NWTIEJ06dUrJycmqV6+efvjhB+fjdurUSYGBgerevbuSkpJ04sQJ/eMf/1BMTIz2799f6Pkp6u1HNm/erE2bNunZZ5/1+oWxAOyNuanwuWnq1KmaOXOmbr31VoWGhio1NdXl+3fffbezCE1PT1e7du00ZsyYAj+h4uzZs1qwYIE6duxY4I2Te/TooWnTpunAgQO6+uqrNWrUKE2YMEG333677rnnHgUFBem7775TbGys8xKkpk2bKjk5WRMnTtTVV1+tmJgYtW/fXp06dVKtWrX06KOPavjw4SpXrpxmzZql6Oho7d692/mYLVu2VGRkpPr27ashQ4bI4XBozpw5Hs81nt5+5Ntvv9XDDz+sqKgo3XHHHZa3zFu2bGm5mX2BirLFNW+b7nfffXfJfn379jVhYWEFfv+tt94yTZs2NSEhISYiIsI0bNjQjBgxwuzbt8/Z5/z582bcuHGmevXqJiQkxLRt29Zs3rzZxMXFXXKLd54vvvjCdOzY0URERJiwsDDTqFEjM336dOf3c3JyzODBg010dLRxOByWbcnezNGYom/xTkxMNBUqVDCHDx8usM/06dONJLNs2bIC+7z22mtGkvnss88K7JOSkmIkmcWLFxtjLpybV155xVx33XUmMDDQREdHmy5dupj169c7j9m2bZtp3bq1CQkJsWxpX7FihWnQoIEJDAw01157rUlNTXW79fujjz4yjRo1MsHBwaZ27drmpZdeMrNmzbJs3fbG7UeeffZZI8ls2rTJ42MA2ANzU8nPTXm31Sjo6+Lf2UuWLDGSzBtvvFHgeAsWLDCSzNtvv11gn/T0dCPJTJs2zRmbNWuWuemmm0xQUJCJjIw0bdq0MZ9++qnz+7/99pvp2rWriYiIMJJc5o7169ebm2++2QQGBppatWqZyZMnu739yLp168wtt9xiQkJCTGxsrBkxYoRZvny55ed5ObcfyXvcgr5mz559yeMv5jCmGPdwgF/o1auXMjIy9O233/o6FQAAJEkjRozQvHnztGPHDgUFBfk6nSteqb61Cu8xxig9Pd2yvA0AgC+tWrVKf/3rXyniSgkrcgAAADZVqrtWAQAA4D0UcgAAADZFIQcAAGBTFHIAAAA25Ve7VnNzc7Vv3z5FRERw01bIGKPjx48rNjbW8tmIAFAamJeQn7/NTX5VyO3bt081a9b0dRrwM3v27FGNGjV8nQaAMoh5CQXxl7nJ96XkRSIiInydAvwQrwsAvsLvHxTEX14bflXIsWwNd3hdAPAVfv+gIP7y2vCrQg4AAACeo5ADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJsq7+sEAABAyXj66actsZCQEEusUaNGlljPnj0LHT85OdkS++qrryyxOXPmFDoWiocVOQAAAJuikAMAALApCjkAAACbopADAACwKYcxxvg6iTxZWVmqVKmSr9OAn8nMzFTFihV9nQaAMshu89J7773n0vZkw4K37dy50xLr0KGDS3v37t2llU6J8Ze5iRU5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApPtkBAAAbyr+xQSr+5oZt27ZZYsuXL3dp161b19Kne/fullh8fLwl1qdPH5f2iy++WNQUUQBW5AAAAGyKQg4AAMCmKOQAAABsimvkAADwc82aNbPE7r777kKP27JliyXWo0cPS+zQoUOW2IkTJ1zagYGBlj5ff/21JXbjjTdaYlFRUZfME8XHihwAAIBNUcgBAADYFIUcAACATVHIAQAA2FSZ3+zg7uaJjz32mCW2b98+S+zMmTMu7bS0NEuf3377zRLbsWNHUVIEAJRx1atXt8QcDoclln9zQ+fOnS199u/fX6wc/vKXv1hiN9xwg0fH/vvf/y7WY6JwrMgBAADYFIUcAACATVHIAQAA2BSFHAAAgE05jDHG10nkycrKUqVKlUr1MX/55RdLrHbt2l4b//jx45aYuztt+4O9e/daYi+//LJL+/vvvy+tdJwyMzNVsWLFUn9cAPDFvOSpuLg4Syz/nHPkyBGvPd7GjRstsQYNGnh0bIcOHVzaq1at8kpOvuQvcxMrcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgU2X+kx3cfYpDo0aNLLGtW7daYtdff71Lu0mTJpY+bdu2tcRuueUWS2zPnj0u7Zo1a1r6eConJ8elffDgQUsfd3cJd2f37t0ubV9sdgAAWP36668lOv7w4cNd2vXq1fPouG+++cajGLyDFTkAAACbopADAACwKQo5AAAAmyrz18h99tlnHsXcWbZsWaF9IiMjLbHGjRtbYuvXr3dpN2/e3KMc3Dlz5oxL+7///a+lj7tr/ipXrmyJ7dy5s9h5AADsoVu3bpbY+PHjXdqBgYGWPgcOHLDEnnvuOUvs1KlTl5EdLoUVOQAAAJuikAMAALApCjkAAACbopADAACwqTK/2aGkHT161BJbtWpVocd5uuHCE/fee68l5m4Txn/+8x9L7L333vNaHgAA/9SsWTNLzN3mhvzczRGrV6/2Sk7wDCtyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTbHa4AsXExLi0Z86caekTEGCt4fPfxVuSjhw54r3EAAA+t2jRIkusU6dOhR73r3/9yxIbPXq0N1LCZWBFDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsis0OV6CBAwe6tKOjoy193H3ixM8//1xiOQEASl/16tUtsZYtW1piQUFBltihQ4dc2hMnTrT0OXHixGVkB29gRQ4AAMCmKOQAAABsikIOAADAprhGzuZuu+02S+zZZ58t9Li77rrLEtu8ebM3UgIA+IkFCxZYYlFRUR4dm5qa6tLeuXOnV3KCd7EiBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA2xWYHm0tISLDEKlSo4NL+7LPPLH2++uqrEssJAOAbPXr0cGk3adLEo+PS09MtsTFjxngjJZQwVuQAAABsikIOAADApijkAAAAbIpCDgAAwKbY7GAjISEhltidd95piWVnZ7u03V2weu7cOe8lBgAode4+oWHkyJEu7fyb3wry448/WmInTpwoVl4oXazIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNsdnBRoYPH26J3XTTTZbYsmXLXNpffvllieUEAPCNv/zlL5ZY8+bNCz1u0aJFlhif4mBfrMgBAADYFIUcAACATVHIAQAA2JTDGGN8nUSerKwsVapUyddp+IWuXbtaYu6uazh58qQllv8mwV9//bXX8vKFzMxMVaxY0ddpACiD/HleOnPmjCXmyQ2Aa9SoYYnt37/fKzmVJf4yN7EiBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA2xQ2B/URUVJRL++9//7ulT7ly5SyxpUuXWmJ239wAACg5lStXtsTOnTvntfEzMzMLHd/dpgxPN5VcddVVLu0///nPnieXz/nz513azzzzjKXPqVOnij1+aWBFDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsis0OPuBu08KyZctc2nXq1LH02blzpyX217/+1XuJAQCueJs2bSrR8efPn2+J5f/kiKpVq1r63H///SWWk6d+++03S+yFF17wQSaeY0UOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKzQ4+EB8fb4k1bdq00OPc3b3a3QYIAMCVz90n+/zxj3/0QSau7rvvPq+NlZOTY4nl5uYWetxHH31kiX3//feFHrd27VrPEvMjrMgBAADYFIUcAACATVHIAQAA2BTXyJWwuLg4S2zFihWFHjd8+HBL7OOPP/ZKTgAA+7vnnnsssREjRri0K1SoUOzx69ev79K+nBv2zpo1y6WdkZHh0XELFiywxLZt21bsPK5ErMgBAADYFIUcAACATVHIAQAA2BSFHAAAgE2x2aGEPf7445ZYrVq1Cj1u9erVlpgxxis5AQCuTC+//HKJjd27d+8SGxvFx4ocAACATVHIAQAA2BSFHAAAgE1RyAEAANgUmx28qFWrVpbY4MGDfZAJAAAoC1iRAwAAsCkKOQAAAJuikAMAALApCjkAAACbYrODF91+++2WWHh4uEfH7ty506V94sQJr+QEAACuXKzIAQAA2BSFHAAAgE1RyAEAANgU18j5wMaNGy2xO+64w6V95MiR0koHAADYFCtyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTDmOM8XUSebKyslSpUiVfpwE/k5mZqYoVK/o6DQBlEPMSCuIvcxMrcgAAADZFIQcAAGBTFHIAAAA25VeFnB9drgc/wusCgK/w+wcF8ZfXhl8VcsePH/d1CvBDvC4A+Aq/f1AQf3lt+NWu1dzcXO3bt08RERFyOBy+Tgc+ZozR8ePHFRsbq4AAv/qbA0AZwbyE/PxtbvKrQg4AAACe830pCQAAgGKxXSFXu3ZtPfLII852enq6HA6H0tPTfZZTfvlzxOV55JFHVLt2bV+nAQAFYm4qe9q2bau2bdv6Oo2iFXIpKSlyOBzOr+DgYNWrV0+DBg3S77//XlI5loilS5dq7Nixvk7DrRdeeEE9evRQ1apV5XA4vJrnsWPHFBwcLIfDoa1btxZ7nJkzZyolJcVreZWk9957Tw8++KCuueYaORwOv/iPB8B7mJtKR25url5++WXVqVNHwcHBatSokebNm+eVsbdu3er82R07dqzY40yaNEmLFi3ySk6l4e2339b111+v4OBgXXPNNZo+fXqRxyjWitz48eM1Z84czZgxQy1btlRycrJuvfVWnTp1qjjDXZbWrVvr9OnTat26dZGOW7p0qcaNG1dCWV2e0aNH67vvvtNNN93k9bHnz58vh8OhatWqKS0trdjj2KmQS05O1uLFi1WzZk1FRkb6Oh0AJYS5qWSNGjVKzzzzjDp27Kjp06erVq1a6t27t959993LHjs1NVXVqlWTJH3wwQfFHsdOhdybb76p/v37q379+po+fbpuvfVWDRkyRC+99FKRxilfnAfv0qWLmjVrJknq37+/oqKiNHnyZC1evFgPPPCA22NOnjypsLCw4jzcJQUEBCg4ONjr4/rSrl27VLt2bR06dEjR0dFeHTs1NVUJCQmKi4vT3LlzNXHiRK+O74/mzJmjP/zhDwoICFCDBg18nQ6AEsLcVHL+97//6bXXXtPAgQM1Y8YMSRfOcZs2bTR8+HDdd999KleuXLHGNsZo7ty56t27t3bt2qW0tDT179/fm+n7ndOnT2vUqFHq2rWrs3B97LHHlJubqwkTJujxxx/3eOHBK9fItW/fXtKFAkS6cE1TeHi4du7cqYSEBEVERKhPnz6SLizNTp06VfXr11dwcLCqVq2qpKQkHT161GVMY4wmTpyoGjVqKDQ0VO3atdOWLVssj13QdQjffPONEhISFBkZqbCwMDVq1EjTpk1z5vf6669LkstyfB5v5yhJO3fu1M6dOz06nyV1Pdju3bu1du1aJSYmKjExUbt27dKXX37ptm9qaqpatGih0NBQRUZGqnXr1lqxYoUzvy1btmj16tXOc5f3duXYsWPdbtHPe+sjIyPDGVu8eLG6du2q2NhYBQUFKT4+XhMmTND58+cLfS779+/Xtm3bdO7cuUL71qxZ0y+2iAMoXcxN3pubFi9erHPnzunJJ590xhwOh5544gnt3btXX331VaFjFGTdunXKyMhwzk1r1qzR3r17Lf1yc3M1bdo0NWzYUMHBwYqOjtadd96p77//3pnPyZMn9c477zjPXd41gQVda+1uzpo9e7bat2+vmJgYBQUF6YYbblBycrJHz2X37t3atm1bof1WrVqlw4cPu5xPSRo4cKBOnjypf//73x49nlTMFbn88l4EUVFRzlhOTo46d+6sVq1a6dVXX1VoaKgkKSkpSSkpKerXr5+GDBmiXbt2acaMGdqwYYPWrVunChUqSJKef/55TZw4UQkJCUpISNAPP/ygTp06KTs7u9B8Pv30U3Xr1k3Vq1fX0KFDVa1aNW3dulUff/yxhg4dqqSkJO3bt0+ffvqp5syZYzm+JHK84447JMmlkClt8+bNU1hYmLp166aQkBDFx8crLS1NLVu2dOk3btw4jR07Vi1bttT48eMVGBiob775Rp9//rk6deqkqVOnavDgwQoPD9eoUaMkSVWrVi1yPikpKQoPD9ef//xnhYeH6/PPP9fzzz+vrKwsvfLKK5c89rnnntM777zjXL0EgPyYm7w3N23YsEFhYWG6/vrrXeItWrRwfr9Vq1aFngN30tLSFB8fr+bNm6tBgwYKDQ3VvHnzNHz4cJd+jz76qFJSUtSlSxf1799fOTk5Wrt2rb7++ms1a9ZMc+bMUf/+/dWiRQs9/vjjkqT4+Pgi55OcnKz69eurR48eKl++vJYsWaInn3xSubm5Gjhw4CWPffjhh7V69epCP/Vhw4YNkuRcQc7TtGlTBQQEaMOGDXrwwQc9S9gUwezZs40ks3LlSnPw4EGzZ88e8+6775qoqCgTEhJi9u7da4wxpm/fvkaSefbZZ12OX7t2rZFk0tLSXOLLli1ziR84cMAEBgaarl27mtzcXGe/kSNHGkmmb9++ztiqVauMJLNq1SpjjDE5OTmmTp06Ji4uzhw9etTlcS4ea+DAgcbd0y+JHI0xJi4uzsTFxVke71IOHjxoJJkxY8YU6biCNGzY0PTp08fZHjlypKlSpYo5d+6cM7Z9+3YTEBBg7r77bnP+/HmX4y9+nvXr1zdt2rSxPMaYMWPcnte8186uXbucsVOnTln6JSUlmdDQUHPmzBlnrG/fvpZzl/cau3g8TxSUNwD7Ym4q+bmpa9eupm7dupb4yZMn3Z5TT2VnZ5uoqCgzatQoZ6x3797mxhtvdOn3+eefG0lmyJAhljEufp5hYWGW52iM+3nEGPdzlru5qXPnzpbn36ZNG8t80qZNG7c/v/wGDhxoypUr5/Z70dHRJjExsdAx8hTr/aYOHTooOjpaNWvWVGJiosLDw7Vw4UL94Q9/cOn3xBNPuLTnz5+vSpUqqWPHjjp06JDzq2nTpgoPD9eqVaskSStXrlR2drYGDx7ssuQ5bNiwQnPbsGGDdu3apWHDhumqq65y+Z4nd+UuqRwzMjJ8uhq3adMm/ec//3G5TuSBBx7QoUOHtHz5cmds0aJFys3N1fPPP295O9LbdzUPCQlx/vv48eM6dOiQbr/9dp06darQpemUlBQZY1iNA+DE3FRyc9Pp06cVFBRkieddB3j69OlCx3Dnk08+0eHDhy1z08aNG13eDl6wYIEcDofGjBljGaMk56bMzEwdOnRIbdq00S+//KLMzMxLHpuenu7RZ7CePn1agYGBbr8XHBxcpPNZrLdWX3/9ddWrV0/ly5dX1apVde2111om/fLly6tGjRouse3btyszM1MxMTFuxz1w4IAk6ddff5UkXXPNNS7fj46OLvTiv7yl9OJe1F4aOfpCamqqwsLCVLduXe3YsUPShRdL7dq1lZaWpq5du0q6cP4CAgJ0ww03lHhOW7Zs0ejRo/X5558rKyvL5XuF/WcBgPyYm0pubgoJCdHZs2ct8TNnzji/XxypqamqU6eOgoKCnHNTfHy8QkNDlZaWpkmTJkm6cP5iY2NVuXLlYj4Dz61bt05jxozRV199ZdnxnJmZqUqVKl32Y4SEhBT4dvyZM2eKdD6LVci1aNHC8r5ufkFBQZb/QLm5uYqJiSnwthfe3qFZHHbIsaiMMZo3b55OnjzptkA7cOCATpw4ofDw8Mt+rIL+Msq/geHYsWNq06aNKlasqPHjxys+Pl7BwcH64Ycf9Mwzzyg3N/eycwFQtjA3lZzq1atr1apVMsa4/J7fv3+/JCk2NrbIY2ZlZWnJkiU6c+aMpfCUpLlz5+qFF17wyoqbp3PTzp07dccdd+i6667T5MmTVbNmTQUGBmrp0qWaMmWK1+am6tWr6/z58zpw4IBLcZ6dna3Dhw8X6Xx6ZbODp+Lj47Vy5Urddtttl6w24+LiJF34C6Ru3brO+MGDBy27c9w9hiRt3rxZHTp0KLBfQT/U0sixtK1evVp79+7V+PHjLReqHj16VI8//rgWLVqkBx98UPHx8crNzdVPP/2kxo0bFzhmQecv7y++Y8eOubx9kPdXYp709HQdPnxYH374oct9lvJ2lwFAaWFuKlzjxo31z3/+U1u3bnVZEPjmm2+c3y+qDz/8UGfOnFFycrKqVKni8r2ff/5Zo0eP1rp169SqVSvFx8dr+fLlOnLkyCVX5S41N7m70XD+uWnJkiU6e/asPvroI9WqVcsZz3vr2lvyztf333+vhIQEZ/z7779Xbm5ukc5nqd6ToVevXjp//rwmTJhg+V5OTo7zJHfo0EEVKlTQ9OnTXd5rnjp1aqGP0aRJE9WpU0dTp061/NAuHivvvkH5+5RUjkW5/Yi35b2tOnz4cPXs2dPl67HHHtM111zj/CvvrrvuUkBAgMaPH2/5yyP/+XP3nyLvl9WaNWucsbzt4BfLu9/QxWNmZ2dr5syZHj2notx+BAAuhbmp8Lnpj3/8oypUqODyO9oYozfeeEN/+MMfLHc/8ERqaqrq1q2rAQMGWOamp59+WuHh4c656d5775Uxxu3Nkj2dmzIzM7Vp0yZnbP/+/Vq4cKFLP3dzU2ZmpmbPnu3Rc/L09iPt27dX5cqVLbc1SU5OVmhoqPNyJ0+U6opcmzZtlJSUpBdffFE//vijOnXqpAoVKmj79u2aP3++pk2bpp49eyo6OlpPP/20XnzxRXXr1k0JCQnasGGDPvnkE0vVnl9AQICSk5PVvXt3NW7cWP369VP16tW1bds2bdmyxXlhf9OmTSVJQ4YMUefOnVWuXDklJiaWWI5Fuf3InDlz9Ouvvzrfm1+zZo3zxr0PPfSQ8y+u9PR0tWvXTmPGjCnwI13Onj2rBQsWqGPHjgXenLJHjx6aNm2aDhw4oKuvvlqjRo3ShAkTdPvtt+uee+5RUFCQvvvuO8XGxurFF190nr/k5GRNnDhRV199tWJiYtS+fXt16tRJtWrV0qOPPqrhw4erXLlymjVrlqKjo7V7927nY7Zs2VKRkZHq27evhgwZIofDoTlz5nh0kahUtNuPrFmzxllYHjx4UCdPnnSez9atWxf5zusArizMTYXPTTVq1NCwYcP0yiuv6Ny5c2revLkWLVqktWvXKi0tzeVmwHm3SJk9e3aBn+26b98+rVq1SkOGDHH7/aCgIHXu3Fnz58/X3//+d7Vr104PPfSQ/v73v2v79u268847lZubq7Vr16pdu3YaNGiQ8/ytXLlSkydPVmxsrOrUqaObb75ZiYmJeuaZZ3T33XdryJAhOnXqlJKTk1WvXj398MMPzsft1KmTAgMD1b17dyUlJenEiRP6xz/+oZiYGOfbyJfi6e1HQkJCNGHCBA0cOFD33XefOnfurLVr1yo1NVUvvPBC0a4F9Hh/q/m/Ld7ffffdJfv17dvXhIWFFfj9t956yzRt2tSEhISYiIgI07BhQzNixAizb98+Z5/z58+bcePGmerVq5uQkBDTtm1bs3nzZhMXF3fJLd55vvjiC9OxY0cTERFhwsLCTKNGjcz06dOd38/JyTGDBw820dHRxuFwWLYLezNHY4p2+5G87cvuvi5+nkuWLDGSzBtvvFHgWAsWLDCSzNtvv11gn/T0dCPJTJs2zRmbNWuWuemmm0xQUJCJjIw0bdq0MZ9++qnz+7/99pvp2rWriYiIMJJctmCvX7/e3HzzzSYwMNDUqlXLTJ482e3tR9atW2duueUWExISYmJjY82IESPM8uXLLc/zcm8/kre93N2Xt27tAsB3mJtKZ246f/68mTRpkomLizOBgYGmfv36JjU11dJv+vTpRpJZtmxZgWO99tprRpL57LPPCuyTkpJiJJnFixcbYy6cm1deecVcd911JjAw0ERHR5suXbqY9evXO4/Ztm2bad26tQkJCbHcbmXFihWmQYMGJjAw0Fx77bUmNTXV7e1HPvroI9OoUSMTHBxsateubV566SUza9Ysy5xzObcfyfPWW2+Za6+91gQGBpr4+HgzZcoUl9upeMJhjIdLIPA7I0aM0Lx587Rjxw6328IBAChtvXr1UkZGhr799ltfp1ImlOpbq/CuVatW6a9//StFHADALxhjlJ6ertTUVF+nUmawIgcAAGBTfJI4AACATVHIAQAA2BSFHAAAgE1RyAEAANiUX+1azc3N1b59+xQREeGVz1aDvRljdPz4ccXGxlo+GxEASgPzEvLzt7nJrwq5ffv2qWbNmr5OA35mz549qlGjhq/TAFAGMS+hIP4yN/m+lLxIRESEr1OAH+J1AcBX+P2DgvjLa8OvCjmWreEOrwsAvsLvHxTEX14bflXIAQAAwHMUcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgUxRyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgUxRyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA2Vd7XCeDy1KtXzxLbtm2bS3vo0KGWPtOnTy+xnAAA9hIWFmaJvfLKKy7tpKQkS5/169dbYvfdd58l9uuvv15GdrgUVuQAAABsikIOAADApijkAAAAbIpCDgAAwKbY7GBzN910kyWWm5vr0t67d29ppQMAsKHq1atbYo899phLO//cIklNmza1xLp162aJvf7665eRHS6FFTkAAACbopADAACwKQo5AAAAm+IaOZtr3LixJXby5EmX9sKFC0spGwCAv4uOjrbE3nnnHR9kAm9gRQ4AAMCmKOQAAABsikIOAADApijkAAAAbIrNDjbSoEEDS2zQoEGW2Jw5c0ojHQCAnxsyZIgldtddd1liLVq08Npjtm7d2hILCHBdN9q4caOlz5o1a7yWQ1nCihwAAIBNUcgBAADYFIUcAACATVHIAQAA2BSbHWzkuuuus8TCwsIssffee6800gEA+LkpU6ZYYrm5uSX6mPfcc0+hsV9//dXS5/7777fE1q9f773ErlCsyAEAANgUhRwAAIBNUcgBAADYFIUcAACATbHZwUZGjBhhibm7YPT7778vjXQAAH5m6dKlLu38n6jgbYcPH7bETpw4YYnFxcW5tOvUqWPp8+2331pi5cqVu4zsygZW5AAAAGyKQg4AAMCmKOQAAABsimvk/FTt2rUtsWbNmlli//3vfy2xkydPlkRKAAA/0qZNG0vs2muvdWm7u/lvcW8I/MYbb1hiK1assMQyMzMtsfbt27u0R40a5dFjPvHEE5ZYcnKyR8eWFazIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNsdnBT7m7iNWdgwcPlnAmAABfc7cB7t1337XEqlSpUqzx3d1cfsGCBS7tcePGWfqcOnWqWOM//vjjlj7R0dGW2Msvv2yJBQcHu7RnzJhh6XPu3DmP8roSsCIHAABgUxRyAAAANkUhBwAAYFMUcgAAADbFZgc/1bBhQ4/6ubsQFABwZSlf3jpdF3djw+rVqy2xxMRES+zQoUPFGt+d/JsdXnzxRUufyZMnW2KhoaGWWP5576OPPrL02blzZ1FTtC1W5AAAAGyKQg4AAMCmKOQAAABsikIOAADAptjs4CduueUWl3a/fv0sfTZs2GCJffrppyWWEwDA3r7//ntL7E9/+pMl5s2NDZ5wt0GhT58+lljz5s1LIx1bY0UOAADApijkAAAAbIpCDgAAwKa4Rs5PdOjQwaVduXJlS59ly5ZZYmfOnCmxnAAA/isgoPC1mJtvvrkUMik6h8Nhibl7Pp48x7Fjx1piDz30ULHysiNW5AAAAGyKQg4AAMCmKOQAAABsikIOAADAptjs4CduvPFGl7YxxtLngw8+KK10AAB+ZMCAAZZYbm6uDzLxju7du1tiN910kyXm7jnmj7nb7FCWsCIHAABgUxRyAAAANkUhBwAAYFMUcgAAADbFZgcfqFatmiV2++23u7R//vlnS5+FCxeWWE4AAP/lbnOAv4qOjrbEbrjhBpf2yJEjiz3+wYMHXdrnzp0r9lhXAlbkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCm2OzgA4888oglFhMT49L+5JNPSikbAAC8Z9SoUZbYwIEDizVWRkaGJda3b1+X9u7du4s19pWCFTkAAACbopADAACwKQo5AAAAm+IaOR+Ii4srtM/Ro0dLIRMAAIpv6dKllti1117rtfF/+uknS+yLL77w2vhXAlbkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCm2OzgA926dSu0z5IlS0ohEwCAHTgcDkssIKDwtZguXbp4NP5bb71licXGxhZ6nLsccnNzPXpMT3Tv3t1rY12pWJEDAACwKQo5AAAAm6KQAwAAsCkKOQAAAJtis0MJa9WqlSVWrVo1H2QCALCr5ORkS+zll18u9LiPP/7YEvN0M0JxNy0U97g33nijWMeVdazIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNsdmhhN19992WWLly5SyxDRs2uLTXrFlTYjkBAOzlww8/tMSGDx9uiUVHR5dGOpd08OBBS2zr1q0u7ccff9zSZ//+/SWW05WMFTkAAACbopADAACwKQo5AAAAm+IaOS8KDQ21xBISEjw69oMPPnBpnz9/3is5AQDs79dff7XEEhMTLbG77rrLpT106NCSSqlAL7zwgiX2+uuvl3oeZQUrcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgU2x28KJz585ZYkePHrXEPvroI0ts2rRpJZITAODK5O7G8fljK1assPRxdzPe7t27W2L556q33nrL0sfhcFhiP/30kzVZlBhW5AAAAGyKQg4AAMCmKOQAAABsikIOAADAphzGGOPrJPJkZWWpUqVKvk4DfiYzM1MVK1b0dRoAyiDmJRTEX+YmVuQAAABsikIOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsikIOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsikIOAADApijkAAAAbIpCDgAAwKYo5AAAAGzKrwo5Y4yvU4Af4nUBwFf4/YOC+Mtrw68KuePHj/s6BfghXhcAfIXfPyiIv7w2HMZfSkpJubm52rdvnyIiIuRwOHydDnzMGKPjx48rNjZWAQF+9TcHgDKCeQn5+dvc5FeFHAAAADzn+1ISAAAAxUIhBwAAYFO2K+Rq166tRx55xNlOT0+Xw+FQenq6z3LKL3+OuDxt27ZV27ZtfZ0GABSIuanseeSRR1S7dm1fp1G0Qi4lJUUOh8P5FRwcrHr16mnQoEH6/fffSyrHErF06VKNHTvW12kUKi0tTQ6HQ+Hh4V4Zb+vWrc6f3bFjx4o9zqRJk7Ro0SKv5FSavvjiC+fr99ChQ75OB4AXMDeVjhdeeEE9evRQ1apV5XA4vJrnsWPHFBwcLIfDoa1btxZ7nJkzZyolJcVreZWk9957Tw8++KCuueYaORyOYi9YFGtFbvz48ZozZ45mzJihli1bKjk5WbfeeqtOnTpVrCQuR+vWrXX69Gm1bt26SMctXbpU48aNK6GsvOPEiRMaMWKEwsLCvDZmamqqqlWrJkn64IMPij2OHQu53NxcDR482KvnE4D/YG4qWaNHj9Z3332nm266yetjz58/Xw6HQ9WqVVNaWlqxx7FTIZecnKzFixerZs2aioyMLPY4xSrkunTpogcffFD9+/dXSkqKhg0bpl27dmnx4sUFHnPy5MliJ3kpAQEBCg4O9ostwN42ceJERURE6K677vLKeMYYzZ07V71791ZCQsJl/Wexo7feekt79uxR//79fZ0KgBLA3FSydu3apf379ys1NdXrY6empiohIUEPPPCA5s6d6/Xx/dGcOXOUmZmpzz//XLGxscUexyuvsPbt20u68EOWLrxvHB4erp07dyohIUERERHq06ePpAurIlOnTlX9+vUVHBysqlWrKikpSUePHnUZ0xijiRMnqkaNGgoNDVW7du20ZcsWy2MXdB3CN998o4SEBEVGRiosLEyNGjXStGnTnPm9/vrrkuSyHJ/H2zlK0s6dO7Vz505PT6m2b9+uKVOmaPLkySpfvrzHx13KunXrlJGRocTERCUmJmrNmjXau3evpV9ubq6mTZumhg0bKjg4WNHR0brzzjv1/fffS7pwzk6ePKl33nnHee7yrrso6JqBsWPHWu7BNHv2bLVv314xMTEKCgrSDTfcoOTkZI+ey+7du7Vt2zaPn/uRI0c0evRojR8/XldddZXHxwGwL+Ym785NJXU92O7du7V27Vrn3LRr1y59+eWXbvumpqaqRYsWCg0NVWRkpFq3bq0VK1Y489uyZYtWr17tPHd5b1e6m4Ok/3tbPiMjwxlbvHixunbtqtjYWAUFBSk+Pl4TJkzQ+fPnC30u+/fv17Zt23Tu3LlC+9asWdMrhb5XKoS8F0FUVJQzlpOTo86dO6tVq1Z69dVXFRoaKklKSkpSSkqK+vXrpyFDhmjXrl2aMWOGNmzYoHXr1qlChQqSpOeff14TJ05UQkKCEhIS9MMPP6hTp07Kzs4uNJ9PP/1U3bp1U/Xq1TV06FBVq1ZNW7du1ccff6yhQ4cqKSlJ+/bt06effqo5c+ZYji+JHO+44w5JcnmxXMqwYcPUrl07JSQk6P333/fomMKkpaUpPj5ezZs3V4MGDRQaGqp58+Zp+PDhLv0effRRpaSkqEuXLurfv79ycnK0du1aff3112rWrJnmzJmj/v37q0WLFnr88cclSfHx8UXOJzk5WfXr11ePHj1Uvnx5LVmyRE8++aRyc3M1cODASx778MMPa/Xq1R5/RMpf//pXVatWTUlJSZowYUKRcwVgP8xN3p+bSsK8efMUFhambt26KSQkRPHx8UpLS1PLli1d+o0bN05jx45Vy5YtNX78eAUGBuqbb77R559/rk6dOmnq1KkaPHiwwsPDNWrUKElS1apVi5xPSkqKwsPD9ec//1nh4eH6/PPP9fzzzysrK0uvvPLKJY997rnn9M4772jXrl2ltxHCFMHs2bONJLNy5Upz8OBBs2fPHvPuu++aqKgoExISYvbu3WuMMaZv375Gknn22Wddjl+7dq2RZNLS0lziy5Ytc4kfOHDABAYGmq5du5rc3Fxnv5EjRxpJpm/fvs7YqlWrjCSzatUqY4wxOTk5pk6dOiYuLs4cPXrU5XEuHmvgwIHG3dMviRyNMSYuLs7ExcVZHs+djz/+2JQvX95s2bLFGHPhfIaFhXl0bEGys7NNVFSUGTVqlDPWu3dvc+ONN7r0+/zzz40kM2TIEMsYFz/PsLAwy3PMy9Xd8xwzZozlfJ86dcrSr3PnzqZu3bousTZt2pg2bdpYYp6+fDdu3GjKlStnli9f7pLLwYMHPToegH9jbiqduSnPwYMHjSQzZsyYIh1XkIYNG5o+ffo42yNHjjRVqlQx586dc8a2b99uAgICzN13323Onz/vcvzFz7N+/fqW+cIY93OQMf/32tm1a5cz5m5uSkpKMqGhoebMmTPOmLv5Lu81dvF4nigob08Ua02vQ4cOio6OVs2aNZWYmKjw8HAtXLhQf/jDH1z6PfHEEy7t+fPnq1KlSurYsaMOHTrk/GratKnCw8O1atUqSdLKlSuVnZ2twYMHuyyFDhs2rNDcNmzYoF27dmnYsGGWt9A8+XiVksoxIyPDo794srOz9dRTT2nAgAG64YYbCu3vqU8++USHDx/WAw884Iw98MAD2rhxo8uS+4IFC+RwODRmzBjLGN7+eJqQkBDnvzMzM3Xo0CG1adNGv/zyizIzMy95bHp6usercUOGDFGXLl3UqVOny8oXgH9jbiq5uamkbNq0Sf/5z38sc9OhQ4e0fPlyZ2zRokXKzc3V888/b3k7siTnpuPHj+vQoUO6/fbbderUqUIv6UlJSZExplRvS1Kst1Zff/111atXT+XLl1fVqlV17bXXWk5s+fLlVaNGDZfY9u3blZmZqZiYGLfjHjhwQJL066+/SpKuueYal+9HR0cXurMjbym9QYMGnj+hUs7xUqZMmaJDhw55fddSamqq6tSpo6CgIO3YsUPShbdDQ0NDlZaWpkmTJkm6cP5iY2NVuXJlrz6+O+vWrdOYMWP01VdfWXaVZWZmqlKlSpf9GO+9956+/PJLbd68+bLHAuDfmJtKbm4qKampqQoLC1PdunWdc1NwcLBq166ttLQ0de3aVdKF8xcQEODVBY6CbNmyRaNHj9bnn3+urKwsl+8VtsjgC8Uq5Fq0aKFmzZpdsk9QUJDlP1Bubq5iYmIK3C0ZHR1dnHS8ypc5ZmZmauLEiXryySeVlZXlfAGdOHFCxhhlZGQoNDS0wP/IBcnKytKSJUt05swZy39uSZo7d65eeOEFr/xVU9AY+S8S3blzp+644w5dd911mjx5smrWrKnAwEAtXbpUU6ZMUW5u7mXnIknDhw/Xfffdp8DAQOdfnXn3z9uzZ4+ys7Mva7cQAP/B3GQvxhjNmzdPJ0+edFugHThwQCdOnPDKfVQ9nZuOHTumNm3aqGLFiho/frzi4+MVHBysH374Qc8884zX5iZv8s52SA/Fx8dr5cqVuu2221yWLvOLi4uTdOEvkLp16zrjBw8etOzOcfcYkrR582Z16NChwH4F/VBLI8eCHD16VCdOnNDLL7+sl19+2fL9OnXq6I9//GOR79/24Ycf6syZM0pOTlaVKlVcvvfzzz9r9OjRWrdunVq1aqX4+HgtX75cR44cueSqXEHnLzIy0u2NhvP+SsyzZMkSnT17Vh999JFq1arljOe9PeAte/bs0dy5c91uZ2/SpIluvPFG/fjjj159TAD2wtzkG6tXr9bevXs1fvx4XX/99S7fO3r0qB5//HEtWrRIDz74oOLj45Wbm6uffvpJjRs3LnDMS81N0oVC7eK3tvPPTenp6Tp8+LA+/PBDl3sA5u189keleoObXr166fz58253Debk5DgLgA4dOqhChQqaPn26y3VQU6dOLfQxmjRpojp16mjq1KmWguLisfJuCpu/T0nl6MkW75iYGC1cuNDy1a5dOwUHB2vhwoV67rnnLjmGO6mpqapbt64GDBignj17unw9/fTTCg8Pd/6Vd++998oY4/at3fznz13BFh8fr8zMTG3atMkZ279/vxYuXOjSr1y5cpYxMzMzNXv2bI+ek6e3H3F3Pu+//35J0r/+9S9NmTLFo8cDcOVibvL81ljelPe26vDhwy1z02OPPaZrrrnGOTfdddddCggI0Pjx4y2rYp7OTZK0Zs0aZyzvNloXczc3ZWdna+bMmR49p6LcfsRbSnVFrk2bNkpKStKLL76oH3/8UZ06dVKFChW0fft2zZ8/X9OmTVPPnj0VHR2tp59+Wi+++KK6deumhIQEbdiwQZ988ollRSm/gIAAJScnq3v37mrcuLH69eun6tWra9u2bdqyZYvz4smmTZtKunAhfOfOnVWuXDklJiaWWI6ebPEODQ11e/PfRYsW6dtvv7V8L28b+uzZswv8/Lx9+/Zp1apVGjJkiNvvBwUFqXPnzpo/f77+/ve/q127dnrooYf097//Xdu3b9edd96p3NxcrV27Vu3atdOgQYOc52/lypWaPHmyYmNjVadOHd18881KTEzUM888o7vvvltDhgzRqVOnlJycrHr16umHH35wPm6nTp0UGBio7t27KykpSSdOnNA//vEPxcTEaP/+/QWeozye3n7E3fnMW4Hr0qVLoa8nAFc+5ibPbj8yZ84c/frrr85rmtesWaOJEydKkh566CHnamB6erratWunMWPGFPgxXmfPntWCBQvUsWNHBQcHu+3To0cPTZs2TQcOHNDVV1+tUaNGacKECbr99tt1zz33KCgoSN99951iY2P14osvOs9fcnKyJk6cqKuvvloxMTFq3769OnXqpFq1aunRRx/V8OHDVa5cOc2aNUvR0dHavXu38zFbtmypyMhI9e3bV0OGDJHD4dCcOXM83lxXlNuPrFmzxllYHjx4UCdPnnSez9atW3v+qSBF2eKat033u+++u2S/wm6X8dZbb5mmTZuakJAQExERYRo2bGhGjBhh9u3b5+xz/vx5M27cOFO9enUTEhJi2rZtazZv3mzi4uIuucU7zxdffGE6duxoIiIiTFhYmGnUqJGZPn268/s5OTlm8ODBJjo62jgcDsu2ZG/maEzxtnjnKeh8Tp8+3Ugyy5YtK/DY1157zUgyn332WYF9UlJSjCSzePFiY8yFc/PKK6+Y6667zgQGBpro6GjTpUsXs379eucx27ZtM61btzYhISGWLe0rVqwwDRo0MIGBgebaa681qampbrd+f/TRR6ZRo0YmODjY1K5d27z00ktm1qxZlq3bl3v7kfy4/QhwZWFuKp25Ke/3rruvi5/nkiVLjCTzxhtvFDjWggULjCTz9ttvF9gnPT3dSDLTpk1zxmbNmmVuuukmExQUZCIjI02bNm3Mp59+6vz+b7/9Zrp27WoiIiKMJJe5Y/369ebmm282gYGBplatWmby5Mlubz+ybt06c8stt5iQkBATGxtrRowYYZYvX255npd7+5G8ucjdV1Fu7eIwxsMyE36nV69eysjI0LfffuvrVAAAkCSNGDFC8+bN044dOxQUFOTrdK54pfrWKrzHGKP09PQS+cw7AACKa9WqVfrrX/9KEVdKWJEDAACwqVLdtQoAAADvoZADAACwKQo5AAAAm6KQAwAAsCm/2rWam5urffv2KSIiwiuf+wl7M8bo+PHjio2NtXw2IgCUBuYl5Odvc5NfFXL79u1TzZo1fZ0G/MyePXtUo0YNX6cBoAxiXkJB/GVu8n0peZGIiAhfpwA/xOsCgK/w+wcF8ZfXhl8Vcixbwx1eFwB8hd8/KIi/vDb8qpADAACA5yjkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsikIOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsikIOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsikIOAADApijkAAAAbKq8rxO4kjRp0sQS+/DDDy2x2rVrl0I2l9apUydLbOvWrZbYnj17SiMdAMAVonv37pbYRx995NIeNGiQpc8bb7xhiZ0/f957iV2hWJEDAACwKQo5AAAAm6KQAwAAsCmukfOizp07W2JBQUE+yKRw7q5h+NOf/mSJJSYmlkY6AAAbioqKssRmzpxZ6HEzZsywxGbNmmWJnT59uniJlSGsyAEAANgUhRwAAIBNUcgBAADYFIUcAACATbHZ4TKUL+96+hISEnyUSdGtX7/eEvvzn/9siYWFhbm0T548WWI5AQDspXXr1pZYjRo1Cj1u3rx5ltiZM2e8klNZw4ocAACATVHIAQAA2BSFHAAAgE1RyAEAANgUmx0uQ7t27Vzat956q6XPyy+/XFrpFElkZKQldsMNN1hioaGhLm02OwBA2eTuk4pGjRpVrLHmzJljiRljijVWWceKHAAAgE1RyAEAANgUhRwAAIBNUcgBAADYFJsdPNSgQQNLLP+dqXfu3GnpM2nSpBLL6XL88Y9/9HUKAAAbadiwoSXWtGlTj47NyclxaX/yySdeyQmsyAEAANgWhRwAAIBNUcgBAADYFNfIeWj06NGWWFhYmEv7zjvvtPQ5ceJEieXkqcqVK1tibdq0scRyc3NLIx0AgA3de++9xT52xYoVXswEF2NFDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsis0ObvTs2dMSS0hIsMR27Njh0v7+++9LLKfLMWrUKEvM3caG9PR0S+zYsWMlkBEAwG5at27tUb/s7GxLzN08BO9gRQ4AAMCmKOQAAABsikIOAADApijkAAAAbIrNDm7cd999llhoaKglNnPmzNJIp8hq167t0u7Tp4+lz/nz5y2xiRMnWmLnzp3zWl4AAPto2bLlJdsFOXnypCX2448/eiMluMGKHAAAgE1RyAEAANgUhRwAAIBNUcgBAADYVJnf7FCpUiVL7JZbbvHo2OTkZG+n4xWPP/64S7tKlSqWPlu3brXEVq1aVWI5AQDspXnz5sU6zl/nxisVK3IAAAA2RSEHAABgUxRyAAAANlXmr5ELCgqyxP7whz9YYvPmzSuNdLwiPj6+0D6bN28uhUwAAHbVrFmzQvscO3bMEuMaudLFihwAAIBNUcgBAADYFIUcAACATVHIAQAA2FSZ3+xw/PhxS+zHH3+0xBo1amSJVa5c2aV95MgRr+XlqZiYGEusZ8+ehR73xRdflEQ6AAAbatWqlSXWu3fvQo/LzMy0xPbu3euVnOAZVuQAAABsikIOAADApijkAAAAbIpCDgAAwKbK/GaH06dPW2I7d+60xO69915L7N///rdLe/LkyV7Lq0GDBpZY3bp1LbHatWtbYsaYQsfPzc0tVl4AgCtPVFSUJRYQUPhaz6effloS6aAIWJEDAACwKQo5AAAAm6KQAwAAsCkKOQAAAJsq85sd3BkzZowl5nA4LLGuXbu6tOfNm+e1HA4dOmSJudvEUKVKlWKNn5KSUqzjAABXHk8+EejYsWOW2JtvvlkC2aAoWJEDAACwKQo5AAAAm6KQAwAAsCmH8eTusaUkKytLlSpV8nUaHmvcuLFL++qrr/ba2B988IFH/d555x1LrE+fPoUeV768fS6PzMzMVMWKFX2dBoAyyG7zkidq1Khhif3666+WWP4bAm/evNnSp2HDht5LzGb8ZW5iRQ4AAMCmKOQAAABsikIOAADApijkAAAAbMo+V7z7oR9//PGS7dLwyy+/FOu4Bg0aWGLuLmQFAFxZWrZsaYnl39jgzqJFi0ogG1wuVuQAAABsikIOAADApijkAAAAbIpCDgAAwKbY7GBzDofDo1h+bGwAgLIpKirKo36HDh1yaU+bNq0k0sFlYkUOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKzQ42Z4zxKAYAgCR17tzZo367d+92aWdmZpZEOrhMrMgBAADYFIUcAACATVHIAQAA2BTXyNlccHBwoX1Onz5dCpkAAPxNhQoVLLH4+HiPjj1z5oxL+9y5c17JCd7FihwAAIBNUcgBAADYFIUcAACATVHIAQAA2BSbHWyuX79+ltixY8dc2hMmTCilbAAA/iQ3N9cS+/777y2xBg0aWGI7duwokZzgXazIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNsdnB5r777jtLbPLkyS7tVatWlVY6AAA/cv78eUts1KhRlpgxxhJbv359ieQE72JFDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsymHcXeHoI1lZWapUqZKv04CfyczMVMWKFX2dBoAyiHkJBfGXuYkVOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCm/KuSMMb5OAX6I1wUAX+H3DwriL68Nvyrkjh8/7usU4Id4XQDwFX7/oCD+8tpwGH8pKSXl5uZq3759ioiIkMPh8HU68DFjjI4fP67Y2FgFBPjV3xwAygjmJeTnb3OTXxVyAAAA8JzvS0kAAAAUC4UcAACATdmukKtdu7YeeeQRZzs9PV0Oh0Pp6ek+yym//Dni8rRt21Zt27b1dRoAUCDmprLHX+amIhVyKSkpcjgczq/g4GDVq1dPgwYN0u+//15SOZaIpUuXauzYsb5Oo1BpaWlyOBwKDw/3ynhbt251/uyOHTtW7HEmTZqkRYsWeSWn0vTFF184X7+HDh3ydToAvIC5qXTs2LFDPXv2VGRkpEJDQ9WqVSutWrXKK2OXxbnp999/V79+/RQTE6OQkBA1adJE8+fPL/I4xVqRGz9+vObMmaMZM2aoZcuWSk5O1q233qpTp04VZ7jL0rp1a50+fVqtW7cu0nFLly7VuHHjSigr7zhx4oRGjBihsLAwr42ZmpqqatWqSZI++OCDYo9jp/8seXJzczV48GCvnk8A/oO5qeTs2bNHt956q7744gsNHz5cL774ok6cOKFOnTppzZo1lz1+WZubsrKy1KpVKy1YsEBJSUl69dVXFRERoV69emnu3LlFGqtYhVyXLl304IMPqn///kpJSdGwYcO0a9cuLV68uMBjTp48WZyHKlRAQICCg4P9Yguwt02cOFERERG66667vDKeMUZz585V7969lZCQoLS0NK+MaxdvvfWW9uzZo/79+/s6FQAlgLmp5Pztb3/TsWPHtHr1ao0cOVJDhw7Vl19+qerVq+upp566rLHL4tz05ptvaseOHVq0aJEmTJiggQMHatWqVWrevLn+8pe/KDs72+OxvPIKa9++vSRp165dkqRHHnlE4eHh2rlzpxISEhQREaE+ffpIurAqMnXqVNWvX1/BwcGqWrWqkpKSdPToUZcxjTGaOHGiatSoodDQULVr105btmyxPHZB1yF88803SkhIUGRkpMLCwtSoUSNNmzbNmd/rr78uSS7L8Xm8naMk7dy5Uzt37vT0lGr79u2aMmWKJk+erPLly3t83KWsW7dOGRkZSkxMVGJiotasWaO9e/da+uXm5mratGlq2LChgoODFR0drTvvvFPff/+9pAvn7OTJk3rnnXec5y7vuotHHnlEtWvXtow5duxYyz2YZs+erfbt2ysmJkZBQUG64YYblJyc7NFz2b17t7Zt2+bxcz9y5IhGjx6t8ePH66qrrvL4OAD2xdzkvblp7dq1uummm3Tttdc6Y6GhoerRo4d++OEHbd++vdAxClIW56a1a9cqOjra+RqVLhT/vXr10m+//abVq1d79HiS5JUKIe9FEBUV5Yzl5OSoc+fOatWqlV599VWFhoZKkpKSkpSSkqJ+/fppyJAh2rVrl2bMmKENGzZo3bp1qlChgiTp+eef18SJE5WQkKCEhAT98MMP6tSpk0dV6qeffqpu3bqpevXqGjp0qKpVq6atW7fq448/1tChQ5WUlKR9+/bp008/1Zw5cyzHl0SOd9xxhyQpIyPDo3M6bNgwtWvXTgkJCXr//fc9OqYwaWlpio+PV/PmzdWgQQOFhoZq3rx5Gj58uEu/Rx99VCkpKerSpYv69++vnJwcrV27Vl9//bWaNWumOXPmqH///mrRooUef/xxSVJ8fHyR80lOTlb9+vXVo0cPlS9fXkuWLNGTTz6p3NxcDRw48JLHPvzww1q9erXHH5Hy17/+VdWqVVNSUpImTJhQ5FwB2A9zk/fmprNnzyoyMtISzzt/69ev1zXXXFPoOXCnLM5NZ8+eVUhIiCV+8fns2LGjZwmbIpg9e7aRZFauXGkOHjxo9uzZY959910TFRVlQkJCzN69e40xxvTt29dIMs8++6zL8WvXrjWSTFpamkt82bJlLvEDBw6YwMBA07VrV5Obm+vsN3LkSCPJ9O3b1xlbtWqVkWRWrVpljDEmJyfH1KlTx8TFxZmjR4+6PM7FYw0cONC4e/olkaMxxsTFxZm4uDjL47nz8ccfm/Lly5stW7YYYy6cz7CwMI+OLUh2draJiooyo0aNcsZ69+5tbrzxRpd+n3/+uZFkhgwZYhnj4ucZFhZmeY55ubp7nmPGjLGc71OnTln6de7c2dStW9cl1qZNG9OmTRtLzNOX78aNG025cuXM8uXLXXI5ePCgR8cD8G/MTSU/N3Xv3t1cddVVJisryyV+6623Gknm1VdfLXQMd8rq3DR48GATEBBgMjIyXOKJiYlGkhk0aFChY+Qp1lurHTp0UHR0tGrWrKnExESFh4dr4cKF+sMf/uDS74knnnBpz58/X5UqVVLHjh116NAh51fTpk0VHh7u3P2ycuVKZWdna/DgwS5LnsOGDSs0tw0bNmjXrl0aNmyY5S00Tz5epaRyzMjI8Gg1Ljs7W0899ZQGDBigG264odD+nvrkk090+PBhPfDAA87YAw88oI0bN7osuS9YsEAOh0NjxoyxjOHtj6e5+K+RzMxMHTp0SG3atNEvv/yizMzMSx6bnp7u8WrckCFD1KVLF3Xq1Omy8gXg35ibSm5ueuKJJ3Ts2DHdf//92rBhg/773/9q2LBhzrc1T58+XegY7pTVual///4qV66cevXqpS+//FI7d+7Uiy++qIULF0oq2vks1lurr7/+uurVq6fy5curatWquvbaay0XdJYvX141atRwiW3fvl2ZmZmKiYlxO+6BAwckSb/++qskWZZpo6Oj3S7tXixvKb1BgwaeP6FSzvFSpkyZokOHDnl911Jqaqrq1KmjoKAg7dixQ9KFJefQ0FClpaVp0qRJki6cv9jYWFWuXNmrj+/OunXrNGbMGH311VeWXWWZmZmqVKnSZT/Ge++9py+//FKbN2++7LEA+DfmppKbm7p06aLp06fr2WefVZMmTSRJV199tV544QWNGDGi2LfIKqtzU6NGjTR37lwNGDBAt912mySpWrVqmjp1qp544okinc9iFXItWrRQs2bNLtknKCjI8h8oNzdXMTExBe5IiY6OLk46XuXLHDMzMzVx4kQ9+eSTysrKUlZWlqQLtyExxigjI0OhoaEF/kcuSFZWlpYsWaIzZ864vYZh7ty5euGFF7zyV01BY5w/f96lvXPnTt1xxx267rrrNHnyZNWsWVOBgYFaunSppkyZotzc3MvORZKGDx+u++67T4GBgc6/OvPuUbRnzx5lZ2crNjbWK48FwLeYm0rWoEGD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sMRq1qxZ6FjuNkkcPny4eInBa1iRAwAAsCkKOQAAAJuikAMAALApCjkAAACbchhjjK+TyJOVleX20wVKW6dOnSyxTz75pNDjqlWrZokdPHjQKzl5W/369S2x//znP5bYwoULXdqPPPKIpc/x48e9lpc7mZmZbi+yBYCS5i/zkqdq1Kjh0t6wYYOlT1RUlCXmSSngbtPfoEGDLLEjR44UOtaVwF/mJlbkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmyvwnO8TExFhi9957r0fHPvrooy5tO21sWLlypUfH5t/sUNIbGwAAxff000+7tPN/AtHluP/++y2xO++80xJz98kR06dPd2lnZ2d7La+yjhU5AAAAm6KQAwAAsCkKOQAAAJsq89fIvfbaa5bYgw8+aImtX7/eEps/f36J5ORtt99+uyVWtWpVSywlJcUSS01NLYmUAACXKS4uzhLr169focdt2rTJEvv9998tsQ4dOhQ6lrubJee/Tk+S0tLSXNq//fZboWPDM6zIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNlfnNDsYYSyw3N9cS27dvnyXmDzc0DAkJscRGjhzp0n7yySctfdw97z/96U/eSwwAUKIaN25siUVERLi0165da+nTpk0bSyw4ONgSe+CBB1za+ecWSYqPj7fEqlWrZoktXrzYpd2lSxdLnyNHjlhiKBwrcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgU2V+s4OnunbtaomtWLHCpX3s2DFLn+TkZK/l4O4C1bZt21pit9xyS6FjffDBB95ICQDgI0FBQZZY/o1sU6ZM8WisM2fOWGKzZ892ad93332WPnXr1vVo/FOnTrm0/WGz4JWCFTkAAACbopADAACwKQo5AAAAm6KQAwAAsKkyv9lh2rRplli7du0ssdjYWEusdevWLm2Hw2Hp06NHj8vIzpW78d19QkN+v/zyiyXm7g7dAAD7yP/JC+6426i3aNGiYj1es2bNinWcJH399dcu7RMnThR7LLhiRQ4AAMCmKOQAAABsikIOAADApsr8NXLr16+3xBo1amSJNW7c2BK78847XdrDhw+39Dl48KAl9s477xQhw/8zZ84cS2zjxo2FHvfll19aYjt37ixWDgAA/zBv3jxLLP912c2bN7f0ue666yyxhg0bWmJ33323SzsyMtLSx92N8N31e+yxx1za7uazn376yRJD4ViRAwAAsCkKOQAAAJuikAMAALApCjkAAACbchhP7ihbSrKyslSpUiVfp+G36tata4nt2LHDEvvxxx9d2p07d7b0cbcJw19lZmaqYsWKvk4DQBnkz/NS5cqVLbH8c4K73It7c/mVK1daYgMHDrTEPv74Y0vsmmuucWn/4x//sPQZMGBAoTn4E3+Zm1iRAwAAsCkKOQAAAJuikAMAALApCjkAAACbKvOf7GAnzz//vCXm7gLVZ555xqVtp40NAADPHDlyxBLr1auXS/uDDz6w9PF088b06dNd2vnnFkk6c+aMJfbhhx9aYs8++6xL290mvPj4eEuMTyEqHCtyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTbHbwU/fdd58l9vDDD1tix48ft8QOHz5cIjkBAPxb/k9f6Nmzp6VP7969LbFjx45ZYvk32Lnb2ODOhAkTLLHrr7/epd2jR49CH0+S+vbt69FjlmWsyAEAANgUhRwAAIBNUcgBAADYFNfI+akuXbp41O/jjz+2xH744QdvpwMAsKH818wVFPOm06dPW2LvvfeeS9vdNXLt2rWzxCpXrmyJubsRclnGihwAAIBNUcgBAADYFIUcAACATVHIAQAA2BSbHfyUu80OJ0+etMRee+210kgHAIBie//9913a7jY73H///ZbYoEGDLLHx48d7L7ErACtyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTDmOM8XUSebKyslSpUiVfp+ETAwYMcGnPnDnT0ufAgQOWWLVq1UosJ3+RmZmpihUr+joNAGVQWZ6XSlLjxo0tsXXr1lliwcHBltj111/v0v7vf//rtbyKwl/mJlbkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCm+GQHP5F/s4O7PSj//ve/PRorIiLCpR0ZGWnps3v37iJkBwCA9/z444+W2PPPP2+JvfLKK5bYpEmTXNoPPfSQpc/p06eLn5zNsCIHAABgUxRyAAAANkUhBwAAYFNcI2cj58+ft8T69OljiT311FMu7S1btlj69O3b13uJAQBwmf71r39ZYklJSZbYPffc49IeP368pc+mTZu8l5ifY0UOAADApijkAAAAbIpCDgAAwKYo5AAAAGzKYdzdedZHsrKyVKlSJV+n4RP5b47YsGFDSx+Hw2GJufvxvf322y7tCRMmWPrs2bOniBn6TmZmpipWrOjrNACUQWV5XvIHtWrVssQyMjJc2vPmzbP0cbcR0Nv8ZW5iRQ4AAMCmKOQAAABsikIOAADApijkAAAAbIpPdvATgwYNcmm7u1P1mjVrLLHk5GRL7OjRoy7t7Ozsy8wOAIDSt3v3bkts5cqVLu0ePXpY+txwww2W2E8//eS9xPwIK3IAAAA2RSEHAABgUxRyAAAANkUhBwAAYFNsdvATX3zxhUu7ffv2PsoEAAD/1bNnT5f2xo0bLX2uvvpqS4zNDgAAAPArFHIAAAA2RSEHAABgU1wjBwAAbCMrK8ulXadOHR9l4h9YkQMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACb8qtCzhjj6xTgh3hdAPAVfv+gIP7y2vCrQu748eO+TgF+iNcFAF/h9w8K4i+vDYfxl5JSUm5urvbt26eIiAg5HA5fpwMfM8bo+PHjio2NVUCAX/3NAaCMYF5Cfv42N/lVIQcAAADP+b6UBAAAQLHYrpCrXbu2HnnkEWc7PT1dDodD6enpPsspv/w54vK0bdtWbdu29XUaAFAg5qayx1/mpiIVcikpKXI4HM6v4OBg1atXT4MGDdLvv/9eUjmWiKVLl2rs2LG+TsMiIyPD5Rxf/PXuu+9e9vhbt251/uyOHTtW7HEmTZqkRYsWXXY+paGg8/m3v/3N16kB8ALmptKxY8cO9ezZU5GRkQoNDVWrVq20atUqr4xdFuem33//Xf369VNMTIxCQkLUpEkTzZ8/v8jjlC/Og48fP1516tTRmTNn9MUXXyg5OVlLly7V5s2bFRoaWpwhi61169Y6ffq0AgMDi3Tc0qVL9frrr/vtf5gHHnhACQkJLrFbb731ssdNTU1VtWrVdPToUX3wwQfq379/scaZNGmSevbsqbvuuuuycyoNHTt21MMPP+wSu+mmm3yUDYCSwNxUcvbs2aNbb71V5cqV0/DhwxUWFqbZs2erU6dO+uyzz9S6devLGr+szU1ZWVlq1aqVfv/9dw0dOlTVqlXT+++/r169eiktLU29e/f2eKxiFXJdunRRs2bNJEn9+/dXVFSUJk+erMWLF+uBBx5we8zJkycVFhZWnIe7pICAAAUHB3t9XF9r0qSJHnzwQa+OaYzR3Llz1bt3b+3atUtpaWnF/s9iN/Xq1fP6+QTgX5ibSs7f/vY3HTt2TJs3b9a1114rSXrsscd03XXX6amnntL69euLPXZZnJvefPNN7dixQ5999pnat28vSXriiSd0yy236C9/+Yt69uzp8R8BXrlGLi+JXbt2SZIeeeQRhYeHa+fOnUpISFBERIT69Okj6cJW7qlTp6p+/foKDg5W1apVlZSUpKNHj7qMaYzRxIkTVaNGDYWGhqpdu3basmWL5bELug7hm2++UUJCgiIjIxUWFqZGjRpp2rRpzvxef/11Sa5vu+Xxdo6StHPnTu3cudPTUyrpwi+Y7OzsIh1zKevWrVNGRoYSExOVmJioNWvWaO/evZZ+ubm5mjZtmho2bKjg4GBFR0frzjvv1Pfffy/pwjk7efKk3nnnHee5y7vu4pFHHlHt2rUtY44dO9aydX/27Nlq3769YmJiFBQUpBtuuEHJyckePZfdu3dr27ZtRXr+p0+f1pkzZ4p0DAD7Ym7y3ty0du1a3XTTTc4iTpJCQ0PVo0cP/fDDD9q+fXuhYxSkLM5Na9euVXR0tPM1Kl0o/nv16qXffvtNq1ev9ujxpGKuyOWX9yKIiopyxnJyctS5c2e1atVKr776qnNZOykpSSkpKerXr5+GDBmiXbt2acaMGdqwYYPWrVunChUqSJKef/55TZw4UQkJCUpISNAPP/ygTp06eVTYfPrpp+rWrZuqV6/uXLLcunWrPv74Yw0dOlRJSUnat2+fPv30U82ZM8dyfEnkeMcdd0i6cA2cJ8aNG6fhw4fL4XCoadOmeuGFF9SpUyePji1IWlqa4uPj1bx5czVo0EChoaGaN2+ehg8f7tLv0UcfVUpKirp06aL+/fsrJydHa9eu1ddff61mzZppzpw56t+/v1q0aKHHH39ckhQfH1/kfJKTk1W/fn316NFD5cuX15IlS/Tkk08qNzdXAwcOvOSxDz/8sFavXu3xnbVTUlI0c+ZMGWN0/fXXa/To0UVaugZgP8xN3pubzp49q8jISEs87/ytX79e11xzTaHnwJ2yODedPXtWISEhlvjF57Njx46eJWyKYPbs2UaSWblypTl48KDZs2ePeffdd01UVJQJCQkxe/fuNcYY07dvXyPJPPvssy7Hr1271kgyaWlpLvFly5a5xA8cOGACAwNN165dTW5urrPfyJEjjSTTt29fZ2zVqlVGklm1apUxxpicnBxTp04dExcXZ44ePeryOBePNXDgQOPu6ZdEjsYYExcXZ+Li4iyPl9+vv/5qOnXqZJKTk81HH31kpk6damrVqmUCAgLMxx9/XOjxBcnOzjZRUVFm1KhRzljv3r3NjTfe6NLv888/N5LMkCFDLGNc/DzDwsIsz9GYCz97d89zzJgxlvN96tQpS7/OnTubunXrusTatGlj2rRpY4l5+vJt2bKlmTp1qlm8eLFJTk42DRo0MJLMzJkzPToegH9jbir5ual79+7mqquuMllZWS7xW2+91Ugyr776aqFjuFNW56bBgwebgIAAk5GR4RJPTEw0ksygQYMKHSNPsd5a7dChg6Kjo1WzZk0lJiYqPDxcCxcu1B/+8AeXfk888YRLe/78+apUqZI6duyoQ4cOOb+aNm2q8PBw5+6XlStXKjs7W4MHD3ZZ8hw2bFihuW3YsEG7du3SsGHDdNVVV7l8z5O7cpdUjhkZGR6txtWqVUvLly/XgAED1L17dw0dOlQbNmxQdHS0/vKXvxR6fEE++eQTHT582OU6kQceeEAbN250WXJfsGCBHA6HxowZYxnD23c1v/ivkczMTB06dEht2rTRL7/8oszMzEsem56e7vFq3Lp16zR06FD16NFDAwYM0Pr169WgQQONHDlSp0+fvqznAMB/MDeV3Nz0xBNP6NixY7r//vu1YcMG/fe//9WwYcOcb2sW93dpWZ2b+vfvr3LlyqlXr1768ssvtXPnTr344otauHChpKKdz2K9tfr666+rXr16Kl++vKpWraprr73W8jEV5cuXV40aNVxi27dvV2ZmpmJiYtyOe+DAAUnSr7/+KkmWZdro6Gi3S7sXy1tKb9CggedPqJRzLKrKlSurX79++tvf/qa9e/dazqsnUlNTVadOHQUFBWnHjh2SLiw5h4aGKi0tTZMmTZJ04fzFxsaqcuXKXn0O7qxbt05jxozRV199pVOnTrl8LzMzU5UqVSqRxw0MDNSgQYOcRV2rVq1K5HEAlC7mppKbm7p06aLp06fr2WefVZMmTSRJV199tV544QWNGDFC4eHhxRq3rM5NjRo10ty5czVgwADddtttkqRq1app6tSpeuKJJ4p0PotVyLVo0cK5M6ggQUFBlv9Aubm5iomJUVpamttjoqOji5OOV/lrjjVr1pQkHTlypMiFXFZWlpYsWaIzZ864vYZh7ty5euGFF7zyV01BY5w/f96lvXPnTt1xxx267rrrNHnyZNWsWVOBgYFaunSppkyZotzc3MvO5VIuPp8ArgzMTSVr0KBB6tevnzZt2qTAwEA1btxYb7/9tqQLdwYoqrI+N/Xs2VM9evTQxo0bdf78eTVp0sS5OaYo59Mrmx08FR8fr5UrV+q2225ze5Ffnri4OEkX/gKpW7euM37w4EHL7hx3jyFJmzdvVocOHQrsV9APtTRyLI5ffvlFUvH+s3744Yc6c+aMkpOTVaVKFZfv/fzzzxo9erTWrVunVq1aKT4+XsuXL9eRI0cu+ZdPQecvMjLS7c0c8/5KzLNkyRKdPXtWH330kWrVquWMe+vmkoW5nPMJ4MrC3OS5sLAwl3uarly5UiEhIc5VpaJgbrrwDlHz5s2d7ZUrV0rSJV8j+ZXqR3T16tVL58+f14QJEyzfy8nJcZ7kDh06qEKFCpo+fbrLe81Tp04t9DGaNGmiOnXqaOrUqZYf2sVj5d03KH+fksrR0y3eBw8etMT+97//adasWWrUqJGqV69e6Bj5paamqm7duhowYIB69uzp8vX0008rPDzc+VfevffeK2OMxo0bZxkn//lz958iPj5emZmZ2rRpkzO2f/9+5/v+ecqVK2cZMzMzU7Nnz/boOXm6xdvd+Tx+/LimTp2qKlWqqGnTph49HoArF3NT0W6NlefLL7/Uhx9+qEcffbRYbzeW5bnJne3bt+uNN95Qt27dirbC6fG2CPN/O4O+++67S/br27evCQsLc/u9pKQkI8l06dLFTJkyxcyYMcMMHTrUxMbGmvnz5zv7Pffcc0aSSUhIMDNmzDCPPvqoiY2NNVWqVLnkziBjLuziqVChgomLizNjx441b775pnnqqadMp06dnH3ef/99I8k89NBDJjU11cybN6/EcjTG851BjzzyiLn99tvN2LFjzVtvvWVGjhxpoqKiTGBgoMtzNOb/fh6zZ88ucLz//e9/JiAgwAwbNqzAPvfee6+Jiooy2dnZxhhjHnroIefznzZtmpkyZYq55557zPTp053HJCQkmLCwMPPaa6+ZefPmma+//toYY8yhQ4dMWFiYqVu3rpk6daqZNGmSqVmzpmnSpInLTp5t27aZwMBA07BhQzNjxgzzt7/9zcTHx5sbb7zRSDK7du1y9r2cnUFjxowxN954oxk9erR56623zLhx40xcXJxxOBwmNTW10OMB+D/mppKfmzIyMkyLFi3MxIkTzT//+U/z1FNPmZCQEHPTTTdZdrIyN3lWWl1//fXm+eefN//85z/NqFGjTOXKlU1cXJxzl7WnSr2QM8aYt956yzRt2tSEhISYiIgI07BhQzNixAizb98+Z5/z58+bcePGmerVq5uQkBDTtm1bs3nzZhMXF1fofxZjjPniiy9Mx44dTUREhAkLCzONGjVy+WHn5OSYwYMHm+joaONwOCwn3ps5GuP5f5a5c+ea1q1bm+joaFO+fHlTpUoVc/fdd5v169db+k6fPt1IMsuWLStwvNdee81IMp999lmBfVJSUowks3jxYue5eeWVV8x1111nAgMDTXR0tOnSpYtLDtu2bTOtW7c2ISEhli3tK1asMA0aNDCBgYHm2muvNampqW63eH/00UemUaNGJjg42NSuXdu89NJLZtasWV79z7JixQrTsWNHU61aNVOhQgVz1VVXmU6dOl3yfACwF+amkp+bjhw5Yv74xz+aatWqmcDAQFOnTh3zzDPPWIo4Y5ibPC3kEhMTTc2aNU1gYKCJjY01AwYMML///rtHx17MYYyH93CA3+nVq5cyMjL07bff+joVAAAkMTeVtlLd7ADvMcYoPT1dqampvk4FAABJzE2+wIocAACATZXqrlUAAAB4D4UcAACATVHIAQAA2BSFHAAAgE351a7V3Nxc7du3TxEREV75bDXYmzFGx48fV2xsrOWzEQGgNDAvIT9/m5v8qpDbt2+f88PMgTx79uxRjRo1fJ0GgDKIeQkF8Ze5yfel5EUiIiJ8nQL8EK8LAL7C7x8UxF9eG35VyLFsDXd4XQDwFX7/oCD+8trwq0IOAAAAnqOQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALCp8r5OAN4XGRnp0q5Vq1axx/r1119d2k899ZSlz+bNmy2x//73v5bYxo0bi50HAACwYkUOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKzQ420rVrV0usR48elljbtm1d2ldffXWxHzP/poW4uDhLn6CgII/GKleuXLHzAAAAVqzIAQAA2BSFHAAAgE1RyAEAANgU18j5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", + "text/plain": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" diff --git a/examples/cnn-classification/simple_cnn_classification_mnist.ipynb b/examples/cnn-classification/simple_cnn_classification_mnist.ipynb index cfbca99..6539559 100644 --- a/examples/cnn-classification/simple_cnn_classification_mnist.ipynb +++ b/examples/cnn-classification/simple_cnn_classification_mnist.ipynb @@ -27,8 +27,8 @@ }, "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", "import numpy as np\n", + "import matplotlib.pyplot as plt\n", "from tensorflow.keras.datasets import mnist\n", "\n", "from neuralnetlib.activations import ReLU, Softmax\n", @@ -36,7 +36,7 @@ "from neuralnetlib.losses import CategoricalCrossentropy\n", "from neuralnetlib.model import Model\n", "from neuralnetlib.optimizers import Adam\n", - "from neuralnetlib.utils import one_hot_encode\n", + "from neuralnetlib.preprocessing import one_hot_encode\n", "from neuralnetlib.metrics import accuracy_score, f1_score, recall_score" ] }, @@ -104,7 +104,9 @@ "outputs": [ { "data": { - "text/plain": "\"\\n Side note: if you set the following:\\n \\n - filters to 8 and 16 (in this order)\\n - padding of the Conv2D layers to 'same'\\n - weights initialization to 'he'\\n \\n you'll get an accuracy of ~0.9975 which is actually pretty cool\\n\"" + "text/plain": [ + "\"\\n Side note: if you set the following:\\n \\n - filters to 8 and 16 (in this order)\\n - padding of the Conv2D layers to 'same'\\n - weights initialization to 'he'\\n \\n you'll get an accuracy of ~0.9975 which is actually pretty cool\\n\"" + ] }, "execution_count": 10, "metadata": {}, @@ -327,8 +329,10 @@ "outputs": [ { "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnIAAAMsCAYAAADQ3U+mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACBBElEQVR4nO3deXRURfr/8U8HyB4whATIAAGiuLCIbCoimywSlnFBjKAiIxqU1RlBBUZWcdxYBiTqjBCHBFREQBwERAkg7ogwIDiARGBA2RP2EFK/P/ilv3Ruh3RCJ92XvF/n5BzqSd3qp2+a1JPqW7cdxhgjAAAA2E6ArxMAAABA8VDIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNUcgBAADYFIUcAACATVHIAQAA2BSFHAAAgE3ZrpCrXbu2HnnkEWc7PT1dDodD6enpPsspv/w54vK0bdtWbdu29XUaAFAg5qay55FHHlHt2rV9nUbRCrmUlBQ5HA7nV3BwsOrVq6dBgwbp999/L6kcS8TSpUs1duxYX6dhMXbsWJdznP9r3bp1lzX+1q1bnT+7Y8eOFXucSZMmadGiRZeVS2nI/5rN/5WWlubrFAFcJuamkrdt2zaNGDFCjRs3VkREhKpXr66uXbvq+++/98r4x44dU3BwsBwOh7Zu3VrscWbOnKmUlBSv5FSSDh8+rFdeeUWtW7dWdHS0rrrqKt1yyy167733ijxW+eIkMH78eNWpU0dnzpzRF198oeTkZC1dulSbN29WaGhocYYsttatW+v06dMKDAws0nFLly7V66+/7nf/Ye655x5dffXVlvjIkSN14sQJNW/e/LLGT01NVbVq1XT06FF98MEH6t+/f7HGmTRpknr27Km77rrrsvIpaa1bt9acOXMs8SlTpmjjxo264447fJAVgJLA3FRy/vnPf+rtt9/WvffeqyeffFKZmZl68803dcstt2jZsmXq0KHDZY0/f/58ORwOVatWTWlpaZo4cWKxxpk5c6aqVKni9yuPX331lUaNGqWEhASNHj1a5cuX14IFC5SYmKiffvpJ48aN83isYhVyXbp0UbNmzSRJ/fv3V1RUlCZPnqzFixfrgQcecHvMyZMnFRYWVpyHu6SAgAAFBwd7fVxfadSokRo1auQS27Nnj/bu3av+/fsX+ZfCxYwxmjt3rnr37q1du3YpLS2t2IWcXdStW1d169Z1iZ0+fVpPPvmk2rdvr2rVqvkoMwDextxUch544AGNHTtW4eHhztif/vQnXX/99Ro7duxlF3KpqalKSEhQXFyc5s6dW+xCzi7q16+v7du3Ky4uzhl78skn1aFDB7300ksaMWKEx69Lr1wj1759e0nSrl27JF143zg8PFw7d+5UQkKCIiIi1KdPH0lSbm6upk6dqvr16ys4OFhVq1ZVUlKSjh496jKmMUYTJ05UjRo1FBoaqnbt2mnLli2Wxy7oOoRvvvlGCQkJioyMVFhYmBo1aqRp06Y583v99dclyWU5Po+3c5SknTt3aufOnZ6eUhfz5s2TMcZ5Dotr3bp1ysjIUGJiohITE7VmzRrt3bvX0i83N1fTpk1Tw4YNFRwcrOjoaN15553OJXSHw6GTJ0/qnXfecZ67vL9+CrpmIO8t44vNnj1b7du3V0xMjIKCgnTDDTcoOTnZo+eye/dubdu2rWgn4P9bsmSJjh8/ftnnE4B/Y27y3tzUtGlTlyJOkqKionT77bdf1luh0oXf52vXrnXOTbt27dKXX37ptm9qaqpatGih0NBQRUZGqnXr1lqxYoWkC9cAbtmyRatXr3aeu7zrq93NQdL/vS2fkZHhjC1evFhdu3ZVbGysgoKCFB8frwkTJuj8+fOFPpf9+/dr27ZtOnfu3CX71alTx6WIky78zO+66y6dPXtWv/zyS6GPladYK3L55b0IoqKinLGcnBx17txZrVq10quvvupc1k5KSlJKSor69eunIUOGaNeuXZoxY4Y2bNigdevWqUKFCpKk559/XhMnTlRCQoISEhL0ww8/qFOnTsrOzi40n08//VTdunVT9erVNXToUFWrVk1bt27Vxx9/rKFDhyopKUn79u3Tp59+6vZtt5LIMe8tvItfLJ5KS0tTzZo11bp16yIfm3+c+Ph4NW/eXA0aNFBoaKjmzZun4cOHu/R79NFHlZKSoi5duqh///7KycnR2rVr9fXXX6tZs2aaM2eO+vfvrxYtWujxxx+XJMXHxxc5n+TkZNWvX189evRQ+fLltWTJEj355JPKzc3VwIEDL3nsww8/rNWrV8sYU+THTUtLU0hIiO65554iHwvAPpibSnZukqTffvtNVapUKdaxeebNm6ewsDB169ZNISEhio+PV1pamlq2bOnSb9y4cRo7dqxatmyp8ePHKzAwUN98840+//xzderUSVOnTtXgwYMVHh6uUaNGSZKqVq1a5HxSUlIUHh6uP//5zwoPD9fnn3+u559/XllZWXrllVcueexzzz2nd955R7t27SrWRojffvtNkop2Tk0RzJ4920gyK1euNAcPHjR79uwx7777romKijIhISFm7969xhhj+vbtaySZZ5991uX4tWvXGkkmLS3NJb5s2TKX+IEDB0xgYKDp2rWryc3NdfYbOXKkkWT69u3rjK1atcpIMqtWrTLGGJOTk2Pq1Klj4uLizNGjR10e5+KxBg4caNw9/ZLI0Rhj4uLiTFxcnOXxCrN582YjyYwYMaLIx14sOzvbREVFmVGjRjljvXv3NjfeeKNLv88//9xIMkOGDLGMcfHzDAsLszxHYy787N09zzFjxljO96lTpyz9OnfubOrWresSa9OmjWnTpo0lVsSXrzHGmMOHD5vAwEDTq1evIh8LwD8xN5X+3GSMMWvWrDEOh8P89a9/LdbxeRo2bGj69OnjbI8cOdJUqVLFnDt3zhnbvn27CQgIMHfffbc5f/68y/EXP8/69etb5gtj3M9Bxvzfa2fXrl3OmLu5KSkpyYSGhpozZ844Y+7mu7zX2MXjeerw4cMmJibG3H777UU6rlhvrXbo0EHR0dGqWbOmEhMTFR4eroULF+oPf/iDS78nnnjCpT1//nxVqlRJHTt21KFDh5xfeUu2q1atkiStXLlS2dnZGjx4sMtS6LBhwwrNbcOGDdq1a5eGDRumq666yuV77pZV8yupHDMyMoq9Gifpst8G/OSTT3T48GGX60QeeOABbdy40WXJfcGCBXI4HBozZoxlDE/OX1GEhIQ4/52ZmalDhw6pTZs2+uWXX5SZmXnJY9PT04u1GvfBBx8oOzubt1WBKxBzU+nNTQcOHFDv3r1Vp04djRgxosjH59m0aZP+85//WOamQ4cOafny5c7YokWLlJubq+eff14BAa6lS0nOTcePH9ehQ4d0++2369SpU4Ve0pOSkiJjTJFX43Jzc9WnTx8dO3ZM06dPL9KxxXpr9fXXX1e9evVUvnx5Va1aVddee63lxJYvX141atRwiW3fvl2ZmZmKiYlxO+6BAwckSb/++qsk6ZprrnH5fnR0tCIjIy+ZW95SeoMGDTx/QqWco6fM/9+c0KBBA8sGiKJKTU1VnTp1FBQUpB07dki68HZoaGio0tLSNGnSJEkXzl9sbKwqV6582fkXZt26dRozZoy++uornTp1yuV7mZmZqlSpktcfMy0tTZUrV1aXLl28PjYA32JuKp256eTJk+rWrZuOHz+uL774wnLtXFGkpqYqLCxMdevWdc5NwcHBql27ttLS0tS1a1dJF85fQECAbrjhBq88h0vZsmWLRo8erc8//1xZWVku3ytskaG4Bg8erGXLlulf//qXbrzxxiIdW6xCrkWLFs6dQQUJCgqy/AfKzc1VTExMgffuio6OLk46XuVPOa5bt06//vqrXnzxxcsaJysrS0uWLNGZM2cs/7klae7cuXrhhRe88ldNQWPkv0h0586duuOOO3Tddddp8uTJqlmzpgIDA7V06VJNmTJFubm5l51LfnkX1D7++OPOa0kAXDmYm0pedna27rnnHm3atEnLly8vdmEqXVismDdvnk6ePOm2QDtw4IBOnDhxWYViHk/npmPHjqlNmzaqWLGixo8fr/j4eAUHB+uHH37QM888UyJz07hx4zRz5kz97W9/00MPPVTk472y2cFT8fHxWrlypW677TaXpcv88nZybN++3eXWEQcPHrTsznH3GJK0efPmS26HLuiHWho5eiotLU0Oh0O9e/e+rHE+/PBDnTlzRsnJyZYLKH/++WeNHj1a69atU6tWrRQfH6/ly5fryJEjl1yVK+j8RUZGur3RcN5fiXmWLFmis2fP6qOPPlKtWrWc8by3B0qCt3b/AriyMDd5Jjc3Vw8//LA+++wzvf/++2rTps1ljbd69Wrt3btX48eP1/XXX+/yvaNHj+rxxx/XokWL9OCDDyo+Pl65ubn66aef1Lhx4wLHvNTcJF0o1C5+azv/3JSenq7Dhw/rww8/dNlgmLfz2dvy7hk4bNgwPfPMM8Uao1Q/oqtXr146f/68JkyYYPleTk6OswDo0KGDKlSooOnTp7tcBzV16tRCH6NJkyaqU6eOpk6daikoLh4r7/4s+fuUVI5Fvf3IuXPnNH/+fLVq1cql0CmO1NRU1a1bVwMGDFDPnj1dvp5++mmFh4c7/8q79957ZYxxezPC/OfPXcEWHx+vzMxMbdq0yRnbv3+/Fi5c6NKvXLlyljEzMzM1e/Zsj55TcW4/MnfuXNWqVUutWrUq0nEArmzMTZ7NTYMHD9Z7772nmTNnemXXf97bqsOHD7fMTY899piuueYa59x01113KSAgQOPHj7esink6N0nSmjVrnLG822hdzN3clJ2drZkzZ3r0nDy9/YgkvffeexoyZIj69OmjyZMnezS+O6W6ItemTRslJSXpxRdf1I8//qhOnTqpQoUK2r59u+bPn69p06apZ8+eio6O1tNPP60XX3xR3bp1U0JCgjZs2KBPPvmk0C25AQEBSk5OVvfu3dW4cWP169dP1atX17Zt27RlyxbnxZNNmzaVJA0ZMkSdO3dWuXLllJiYWGI5FnWL9/Lly3X48OFLrh7lbUOfPXt2gXex3rdvn1atWqUhQ4a4/X5QUJA6d+6s+fPn6+9//7vatWunhx56SH//+9+1fft23XnnncrNzdXatWvVrl07DRo0yHn+Vq5cqcmTJys2NlZ16tTRzTffrMTERD3zzDO6++67NWTIEJ06dUrJycmqV6+efvjhB+fjdurUSYGBgerevbuSkpJ04sQJ/eMf/1BMTIz2799f6Pkp6u1HNm/erE2bNunZZ5/1+oWxAOyNuanwuWnq1KmaOXOmbr31VoWGhio1NdXl+3fffbezCE1PT1e7du00ZsyYAj+h4uzZs1qwYIE6duxY4I2Te/TooWnTpunAgQO6+uqrNWrUKE2YMEG333677rnnHgUFBem7775TbGys8xKkpk2bKjk5WRMnTtTVV1+tmJgYtW/fXp06dVKtWrX06KOPavjw4SpXrpxmzZql6Oho7d692/mYLVu2VGRkpPr27ashQ4bI4XBozpw5Hs81nt5+5Ntvv9XDDz+sqKgo3XHHHZa3zFu2bGm5mX2BirLFNW+b7nfffXfJfn379jVhYWEFfv+tt94yTZs2NSEhISYiIsI0bNjQjBgxwuzbt8/Z5/z582bcuHGmevXqJiQkxLRt29Zs3rzZxMXFXXKLd54vvvjCdOzY0URERJiwsDDTqFEjM336dOf3c3JyzODBg010dLRxOByWbcnezNGYom/xTkxMNBUqVDCHDx8usM/06dONJLNs2bIC+7z22mtGkvnss88K7JOSkmIkmcWLFxtjLpybV155xVx33XUmMDDQREdHmy5dupj169c7j9m2bZtp3bq1CQkJsWxpX7FihWnQoIEJDAw01157rUlNTXW79fujjz4yjRo1MsHBwaZ27drmpZdeMrNmzbJs3fbG7UeeffZZI8ls2rTJ42MA2ANzU8nPTXm3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BwUFqXPnzpo/f77+/ve/q127dnrooYf097//Xdu3b9edd96p3NxcrV27Vu3atdOgQYOc52/lypWaPHmyYmNjVadOHd18881KTEzUM888o7vvvltDhgzRqVOnlJycrHr16umHH35wPm6nTp0UGBio7t27KykpSSdOnNA//vEPxcTEaP/+/QWeozye3n7E3fnMW4Hr0qVLoa8nAFc+5ibPbj8yZ84c/frrr85rmtesWaOJEydKkh566CHnamB6erratWunMWPGFPgxXmfPntWCBQvUsWNHBQcHu+3To0cPTZs2TQcOHNDVV1+tUaNGacKECbr99tt1zz33KCgoSN99951iY2P14osvOs9fcnKyJk6cqKuvvloxMTFq3769OnXqpFq1aunRRx/V8OHDVa5cOc2aNUvR0dHavXu38zFbtmypyMhI9e3bV0OGDJHD4dCcOXM83lxXlNuPrFmzxllYHjx4UCdPnnSez9atW3v+qSBF2eKat033u+++u2S/wm6X8dZbb5mmTZuakJAQExERYRo2bGhGjBhh9u3b5+xz/vx5M27cOFO9enUTEhJi2rZtazZv3mzi4uIuucU7zxdffGE6duxoIiIiTFhYmGnUqJGZPn268/s5OTlm8ODBJjo62jgcDsu2ZG/maEzxtnjnKeh8Tp8+3Ugyy5YtK/DY1157zUgyn332WYF9UlJSjCSzePFiY8yFc/PKK6+Y6667zgQGBpro6GjTpUsXs379eucx27ZtM61btzYhISGWLe0rVqwwDRo0MIGBgebaa681qampbrd+f/TRR6ZRo0YmODjY1K5d27z00ktm1qxZlq3bl3v7kfy4/QhwZWFuKp25Ke/3rruvi5/nkiVLjCTzxhtvFDjWggULjCTz9ttvF9gnPT3dSDLTpk1zxmbNmmVuuukmExQUZCIjI02bNm3Mp59+6vz+b7/9Zrp27WoiIiKMJJe5Y/369ebmm282gYGBplatWmby5Mlubz+ybt06c8stt5iQkBATGxtrRowYYZYvX255npd7+5G8ucjdV1Fu7eIwxsMyE36nV69eysjI0LfffuvrVAAAkCSNGDFC8+bN044dOxQUFOTrdK54pfrWKrzHGKP09PQS+cw7AACKa9WqVfrrX/9KEVdKWJEDAACwqVLdtQoAAADvoZADAACwKQo5AAAAm6KQAwAAsCm/2rWam5ur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y5stW7YYYy6cz7CwMI+OLUh2draJiooyo0aNcsZ69+5tbrzxRpd+n3/+uZFkhgwZYhnj4ucZFhZmeY55ubp7nmPGjLGc71OnTln6de7c2dStW9cl1qZNG9OmTRtLzNOX78aNG025cuXM8uXLXXI5ePCgR8cD8G/MTSU/N3Xv3t1cddVVJisryyV+6623Gknm1VdfLXQMd8rq3DR48GATEBBgMjIyXOKJiYlGkhk0aFChY+Qp1lurHTp0UHR0tGrWrKnExESFh4dr4cKF+sMf/uDS74knnnBpz58/X5UqVVLHjh116NAh51fTpk0VHh7u3P2ycuVKZWdna/DgwS5LnsOGDSs0tw0bNmjXrl0aNmyY5S00Tz5epaRyzMjI8Gg1Ljs7W0899ZQGDBigG264odD+nvrkk090+PBhPfDAA87YAw88oI0bN7osuS9YsEAOh0NjxoyxjOHtj6e5+K+RzMxMHTp0SG3atNEvv/yizMzMSx6bnp7u8WrckCFD1KVLF3Xq1Omy8gXg35ibSm5ueuKJJ3Ts2DHdf//92rBhg/773/9q2LBhzrc1T58+XegY7pTVual///4qV66cevXqpS+//FI7d+7Uiy++qIULF0oq2vks1lurr7/+uurVq6fy5curatWquvbaay0XdJYvX141atRwiW3fvl2ZmZmKiYlxO+6BAwckSb/++qskWZZpo6Oj3S7tXixvKb1BgwaeP6FSzvFSpkyZokOHDnl911Jqaqrq1KmjoKAg7dixQ9KFJefQ0FClpaVp0qRJki6cv9jYWFWuXNmrj+/OunXrNGbMGH311VeWXWWZmZmqVKnSZT/Ge++9py+//FKbN2++7LEA+DfmppKbm7p06aLp06fr2WefVZMmTSRJV199tV544QWNGDGi2LfIKqtzU6NGjTR37lwNGDBAt912mySpWrVqmjp1qp544okinc9iFXItWrRQs2bNLtknKCjI8h8oNzdXMTExBe5IiY6OLk46XuXLHDMzMzVx4kQ9+eSTysrKUlZWlqQLtyExxigjI0OhoaEF/kcuSFZWlpYsWaIzZ864vYZh7ty5euGFF7zyV01BY5w/f96lvXPnTt1xxx267rrrNHnyZNWsWVOBgYFaunSppkyZotzc3MvORZKGDx+u++67T4GBgc6/OvPuUbRnzx5lZ2crNjbWK48FwLeYm0rWoEGD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sMRq1qxZ6FjuNkkcPny4eInBa1iRAwAAsCkKOQAAAJuikAMAALApCjkAAACbchhjjK+TyJOVleX20wVKW6dOnSyxTz75pNDjqlWrZokdPHjQKzl5W/369S2x//znP5bYwoULXdqPPPKIpc/x48e9lpc7mZmZbi+yBYCS5i/zkqdq1Kjh0t6wYYOlT1RUlCXmSSngbtPfoEGDLLEjR44UOtaVwF/mJlbkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmyvwnO8TExFhi9957r0fHPvrooy5tO21sWLlypUfH5t/sUNIbGwAAxff000+7tPN/AtHluP/++y2xO++80xJz98kR06dPd2lnZ2d7La+yjhU5AAAAm6KQAwAAsCkKOQAAAJsq89fIvfbaa5bYgw8+aImtX7/eEps/f36J5ORtt99+uyVWtWpVSywlJcUSS01NLYmUAACXKS4uzhLr169focdt2rTJEvv9998tsQ4dOhQ6lrubJee/Tk+S0tLSXNq//fZboWPDM6zIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNlfnNDsYYSyw3N9cS27dvnyXmDzc0DAkJscRGjhzp0n7yySctfdw97z/96U/eSwwAUKIaN25siUVERLi0165da+nTpk0bSyw4ONgSe+CBB1za+ecWSYqPj7fEqlWrZoktXrzYpd2lSxdLnyNHjlhiKBwrcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgU2V+s4OnunbtaomtWLHCpX3s2DFLn+TkZK/l4O4C1bZt21pit9xyS6FjffDBB95ICQDgI0FBQZZY/o1sU6ZM8WisM2fOWGKzZ892ad93332WPnXr1vVo/FOnTrm0/WGz4JWCFTkAAACbopADAACwKQo5AAAAm6KQAwAAsKkyv9lh2rRplli7du0ssdjYWEusdevWLm2Hw2Hp06NHj8vIzpW78d19QkN+v/zyiyXm7g7dAAD7yP/JC+6426i3aNGiYj1es2bNinWcJH399dcu7RMnThR7LLhiRQ4AAMCmKOQAAABsikIOAADApsr8NXLr16+3xBo1amSJNW7c2BK78847XdrDhw+39Dl48KAl9s477xQhw/8zZ84cS2zjxo2FHvfll19aYjt37ixWDgAA/zBv3jxLLP912c2bN7f0ue666yyxhg0bWmJ33323SzsyMtLSx92N8N31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40xcXJxxOBwmNTW10OMB+D/mppKfmzIyMkyLFi3MxIkTzT//+U/z1FNPmZCQEHPTTTdZdrIyN3lWWl1//fXm+eefN//85z/NqFGjTOXKlU1cXJxzl7WnSr2QM8aYt956yzRt2tSEhISYiIgI07BhQzNixAizb98+Z5/z58+bcePGmerVq5uQkBDTtm1bs3nzZhMXF1fofxZjjPniiy9Mx44dTUREhAkLCzONGjVy+WHn5OSYwYMHm+joaONwOCwn3ps5GuP5f5a5c+ea1q1bm+joaFO+fHlTpUoVc/fdd5v169db+k6fPt1IMsuWLStwvNdee81IMp999lmBfVJSUowks3jxYue5eeWVV8x1111nAgMDTXR0tOnSpYtLDtu2bTOtW7c2ISEhli3tK1asMA0aNDCBgYHm2muvNampqW63eH/00UemUaNGJjg42NSuXdu89NJLZtasWV79z7JixQrTsWNHU61aNVOhQgVz1VVXmU6dOl3yfACwF+amkp+bjhw5Yv74xz+aatWqmcDAQFOnTh3zzDPPWIo4Y5ibPC3kEhMTTc2aNU1gYKCJjY01AwYMML///rtHx17MYYyH93CA3+nVq5cyMjL07bff+joVAAAkMTeVtlLd7ADvMcYoPT1dqampvk4FAABJzE2+wIocAACATZXqrlUAAAB4D4UcAACATVHIAQAA2BSFHAAAgE351a7V3Nxc7du3TxEREV75bDXYmzFGx48fV2xsrOWzEQGgNDAvIT9/m5v8qpDbt2+f88PMgTx79uxRjRo1fJ0GgDKIeQkF8Ze5yfel5EUiIiJ8nQL8EK8LAL7C7x8UxF9eG35VyLFsDXd4XQDwFX7/oCD+8trwq0IOAAAAnqOQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALCp8r5OAN4XGRnp0q5Vq1axx/r1119d2k899ZSlz+bNmy2x//73v5bYxo0bi50HAACwYkUOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKzQ420rVrV0usR48elljbtm1d2ldffXWxHzP/poW4uDhLn6CgII/GKleuXLHzAAAAVqzIAQAA2BSFHAAAgE1RyAEAANgU18j5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\n" + "image/png": "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ueYa59x01113KSAgQOPHj7esink6N0nSmjVrnLG822hdzN3clJ2drZkzZ3r0nDy9/YgkvffeexoyZIj69OmjyZMnezS+O6W6ItemTRslJSXpxRdf1I8//qhOnTqpQoUK2r59u+bPn69p06apZ8+eio6O1tNPP60XX3xR3bp1U0JCgjZs2KBPPvmk0C25AQEBSk5OVvfu3dW4cWP169dP1atX17Zt27RlyxbnxZNNmzaVJA0ZMkSdO3dWuXLllJiYWGI5FnWL9/Lly3X48OFLrh7lbUOfPXt2gXex3rdvn1atWqUhQ4a4/X5QUJA6d+6s+fPn6+9//7vatWunhx56SH//+9+1fft23XnnncrNzdXatWvVrl07DRo0yHn+Vq5cqcmTJys2NlZ16tTRzTffrMTERD3zzDO6++67NWTIEJ06dUrJycmqV6+efvjhB+fjdurUSYGBgerevbuSkpJ04sQJ/eMf/1BMTIz2799f6Pkp6u1HNm/erE2bNunZZ5/1+oWxAOyNuanwuWnq1KmaOXOmbr31VoWGhio1NdXl+3fffbezCE1PT1e7du00ZsyYAj+h4uzZs1qwYIE6duxY4I2Te/TooWnTpunAgQO6+uqrNWrUKE2YMEG333677rnnHgUFBem7775TbGys8xKkpk2bKjk5WRMnTtTVV1+tmJgYtW/fXp06dVKtWrX06KOPavjw4SpXrpxmzZql6Oho7d692/mYLVu2VGRkpPr27ashQ4bI4XBozpw5Hs81nt5+5Ntvv9XDDz+sqKgo3XHHHZa3zFu2bGm5mX2BirLFNW+b7nfffXfJfn379jVhYWEFfv+tt94yTZs2NSEhISYiIsI0bNjQjBgxwuzbt8/Z5/z582bcuHGmevXqJiQkxLRt29Zs3rzZxMXFXXKLd54vvvjCdOzY0URERJiwsDDTqFEjM336dOf3c3JyzODBg010dLRxOByWbcnezNGYom/xTkxMNBUqVDCHDx8usM/06dONJLNs2bIC+7z22mtGkvnss88K7JOSkmIkmcWLFxtjLpybV155xVx33XUmMDDQREdHmy5dupj169c7j9m2bZtp3bq1CQkJsWxpX7FihWnQoIEJDAw01157rUlNTXW79fujjz4yjRo1MsHBwaZ27drmpZdeMrNmzbJs3fbG7UeeffZZI8ls2rTJ42MA2ANzU8nPTXm3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BwUFqXPnzpo/f77+/ve/q127dnrooYf097//Xdu3b9edd96p3NxcrV27Vu3atdOgQYOc52/lypWaPHmyYmNjVadOHd18881KTEzUM888o7vvvltDhgzRqVOnlJycrHr16umHH35wPm6nTp0UGBio7t27KykpSSdOnNA//vEPxcTEaP/+/QWeozye3n7E3fnMW4Hr0qVLoa8nAFc+5ibPbj8yZ84c/frrr85rmtesWaOJEydKkh566CHnamB6erratWunMWPGFPgxXmfPntWCBQvUsWNHBQcHu+3To0cPTZs2TQcOHNDVV1+tUaNGacKECbr99tt1zz33KCgoSN99951iY2P14osvOs9fcnKyJk6cqKuvvloxMTFq3769OnXqpFq1aunRRx/V8OHDVa5cOc2aNUvR0dHavXu38zFbtmypyMhI9e3bV0OGDJHD4dCcOXM83lxXlNuPrFmzxllYHjx4UCdPnnSez9atW3v+qSBF2eKat033u+++u2S/wm6X8dZbb5mmTZuakJAQExERYRo2bGhGjBhh9u3b5+xz/vx5M27cOFO9enUTEhJi2rZtazZv3mzi4uIuucU7zxdffGE6duxoIiIiTFhYmGnUqJGZPn268/s5OTlm8ODBJjo62jgcDsu2ZG/maEzxtnjnKeh8Tp8+3Ugyy5YtK/DY1157zUgyn332WYF9UlJSjCSzePFiY8yFc/PKK6+Y6667zgQGBpro6GjTpUsXs379eucx27ZtM61btzYhISGWLe0rVqwwDRo0MIGBgebaa681qampbrd+f/TRR6ZRo0YmODjY1K5d27z00ktm1qxZlq3bl3v7kfy4/QhwZWFuKp25Ke/3rruvi5/nkiVLjCTzxhtvFDjWggULjCTz9ttvF9gnPT3dSDLTpk1zxmbNmmVuuukmExQUZCIjI02bNm3Mp59+6vz+b7/9Zrp27WoiIiKMJJe5Y/369ebmm282gYGBplatWmby5Mlubz+ybt06c8stt5iQkBATGxtrRowYYZYvX255npd7+5G8ucjdV1Fu7eIwxsMyE36nV69eysjI0LfffuvrVAAAkCSNGDFC8+bN044dOxQUFOTrdK54pfrWKrzHGKP09PQS+cw7AACKa9WqVfrrX/9KEVdKWJEDAACwqVLdtQoAAADvoZADAACwKQo5AAAAm6KQAwAAsCm/2rWam5urffv2KSIiwiuf+wl7M8bo+PHjio2NtXw2IgCUBuYl5Odvc5NfFXL79u1TzZo1fZ0G/MyePXtUo0YNX6cBoAxiXkJB/GVu8n0peZGIiAhfpwA/xOsCgK/w+wcF8ZfXhl8Vcixbwx1eFwB8hd8/KIi/vDb8qpADAACA5yjkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsikIOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsikIOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsikIOAADApijkAAAAbKq8rxO4kjRp0sQS+/DDDy2x2rVrl0I2l9apUydLbOvWrZbYnj17SiMdAMAVonv37pbYRx995NIeNGiQpc8bb7xhiZ0/f957iV2hWJEDAACwKQo5AAAAm6KQAwAAsCmukfOizp07W2JBQUE+yKRw7q5h+NOf/mSJJSYmlkY6AAAbioqKssRmzpxZ6HEzZsywxGbNmmWJnT59uniJlSGsyAEAANgUhRwAAIBNUcgBAADYFIUcAACATbHZ4TKUL+96+hISEnyUSdGtX7/eEvvzn/9siYWFhbm0T548WWI5AQDspXXr1pZYjRo1Cj1u3rx5ltiZM2e8klNZw4ocAACATVHIAQAA2BSFHAAAgE1RyAEAANgUmx0uQ7t27Vzat956q6XPyy+/XFrpFElkZKQldsMNN1hioaGhLm02OwBA2eTuk4pGjRpVrLHmzJljiRljijVWWceKHAAAgE1RyAEAANgUhRwAAIBNUcgBAADYFJsdPNSgQQNLLP+dqXfu3GnpM2nSpBLL6XL88Y9/9HUKAAAbadiwoSXWtGlTj47NyclxaX/yySdeyQmsyAEAANgWhRwAAIBNUcgBAADYFNfIeWj06NGWWFhYmEv7zjvvtPQ5ceJEieXkqcqVK1tibdq0scRyc3NLIx0AgA3de++9xT52xYoVXswEF2NFDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsis0ObvTs2dMSS0hIsMR27Njh0v7+++9LLKfLMWrUKEvM3caG9PR0S+zYsWMlkBEAwG5at27tUb/s7GxLzN08BO9gRQ4AAMCmKOQAAABsikIOAADApijkAAAAbIrNDm7cd999llhoaKglNnPmzNJIp8hq167t0u7Tp4+lz/nz5y2xiRMnWmLnzp3zWl4AAPto2bLlJdsFOXnypCX2448/eiMluMGKHAAAgE1RyAEAANgUhRwAAIBNUcgBAADYVJnf7FCpUiVL7JZbbvHo2OTkZG+n4xWPP/64S7tKlSqWPlu3brXEVq1aVWI5AQDspXnz5sU6zl/nxisVK3IAAAA2RSEHAABgUxRyAAAANlXmr5ELCgqyxP7whz9YYvPmzSuNdLwiPj6+0D6bN28uhUwAAHbVrFmzQvscO3bMEuMaudLFihwAAIBNUcgBAADYFIUcAACATVHIAQAA2FSZ3+xw/PhxS+zHH3+0xBo1amSJVa5c2aV95MgRr+XlqZiYGEusZ8+ehR73xRdflEQ6AAAbatWqlSXWu3fvQo/LzMy0xPbu3euVnOAZVuQAAABsikIOAADApijkAAAAbIpCDgAAwKbK/GaH06dPW2I7d+60xO69915L7N///rdLe/LkyV7Lq0GDBpZY3bp1LbHatWtbYsaYQsfPzc0tVl4AgCtPVFSUJRYQUPhaz6effloS6aAIWJEDAACwKQo5AAAAm6KQAwAAsCkKOQAAAJsq85sd3BkzZowl5nA4LLGuXbu6tOfNm+e1HA4dOmSJudvEUKVKlWKNn5KSUqzjAABXHk8+EejYsWOW2JtvvlkC2aAoWJEDAACwKQo5AAAAm6KQAwAAsCmH8eTusaUkKytLlSpV8nUaHmvcuLFL++qrr/ba2B988IFH/d555x1LrE+fPoUeV768fS6PzMzMVMWKFX2dBoAyyG7zkidq1Khhif3666+WWP4bAm/evNnSp2HDht5LzGb8ZW5iRQ4AAMCmKOQAAABsikIOAADApijkAAAAbMo+V7z7oR9//PGS7dLwyy+/FOu4Bg0aWGLuLmQFAFxZWrZsaYnl39jgzqJFi0ogG1wuVuQAAABsikIOAADApijkAAAAbIpCDgAAwKbY7GBzDofDo1h+bGwAgLIpKirKo36HDh1yaU+bNq0k0sFlYkUOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKzQ42Z4zxKAYAgCR17tzZo367d+92aWdmZpZEOrhMrMgBAADYFIUcAACATVHIAQAA2BTXyNlccHBwoX1Onz5dCpkAAPxNhQoVLLH4+HiPjj1z5oxL+9y5c17JCd7FihwAAIBNUcgBAADYFIUcAACATVHIAQAA2BSbHWyuX79+ltixY8dc2hMmTCilbAAA/iQ3N9cS+/777y2xBg0aWGI7duwokZzgXazIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNsdnB5r777jtLbPLkyS7tVatWlVY6AAA/cv78eUts1KhRlpgxxhJbv359ieQE72JFDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsymHcXeHoI1lZWapUqZKv04CfyczMVMWKFX2dBoAyiHkJBfGXuYkVOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCm/KuSMMb5OAX6I1wUAX+H3DwriL68Nvyrkjh8/7usU4Id4XQDwFX7/oCD+8tpwGH8pKSXl5uZq3759ioiIkMPh8HU68DFjjI4fP67Y2FgFBPjV3xwAygjmJeTnb3OTXxVyAAAA8JzvS0kAAAAUC4UcAACATdmukKtdu7YeeeQRZzs9PV0Oh0Pp6ek+yym//Dni8rRt21Zt27b1dRoAUCDmprLHX+amIhVyKSkpcjgczq/g4GDVq1dPgwYN0u+//15SOZaIpUuXauzYsb5Oo1BpaWlyOBwKDw/3ynhbt251/uyOHTtW7HEmTZqkRYsWeSWn0vTFF184X7+HDh3ydToAvIC5qXTs2LFDPXv2VGRkpEJDQ9WqVSutWrXKK2OXxbnp999/V79+/RQTE6OQkBA1adJE8+fPL/I4xVqRGz9+vObMmaMZM2aoZcuWSk5O1q233qpTp04VZ7jL0rp1a50+fVqtW7cu0nFLly7VuHHjSigr7zhx4oRGjBihsLAwr42ZmpqqatWqSZI++OCDYo9jp/8seXJzczV48GCvnk8A/oO5qeTs2bNHt956q7744gsNHz5cL774ok6cOKFOnTppzZo1lz1+WZubsrKy1KpVKy1YsEBJSUl69dVXFRERoV69emnu3LlFGqtYhVyXLl304IMPqn///kpJSdGwYcO0a9cuLV68uMBjTp48WZyHKlRAQICCg4P9Yguwt02cOFERERG66667vDKeMUZz585V7969lZCQoLS0NK+MaxdvvfWW9uzZo/79+/s6FQAlgLmp5Pztb3/TsWPHtHr1ao0cOVJDhw7Vl19+qerVq+upp566rLHL4tz05ptvaseOHVq0aJEmTJiggQMHatWqVWrevLn+8pe/KDs72+OxvPIKa9++vSRp165dkqRHHnlE4eHh2rlzpxISEhQREaE+ffpIurAqMnXqVNWvX1/BwcGqWrWqkpKSdPToUZcxjTGaOHGiatSoodDQULVr105btmyxPHZB1yF88803SkhIUGRkpMLCwtSoUSNNmzbNmd/rr78uSS7L8Xm8naMk7dy5Uzt37vT0lGr79u2aMmWKJk+erPLly3t83KWsW7dOGRkZSkxMVGJiotasWaO9e/da+uXm5mratGlq2LChgoODFR0drTvvvFPff/+9pAvn7OTJk3rnnXec5y7vuotHHnlEtWvXtow5duxYyz2YZs+erfbt2ysmJkZBQUG64YYblJyc7NFz2b17t7Zt2+bxcz9y5IhGjx6t8ePH66qrrvL4OAD2xdzkvblp7dq1uummm3Tttdc6Y6GhoerRo4d++OEHbd++vdAxClIW56a1a9cqOjra+RqVLhT/vXr10m+//abVq1d79HiS5JUKIe9FEBUV5Yzl5OSoc+fOatWqlV599VWFhoZKkpKSkpSSkqJ+/fppyJAh2rVrl2bMmKENGzZo3bp1qlChgiTp+eef18SJE5WQkKCEhAT98MMP6tSpk0dV6qeffqpu3bqpevXqGjp0qKpVq6atW7fq448/1tChQ5WUlKR9+/bp008/1Zw5cyzHl0SOd9xxhyQpIyPDo3M6bNgwtWvXTgkJCXr//fc9OqYwaWlpio+PV/PmzdWgQQOFhoZq3rx5Gj58uEu/Rx99VCkpKerSpYv69++vnJwcrV27Vl9//bWaNWumOXPmqH///mrRooUef/xxSVJ8fHyR80lOTlb9+vXVo0cPlS9fXkuWLNGTTz6p3NxcDRw48JLHPvzww1q9erXHH5Hy17/+VdWqVVNSUpImTJhQ5FwB2A9zk/fmprNnzyoyMtISzzt/69ev1zXXXFPoOXCnLM5NZ8+eVUhIiCV+8fns2LGjZwmbIpg9e7aRZFauXGkOHjxo9uzZY959910TFRVlQkJCzN69e40xxvTt29dIMs8++6zL8WvXrjWSTFpamkt82bJlLvEDBw6YwMBA07VrV5Obm+vsN3LkSCPJ9O3b1xlbtWqVkWRWrVpljDEmJyfH1KlTx8TFxZmjR4+6PM7FYw0cONC4e/olkaMxxsTFxZm4uDjL47nz8ccfm/Lly5stW7YYYy6cz7CwMI+OLUh2draJiooyo0aNcsZ69+5tbrzxRpd+n3/+uZFkhgwZYhnj4ucZFhZmeY55ubp7nmPGjLGc71OnTln6de7c2dStW9cl1qZNG9OmTRtLzNOX78aNG025cuXM8uXLXXI5ePCgR8cD8G/MTSU/N3Xv3t1cddVVJisryyV+6623Gknm1VdfLXQMd8rq3DR48GATEBBgMjIyXOKJiYlGkhk0aFChY+Qp1lurHTp0UHR0tGrWrKnExESFh4dr4cKF+sMf/uDS74knnnBpz58/X5UqVVLHjh116NAh51fTpk0VHh7u3P2ycuVKZWdna/DgwS5LnsOGDSs0tw0bNmjXrl0aNmyY5S00Tz5epaRyzMjI8Gg1Ljs7W0899ZQGDBigG264odD+nvrkk090+PBhPfDAA87YAw88oI0bN7osuS9YsEAOh0NjxoyxjOHtj6e5+K+RzMxMHTp0SG3atNEvv/yizMzMSx6bnp7u8WrckCFD1KVLF3Xq1Omy8gXg35ibSm5ueuKJJ3Ts2DHdf//92rBhg/773/9q2LBhzrc1T58+XegY7pTVual///4qV66cevXqpS+//FI7d+7Uiy++qIULF0oq2vks1lurr7/+uurVq6fy5curatWquvbaay0XdJYvX141atRwiW3fvl2ZmZmKiYlxO+6BAwckSb/++qskWZZpo6Oj3S7tXixvKb1BgwaeP6FSzvFSpkyZokOHDnl911Jqaqrq1KmjoKAg7dixQ9KFJefQ0FClpaVp0qRJki6cv9jYWFWuXNmrj+/OunXrNGbMGH311VeWXWWZmZmqVKnSZT/Ge++9py+//FKbN2++7LEA+DfmppKbm7p06aLp06fr2WefVZMmTSRJV199tV544QWNGDGi2LfIKqtzU6NGjTR37lwNGDBAt912mySpWrVqmjp1qp544okinc9iFXItWrRQs2bNLtknKCjI8h8oNzdXMTExBe5IiY6OLk46XuXLHDMzMzVx4kQ9+eSTysrKUlZWlqQLtyExxigjI0OhoaEF/kcuSFZWlpYsWaIzZ864vYZh7ty5euGFF7zyV01BY5w/f96lvXPnTt1xxx267rrrNHnyZNWsWVOBgYFaunSppkyZotzc3MvORZKGDx+u++67T4GBgc6/OvPuUbRnzx5lZ2crNjbWK48FwLeYm0rWoEGD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sMRq1qxZ6FjuNkkcPny4eInBa1iRAwAAsCkKOQAAAJuikAMAALApCjkAAACbchhjjK+TyJOVleX20wVKW6dOnSyxTz75pNDjqlWrZokdPHjQKzl5W/369S2x//znP5bYwoULXdqPPPKIpc/x48e9lpc7mZmZbi+yBYCS5i/zkqdq1Kjh0t6wYYOlT1RUlCXmSSngbtPfoEGDLLEjR44UOtaVwF/mJlbkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmyvwnO8TExFhi9957r0fHPvrooy5tO21sWLlypUfH5t/sUNIbGwAAxff000+7tPN/AtHluP/++y2xO++80xJz98kR06dPd2lnZ2d7La+yjhU5AAAAm6KQAwAAsCkKOQAAAJsq89fIvfbaa5bYgw8+aImtX7/eEps/f36J5ORtt99+uyVWtWpVSywlJcUSS01NLYmUAACXKS4uzhLr169focdt2rTJEvv9998tsQ4dOhQ6lrubJee/Tk+S0tLSXNq//fZboWPDM6zIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNlfnNDsYYSyw3N9cS27dvnyXmDzc0DAkJscRGjhzp0n7yySctfdw97z/96U/eSwwAUKIaN25siUVERLi0165da+nTpk0bSyw4ONgSe+CBB1za+ecWSYqPj7fEqlWrZoktXrzYpd2lSxdLnyNHjlhiKBwrcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgU2V+s4OnunbtaomtWLHCpX3s2DFLn+TkZK/l4O4C1bZt21pit9xyS6FjffDBB95ICQDgI0FBQZZY/o1sU6ZM8WisM2fOWGKzZ892ad93332WPnXr1vVo/FOnTrm0/WGz4JWCFTkAAACbopADAACwKQo5AAAAm6KQAwAAsKkyv9lh2rRplli7du0ssdjYWEusdevWLm2Hw2Hp06NHj8vIzpW78d19QkN+v/zyiyXm7g7dAAD7yP/JC+6426i3aNGiYj1es2bNinWcJH399dcu7RMnThR7LLhiRQ4AAMCmKOQAAABsikIOAADApsr8NXLr16+3xBo1amSJNW7c2BK78847XdrDhw+39Dl48KAl9s477xQhw/8zZ84cS2zjxo2FHvfll19aYjt37ixWDgAA/zBv3jxLLP912c2bN7f0ue666yyxhg0bWmJ33323SzsyMtLSx92N8N31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40xcXJxxOBwmNTW10OMB+D/mppKfmzIyMkyLFi3MxIkTzT//+U/z1FNPmZCQEHPTTTdZdrIyN3lWWl1//fXm+eefN//85z/NqFGjTOXKlU1cXJxzl7WnSr2QM8aYt956yzRt2tSEhISYiIgI07BhQzNixAizb98+Z5/z58+bcePGmerVq5uQkBDTtm1bs3nzZhMXF1fofxZjjPniiy9Mx44dTUREhAkLCzONGjVy+WHn5OSYwYMHm+joaONwOCwn3ps5GuP5f5a5c+ea1q1bm+joaFO+fHlTpUoVc/fdd5v169db+k6fPt1IMsuWLStwvNdee81IMp999lmBfVJSUowks3jxYue5eeWVV8x1111nAgMDTXR0tOnSpYtLDtu2bTOtW7c2ISEhli3tK1asMA0aNDCBgYHm2muvNampqW63eH/00UemUaNGJjg42NSuXdu89NJLZtasWV79z7JixQrTsWNHU61aNVOhQgVz1VVXmU6dOl3yfACwF+amkp+bjhw5Yv74xz+aatWqmcDAQFOnTh3zzDPPWIo4Y5ibPC3kEhMTTc2aNU1gYKCJjY01AwYMML///rtHx17MYYyH93CA3+nVq5cyMjL07bff+joVAAAkMTeVtlLd7ADvMcYoPT1dqampvk4FAABJzE2+wIocAACATZXqrlUAAAB4D4UcAACATVHIAQAA2BSFHAAAgE351a7V3Nxc7du3TxEREV75bDXYmzFGx48fV2xsrOWzEQGgNDAvIT9/m5v8qpDbt2+f88PMgTx79uxRjRo1fJ0GgDKIeQkF8Ze5yfel5EUiIiJ8nQL8EK8LAL7C7x8UxF9eG35VyLFsDXd4XQDwFX7/oCD+8trwq0IOAAAAnqOQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuikAMAALCp8r5OAN4XGRnp0q5Vq1axx/r1119d2k899ZSlz+bNmy2x//73v5bYxo0bi50HAACwYkUOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKzQ420rVrV0usR48elljbtm1d2ldffXWxHzP/poW4uDhLn6CgII/GKleuXLHzAAAAVqzIAQAA2BSFHAAAgE1RyAEAANgU18j5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", + "text/plain": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" diff --git a/neuralnetlib/__init__.py b/neuralnetlib/__init__.py index e63c55f..45a34f2 100644 --- a/neuralnetlib/__init__.py +++ b/neuralnetlib/__init__.py @@ -4,3 +4,4 @@ from . import model from . import optimizers from . import utils +from . import preprocessing \ No newline at end of file diff --git a/neuralnetlib/layers.py b/neuralnetlib/layers.py index cd1ffbc..4bf5d1e 100644 --- a/neuralnetlib/layers.py +++ b/neuralnetlib/layers.py @@ -3,7 +3,7 @@ import numpy as np from neuralnetlib.activations import ActivationFunction -from neuralnetlib.utils import im2col, col2im +from neuralnetlib.preprocessing import im2col, col2im class Layer: diff --git a/neuralnetlib/metrics.py b/neuralnetlib/metrics.py index 7c8c6c6..86969c3 100644 --- a/neuralnetlib/metrics.py +++ b/neuralnetlib/metrics.py @@ -1,6 +1,6 @@ import numpy as np -from neuralnetlib.utils import apply_threshold +from neuralnetlib.preprocessing import apply_threshold def accuracy_score(y_pred: np.ndarray, y_true: np.ndarray, threshold: float = 0.5) -> float: diff --git a/neuralnetlib/model.py b/neuralnetlib/model.py index 7f63137..b899557 100644 --- a/neuralnetlib/model.py +++ b/neuralnetlib/model.py @@ -5,9 +5,9 @@ from neuralnetlib.layers import Layer, Input, Activation, Dense, Flatten, Conv2D, Dropout from neuralnetlib.losses import LossFunction, CategoricalCrossentropy -from neuralnetlib.metrics import accuracy_score from neuralnetlib.optimizers import Optimizer from neuralnetlib.utils import shuffle, progress_bar +from neuralnetlib.metrics import accuracy_score class Model: diff --git a/neuralnetlib/preprocessing.py b/neuralnetlib/preprocessing.py new file mode 100644 index 0000000..42827ad --- /dev/null +++ b/neuralnetlib/preprocessing.py @@ -0,0 +1,168 @@ +import numpy as np + + +def one_hot_encode(labels: np.ndarray, num_classes: int) -> np.ndarray: + """One hot encoded labels are binary vectors representing categorical values, + with exactly one high (or "hot" = 1) bit indicating the presence of a specific category + and all other bits low (or "cold" = 0).""" + if labels.ndim > 1: + labels = labels.reshape(-1) + + labels = labels.astype(int) + one_hot = np.zeros((labels.size, num_classes)) + one_hot[np.arange(labels.size), labels] = 1 + return one_hot + + +def apply_threshold(y_pred, threshold: float = 0.5): + """Applies a threshold to the predictions. Typically used for binary classification.""" + return (y_pred > threshold).astype(int) + + +def im2col(input_data, filter_h, filter_w, stride=1, pad=0): + """ + Transform 4 dimensional images to 2 dimensional array. + + Args: + input_data (np.ndarray): 4 dimensional input images (The number of images, The number of channels, Height, Width) + filter_h (int): height of filter + filter_w (int): width of filter + stride (int or tuple): the interval of stride + pad (int or tuple): the interval of padding + + Returns: + col (np.ndarray): 2 dimensional array + + """ + N, C, H, W = input_data.shape + + if isinstance(pad, int): + pad_h, pad_w = pad, pad + else: + pad_h, pad_w = pad + + if isinstance(stride, int): + stride_h, stride_w = stride, stride + else: + stride_h, stride_w = stride + + # Make sure that the convolution can be executed + assert ( + H + 2 * pad_h - filter_h) % stride_h == 0, f'invalid parameters, (H + 2 * pad_h - filter_h) % stride_h != 0, got H={H}, pad_h={pad_h}, filter_h={filter_h}, stride_h={stride_h}' + assert ( + W + 2 * pad_w - filter_w) % stride_w == 0, f'invalid parameters, (W + 2 * pad_w - filter_w) % stride_w != 0, got W={W}, pad_w={pad_w}, filter_w={filter_w}, stride_w={stride_w}' + + out_h = (H + 2 * pad_h - filter_h) // stride_h + 1 + out_w = (W + 2 * pad_w - filter_w) // stride_w + 1 + + padded_input = np.pad(input_data, ((0, 0), (0, 0), (pad_h, pad_h), (pad_w, pad_w)), mode='constant') + + col = np.zeros((N, C, filter_h, filter_w, out_h, out_w)) + + for y in range(filter_h): + y_max = y + stride_h * out_h + for x in range(filter_w): + x_max = x + stride_w * out_w + col[:, :, y, x, :, :] = padded_input[:, :, y:y_max:stride_h, x:x_max:stride_w] + + col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N * out_h * out_w, -1) + return col + + +def col2im(col, input_shape, filter_h, filter_w, stride=1, pad=0): + """ + Inverse of im2col. + + Args: + col (np.ndarray): 2 dimensional array + input_shape (tuple): the shape of original input images + filter_h (int): height of filter + filter_w (int): width of filter + stride (int or tuple): the interval of stride + pad (int or tuple): the interval of padding + + Returns: + image (np.ndarray): original images + + """ + N, C, H, W = input_shape + + if isinstance(pad, int): + pad_h, pad_w = pad, pad + else: + pad_h, pad_w = pad + + if isinstance(stride, int): + stride_h, stride_w = stride, stride + else: + stride_h, stride_w = stride + + # Make sure that the convolution can be executed + assert ( + H + 2 * pad_h - filter_h) % stride_h == 0, f'invalid parameters, (H + 2 * pad_h - filter_h) % stride_h != 0, got H={H}, pad_h={pad_h}, filter_h={filter_h}, stride_h={stride_h}' + assert ( + W + 2 * pad_w - filter_w) % stride_w == 0, f'invalid parameters, (W + 2 * pad_w - filter_w) % stride_w != 0, got W={W}, pad_w={pad_w}, filter_w={filter_w}, stride_w={stride_w}' + + out_h = (H + 2 * pad_h - filter_h) // stride_h + 1 + out_w = (W + 2 * pad_w - filter_w) // stride_w + 1 + + col = col.reshape(N, out_h, out_w, C, filter_h, filter_w).transpose(0, 3, 4, 5, 1, 2) + + image = np.zeros((N, C, H + 2 * pad_h + stride_h - 1, W + 2 * pad_w + stride_w - 1)) + + for y in range(filter_h): + y_max = y + stride_h * out_h + for x in range(filter_w): + x_max = x + stride_w * out_w + image[:, :, y:y_max:stride_h, x:x_max:stride_w] += col[:, :, y, x, :, :] + + return image[:, :, pad_h:H + pad_h, pad_w:W + pad_w] + + +class StandardScaler: + def __init__(self): + self.mean_ = None + self.scale_ = None + + def fit(self, X): + self.mean_ = np.mean(X, axis=0) + self.scale_ = np.std(X, axis=0) + + def transform(self, X): + if self.mean_ is None or self.scale_ is None: + raise ValueError("StandardScaler has not been fitted yet.") + return (X - self.mean_) / self.scale_ + + def fit_transform(self, X): + self.fit(X) + return self.transform(X) + + def inverse_transform(self, X): + if self.mean_ is None or self.scale_ is None: + raise ValueError("StandardScaler has not been fitted yet.") + return X * self.scale_ + self.mean_ + + +class MinMaxScaler: + def __init__(self, feature_range=(0, 1)): + self.feature_range = feature_range + self.min_ = None + self.scale_ = None + + def fit(self, X): + self.min_ = np.min(X, axis=0) + self.scale_ = np.max(X, axis=0) - self.min_ + + def transform(self, X): + if self.min_ is None or self.scale_ is None: + raise ValueError("MinMaxScaler has not been fitted yet.") + return (X - self.min_) / self.scale_ * (self.feature_range[1] - self.feature_range[0]) + self.feature_range[0] + + def fit_transform(self, X): + self.fit(X) + return self.transform(X) + + def inverse_transform(self, X): + if self.min_ is None or self.scale_ is None: + raise ValueError("MinMaxScaler has not been fitted yet.") + return (X - self.feature_range[0]) / (self.feature_range[1] - self.feature_range[0]) * self.scale_ + self.min_ \ No newline at end of file diff --git a/neuralnetlib/utils.py b/neuralnetlib/utils.py index c7281c5..fb9b1a4 100644 --- a/neuralnetlib/utils.py +++ b/neuralnetlib/utils.py @@ -4,19 +4,6 @@ import numpy as np -def one_hot_encode(labels: np.ndarray, num_classes: int) -> np.ndarray: - """One hot encoded labels are binary vectors representing categorical values, - with exactly one high (or "hot" = 1) bit indicating the presence of a specific category - and all other bits low (or "cold" = 0).""" - if labels.ndim > 1: - labels = labels.reshape(-1) - - labels = labels.astype(int) - one_hot = np.zeros((labels.size, num_classes)) - one_hot[np.arange(labels.size), labels] = 1 - return one_hot - - def dict_with_ndarray_to_dict_with_list(d: dict) -> dict: """Converts all numpy arrays in a dictionary to lists. This is useful for serializing the dictionary to JSON.""" for k, v in d.items(): @@ -33,11 +20,6 @@ def dict_with_list_to_dict_with_ndarray(d: dict) -> dict: return d -def apply_threshold(y_pred, threshold: float = 0.5): - """Applies a threshold to the predictions. Typically used for binary classification.""" - return (y_pred > threshold).astype(int) - - def shuffle(x, y, random_state: int = None) -> tuple: """Shuffles the data along the first axis.""" rng = np.random.default_rng(random_state if random_state is not None else int(time.time_ns())) @@ -45,106 +27,6 @@ def shuffle(x, y, random_state: int = None) -> tuple: return x[indices], y[indices] -def im2col(input_data, filter_h, filter_w, stride=1, pad=0): - """ - Transform 4 dimensional images to 2 dimensional array. - - Args: - input_data (np.ndarray): 4 dimensional input images (The number of images, The number of channels, Height, Width) - filter_h (int): height of filter - filter_w (int): width of filter - stride (int or tuple): the interval of stride - pad (int or tuple): the interval of padding - - Returns: - col (np.ndarray): 2 dimensional array - - """ - N, C, H, W = input_data.shape - - if isinstance(pad, int): - pad_h, pad_w = pad, pad - else: - pad_h, pad_w = pad - - if isinstance(stride, int): - stride_h, stride_w = stride, stride - else: - stride_h, stride_w = stride - - # Make sure that the convolution can be executed - assert ( - H + 2 * pad_h - filter_h) % stride_h == 0, f'invalid parameters, (H + 2 * pad_h - filter_h) % stride_h != 0, got H={H}, pad_h={pad_h}, filter_h={filter_h}, stride_h={stride_h}' - assert ( - W + 2 * pad_w - filter_w) % stride_w == 0, f'invalid parameters, (W + 2 * pad_w - filter_w) % stride_w != 0, got W={W}, pad_w={pad_w}, filter_w={filter_w}, stride_w={stride_w}' - - out_h = (H + 2 * pad_h - filter_h) // stride_h + 1 - out_w = (W + 2 * pad_w - filter_w) // stride_w + 1 - - padded_input = np.pad(input_data, ((0, 0), (0, 0), (pad_h, pad_h), (pad_w, pad_w)), mode='constant') - - col = np.zeros((N, C, filter_h, filter_w, out_h, out_w)) - - for y in range(filter_h): - y_max = y + stride_h * out_h - for x in range(filter_w): - x_max = x + stride_w * out_w - col[:, :, y, x, :, :] = padded_input[:, :, y:y_max:stride_h, x:x_max:stride_w] - - col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N * out_h * out_w, -1) - return col - - -def col2im(col, input_shape, filter_h, filter_w, stride=1, pad=0): - """ - Inverse of im2col. - - Args: - col (np.ndarray): 2 dimensional array - input_shape (tuple): the shape of original input images - filter_h (int): height of filter - filter_w (int): width of filter - stride (int or tuple): the interval of stride - pad (int or tuple): the interval of padding - - Returns: - image (np.ndarray): original images - - """ - N, C, H, W = input_shape - - if isinstance(pad, int): - pad_h, pad_w = pad, pad - else: - pad_h, pad_w = pad - - if isinstance(stride, int): - stride_h, stride_w = stride, stride - else: - stride_h, stride_w = stride - - # Make sure that the convolution can be executed - assert ( - H + 2 * pad_h - filter_h) % stride_h == 0, f'invalid parameters, (H + 2 * pad_h - filter_h) % stride_h != 0, got H={H}, pad_h={pad_h}, filter_h={filter_h}, stride_h={stride_h}' - assert ( - W + 2 * pad_w - filter_w) % stride_w == 0, f'invalid parameters, (W + 2 * pad_w - filter_w) % stride_w != 0, got W={W}, pad_w={pad_w}, filter_w={filter_w}, stride_w={stride_w}' - - out_h = (H + 2 * pad_h - filter_h) // stride_h + 1 - out_w = (W + 2 * pad_w - filter_w) // stride_w + 1 - - col = col.reshape(N, out_h, out_w, C, filter_h, filter_w).transpose(0, 3, 4, 5, 1, 2) - - image = np.zeros((N, C, H + 2 * pad_h + stride_h - 1, W + 2 * pad_w + stride_w - 1)) - - for y in range(filter_h): - y_max = y + stride_h * out_h - for x in range(filter_w): - x_max = x + stride_w * out_w - image[:, :, y:y_max:stride_h, x:x_max:stride_w] += col[:, :, y, x, :, :] - - return image[:, :, pad_h:H + pad_h, pad_w:W + pad_w] - - def progress_bar(current: int, total: int, width: int = 30, message: str = "") -> None: """ Prints a progress bar to the console. From 4a02b2275a4018380f6c0a788572b41999e826c5 Mon Sep 17 00:00:00 2001 From: GitHub Action <52708150+marcpinet@users.noreply.github.com> Date: Sun, 21 Apr 2024 15:23:52 +0200 Subject: [PATCH 3/3] ci: bump version to 2.2.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5e75799..b169e59 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='neuralnetlib', - version='2.1.0', + version='2.2.0', author='Marc Pinet', description='A simple convolutional neural network library with only numpy as dependency', long_description=open('README.md', encoding="utf-8").read(),