From 3c1dd201cf65b016aaff68f2863ec45497c1151a Mon Sep 17 00:00:00 2001 From: GitHub Action <52708150+marcpinet@users.noreply.github.com> Date: Wed, 24 Apr 2024 02:37:20 +0200 Subject: [PATCH] feat: i don't even remember what i've added --- .gitignore | 3 - .../mnist_loading_saved_model.ipynb | 52 +++---- .../simple_cancer_binary.ipynb | 139 +++++------------- .../simple_diabete_regression.ipynb | 102 ++++++++----- .../simple_mnist_multiclass.ipynb | 90 +++++------- .../simple_cnn_classification_mnist.ipynb | 66 ++++----- .../tic_tac_toe_alternative_dataset_shape.py | 2 +- neuralnetlib/layers.py | 7 + neuralnetlib/model.py | 66 +++++++-- tests/test_model.py | 4 +- 10 files changed, 266 insertions(+), 265 deletions(-) diff --git a/.gitignore b/.gitignore index 3ba8170..f07a984 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ -# Dist generator -dist_gen.bat - # Datasets formats *.csv *.npz diff --git a/examples/classification-regression/mnist_loading_saved_model.ipynb b/examples/classification-regression/mnist_loading_saved_model.ipynb index d12febb..ce2c3d5 100644 --- a/examples/classification-regression/mnist_loading_saved_model.ipynb +++ b/examples/classification-regression/mnist_loading_saved_model.ipynb @@ -21,8 +21,8 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:52:21.706906Z", - "start_time": "2024-04-21T12:52:18.726598200Z" + "end_time": "2024-04-23T23:32:44.879695500Z", + "start_time": "2024-04-23T23:32:41.806868Z" } }, "outputs": [], @@ -47,8 +47,8 @@ "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:52:21.915810200Z", - "start_time": "2024-04-21T12:52:21.706906Z" + "end_time": "2024-04-23T23:32:45.056739600Z", + "start_time": "2024-04-23T23:32:44.879695500Z" } }, "outputs": [], @@ -68,8 +68,8 @@ "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:52:22.072282500Z", - "start_time": "2024-04-21T12:52:21.916810900Z" + "end_time": "2024-04-23T23:32:45.166846Z", + "start_time": "2024-04-23T23:32:45.059739600Z" } }, "outputs": [], @@ -92,8 +92,8 @@ "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:52:22.233389700Z", - "start_time": "2024-04-21T12:52:22.073284800Z" + "end_time": "2024-04-23T23:32:45.285935300Z", + "start_time": "2024-04-23T23:32:45.167845600Z" } }, "outputs": [], @@ -113,8 +113,8 @@ "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:52:22.258467800Z", - "start_time": "2024-04-21T12:52:22.234388100Z" + "end_time": "2024-04-23T23:32:45.329886Z", + "start_time": "2024-04-23T23:32:45.288843800Z" } }, "outputs": [], @@ -134,8 +134,8 @@ "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:52:22.323518700Z", - "start_time": "2024-04-21T12:52:22.257467100Z" + "end_time": "2024-04-23T23:32:45.374527900Z", + "start_time": "2024-04-23T23:32:45.314964200Z" } }, "outputs": [ @@ -143,7 +143,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Validation Accuracy: 0.899\n" + "Validation Accuracy: 0.9738333333333333\n" ] } ], @@ -165,8 +165,8 @@ "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T12:52:22.393768500Z", - "start_time": "2024-04-21T12:52:22.318518600Z" + "end_time": "2024-04-23T23:32:45.444303500Z", + "start_time": "2024-04-23T23:32:45.375529400Z" } }, "outputs": [ @@ -174,18 +174,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "Test Accuracy: 0.8863\n", + "Test Accuracy: 0.9549\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" + "[[ 958 0 3 0 0 3 7 2 4 3]\n", + " [ 0 1117 1 6 0 1 1 2 6 1]\n", + " [ 5 1 983 11 3 0 4 16 9 0]\n", + " [ 2 0 10 959 0 13 1 7 8 10]\n", + " [ 2 1 6 0 909 0 6 0 0 58]\n", + " [ 9 1 0 20 0 838 8 2 3 11]\n", + " [ 10 4 4 1 5 6 917 0 10 1]\n", + " [ 1 8 10 6 0 0 0 982 0 21]\n", + " [ 5 3 9 7 4 6 5 7 917 11]\n", + " [ 3 5 3 5 10 4 2 7 1 969]]\n" ] } ], diff --git a/examples/classification-regression/simple_cancer_binary.ipynb b/examples/classification-regression/simple_cancer_binary.ipynb index 0509f99..23f6d6f 100644 --- a/examples/classification-regression/simple_cancer_binary.ipynb +++ b/examples/classification-regression/simple_cancer_binary.ipynb @@ -21,8 +21,8 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:53.026361300Z", - "start_time": "2024-04-21T13:22:52.339942200Z" + "end_time": "2024-04-23T22:56:24.052135200Z", + "start_time": "2024-04-23T22:56:22.927958200Z" } }, "outputs": [], @@ -51,8 +51,8 @@ "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:53.040903100Z", - "start_time": "2024-04-21T13:22:53.026361300Z" + "end_time": "2024-04-23T22:56:24.066137600Z", + "start_time": "2024-04-23T22:56:24.046136900Z" } }, "outputs": [], @@ -73,8 +73,8 @@ "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:53.054442700Z", - "start_time": "2024-04-21T13:22:53.042408400Z" + "end_time": "2024-04-23T22:56:24.079136500Z", + "start_time": "2024-04-23T22:56:24.063137500Z" } }, "outputs": [], @@ -99,11 +99,24 @@ "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:53.059957800Z", - "start_time": "2024-04-21T13:22:53.048922300Z" + "end_time": "2024-04-23T22:56:24.340700300Z", + "start_time": "2024-04-23T22:56:24.073137200Z" } }, - "outputs": [], + "outputs": [ + { + "ename": "ValueError", + "evalue": "The first layer must be an Input layer.", + "output_type": "error", + "traceback": [ + "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[1;31mValueError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[1;32mIn[4], line 8\u001B[0m\n\u001B[0;32m 6\u001B[0m model \u001B[38;5;241m=\u001B[39m Model()\n\u001B[0;32m 7\u001B[0m model\u001B[38;5;241m.\u001B[39madd(Input(input_neurons))\n\u001B[1;32m----> 8\u001B[0m \u001B[43mmodel\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43madd\u001B[49m\u001B[43m(\u001B[49m\u001B[43mDense\u001B[49m\u001B[43m(\u001B[49m\u001B[43mhidden_neurons\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mweights_init\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mhe\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mrandom_state\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;241;43m42\u001B[39;49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 9\u001B[0m model\u001B[38;5;241m.\u001B[39madd(Activation(ReLU()))\n\u001B[0;32m 11\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m _ \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mrange\u001B[39m(num_hidden_layers \u001B[38;5;241m-\u001B[39m \u001B[38;5;241m1\u001B[39m):\n", + "File \u001B[1;32m~\\Documents\\Programming\\Python\\Handmade NeuralNetwork\\neuralnetlib\\model.py:38\u001B[0m, in \u001B[0;36mModel.add\u001B[1;34m(self, layer)\u001B[0m\n\u001B[0;32m 36\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mlayers:\n\u001B[0;32m 37\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(layer, Input):\n\u001B[1;32m---> 38\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mThe first layer must be an Input layer.\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m 39\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m 40\u001B[0m previous_layer \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mlayers[\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m]\n", + "\u001B[1;31mValueError\u001B[0m: The first layer must be an Input layer." + ] + } + ], "source": [ "input_neurons = x_train.shape[1:][0] # Cancer dataset has 30 features\n", "num_hidden_layers = 5 # Number of hidden layers\n", @@ -132,40 +145,14 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:53.085516700Z", - "start_time": "2024-04-21T13:22:53.058950900Z" + "end_time": "2024-04-23T22:56:24.356216400Z", + "start_time": "2024-04-23T22:56:24.343207100Z" } }, - "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" - ] - } - ], + "outputs": [], "source": [ "model.compile(loss_function=BinaryCrossentropy(), optimizer=Adam(learning_rate=0.0001))\n", "\n", @@ -181,43 +168,15 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:53.842873Z", - "start_time": "2024-04-21T13:22:53.081003300Z" + "start_time": "2024-04-23T22:56:24.345216800Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[==============================] 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.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.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.03s\n" - ] - } - ], + "outputs": [], "source": [ - "model.train(x_train, y_train, epochs=20, batch_size=48, metrics=[accuracy_score], random_state=42)" + "model.fit(x_train, y_train, epochs=20, batch_size=48, metrics=[accuracy_score], random_state=42)" ] }, { @@ -229,22 +188,13 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:53.857412200Z", - "start_time": "2024-04-21T13:22:53.843829400Z" + "start_time": "2024-04-23T22:56:24.347215800Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test loss: 0.06351246680217817\n" - ] - } - ], + "outputs": [], "source": [ "loss = model.evaluate(x_test, y_test)\n", "print(f'Test loss: {loss}')" @@ -259,11 +209,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:53.863439400Z", - "start_time": "2024-04-21T13:22:53.852402800Z" + "start_time": "2024-04-23T22:56:24.348216100Z" } }, "outputs": [], @@ -280,25 +229,13 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:53.873465Z", - "start_time": "2024-04-21T13:22:53.859930800Z" + "start_time": "2024-04-23T22:56:24.350216700Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy: 0.9736842105263158\n", - "Precision: 0.9741062479117941\n", - "Recall: 0.9692460317460317\n", - "F1 Score: 0.9716700622635057\n" - ] - } - ], + "outputs": [], "source": [ "accuracy = accuracy_score(y_pred, y_test)\n", "precision = precision_score(y_pred, y_test)\n", diff --git a/examples/classification-regression/simple_diabete_regression.ipynb b/examples/classification-regression/simple_diabete_regression.ipynb index ae6e71d..64ea18e 100644 --- a/examples/classification-regression/simple_diabete_regression.ipynb +++ b/examples/classification-regression/simple_diabete_regression.ipynb @@ -18,16 +18,17 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { + "is_executing": true, "ExecuteTime": { - "end_time": "2024-04-21T13:22:31.884628500Z", - "start_time": "2024-04-21T13:22:30.866451700Z" + "start_time": "2024-04-24T00:35:13.345636700Z" } }, "outputs": [], "source": [ "from sklearn.datasets import load_diabetes\n", + "import numpy as np\n", "\n", "from neuralnetlib.preprocessing import MinMaxScaler, StandardScaler\n", "from neuralnetlib.activations import Linear, LeakyReLU\n", @@ -47,12 +48,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { - "ExecuteTime": { - "end_time": "2024-04-21T13:22:31.904684200Z", - "start_time": "2024-04-21T13:22:31.886631400Z" - } + "is_executing": true }, "outputs": [], "source": [ @@ -69,11 +67,11 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 12, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:31.915316200Z", - "start_time": "2024-04-21T13:22:31.905686700Z" + "end_time": "2024-04-24T00:35:13.897190200Z", + "start_time": "2024-04-24T00:35:13.895189700Z" } }, "outputs": [], @@ -95,11 +93,11 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 13, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:31.922833400Z", - "start_time": "2024-04-21T13:22:31.914315800Z" + "end_time": "2024-04-24T00:35:13.910701900Z", + "start_time": "2024-04-24T00:35:13.901704800Z" } }, "outputs": [], @@ -131,11 +129,11 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 14, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:31.965385600Z", - "start_time": "2024-04-21T13:22:31.924269100Z" + "end_time": "2024-04-24T00:35:13.950703300Z", + "start_time": "2024-04-24T00:35:13.911705Z" } }, "outputs": [ @@ -174,11 +172,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 15, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:32.074543200Z", - "start_time": "2024-04-21T13:22:31.939804400Z" + "end_time": "2024-04-24T00:35:14.078227700Z", + "start_time": "2024-04-24T00:35:13.921705400Z" } }, "outputs": [ @@ -186,7 +184,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[==============================] 100% Epoch 1/10 - loss: 1.2716 - - 0.02s\n", + "[==============================] 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", @@ -197,10 +195,18 @@ "[==============================] 100% Epoch 9/10 - loss: 1.2531 - - 0.01s\n", "[==============================] 100% Epoch 10/10 - loss: 1.2501 - - 0.01s\n" ] + }, + { + "data": { + "text/plain": "" + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "model.train(x_train, y_train, epochs=10, batch_size=32, random_state=42)" + "model.fit(x_train, y_train, epochs=10, batch_size=32, random_state=42)" ] }, { @@ -212,11 +218,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 16, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:32.083579600Z", - "start_time": "2024-04-21T13:22:32.071027500Z" + "end_time": "2024-04-24T00:35:14.078227700Z", + "start_time": "2024-04-24T00:35:14.042229900Z" } }, "outputs": [ @@ -242,11 +248,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 17, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:32.095622600Z", - "start_time": "2024-04-21T13:22:32.083579600Z" + "end_time": "2024-04-24T00:35:14.148266800Z", + "start_time": "2024-04-24T00:35:14.047231200Z" } }, "outputs": [ @@ -267,23 +273,49 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 8. Printing some metrics" + "## 8. Getting original MAE (without normalization from StandardScaler)" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 18, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:22:32.136547300Z", - "start_time": "2024-04-21T13:22:32.095622600Z" + "end_time": "2024-04-24T00:35:14.153268100Z", + "start_time": "2024-04-24T00:35:14.059228300Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAE (original): 66.43730326965814\n" + ] + } + ], "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." + "y_pred_scaled = model.predict(x_test)\n", + "\n", + "y_pred = scaler_y.inverse_transform(y_pred_scaled.reshape(-1, 1)).flatten()\n", + "y_test_original = scaler_y.inverse_transform(y_test.reshape(-1, 1)).flatten()\n", + "\n", + "mae_original = np.mean(np.abs(y_test_original - y_pred))\n", + "print(f'MAE (original): {mae_original}')" ] + }, + { + "cell_type": "code", + "execution_count": 18, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-24T00:35:14.153268100Z", + "start_time": "2024-04-24T00:35:14.069231300Z" + } + } } ], "metadata": { diff --git a/examples/classification-regression/simple_mnist_multiclass.ipynb b/examples/classification-regression/simple_mnist_multiclass.ipynb index a39c2cd..8cfb668 100644 --- a/examples/classification-regression/simple_mnist_multiclass.ipynb +++ b/examples/classification-regression/simple_mnist_multiclass.ipynb @@ -21,8 +21,8 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:09:57.920117100Z", - "start_time": "2024-04-21T13:09:53.090418500Z" + "end_time": "2024-04-23T23:29:14.420006500Z", + "start_time": "2024-04-23T23:29:10.910211Z" } }, "outputs": [], @@ -52,8 +52,8 @@ "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:09:58.104511Z", - "start_time": "2024-04-21T13:09:57.923629Z" + "end_time": "2024-04-23T23:29:14.609051100Z", + "start_time": "2024-04-23T23:29:14.415004400Z" } }, "outputs": [], @@ -73,8 +73,8 @@ "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:09:58.215354700Z", - "start_time": "2024-04-21T13:09:58.105511Z" + "end_time": "2024-04-23T23:29:14.698566500Z", + "start_time": "2024-04-23T23:29:14.594050100Z" } }, "outputs": [], @@ -97,8 +97,8 @@ "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:09:58.222377500Z", - "start_time": "2024-04-21T13:09:58.217869300Z" + "end_time": "2024-04-23T23:29:14.711565900Z", + "start_time": "2024-04-23T23:29:14.701566400Z" } }, "outputs": [], @@ -134,8 +134,8 @@ "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:09:58.255484400Z", - "start_time": "2024-04-21T13:09:58.223384700Z" + "end_time": "2024-04-23T23:29:14.741569600Z", + "start_time": "2024-04-23T23:29:14.705566800Z" } }, "outputs": [ @@ -177,8 +177,8 @@ "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:12:25.560796300Z", - "start_time": "2024-04-21T13:09:58.240940Z" + "end_time": "2024-04-23T23:30:26.688161400Z", + "start_time": "2024-04-23T23:29:14.734569600Z" } }, "outputs": [ @@ -186,31 +186,21 @@ "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" + "[==============================] 100% Epoch 1/10 - loss: 0.5726 - accuracy_score: 0.8099 - 8.15s\n", + "[==============================] 100% Epoch 2/10 - loss: 0.2319 - accuracy_score: 0.9333 - 7.96s\n", + "[==============================] 100% Epoch 3/10 - loss: 0.1948 - accuracy_score: 0.9432 - 7.10s\n", + "[==============================] 100% Epoch 4/10 - loss: 0.1726 - accuracy_score: 0.9502 - 7.08s\n", + "[==============================] 100% Epoch 5/10 - loss: 0.1587 - accuracy_score: 0.9530 - 6.98s\n", + "[==============================] 100% Epoch 6/10 - loss: 0.1487 - accuracy_score: 0.9563 - 7.23s\n", + "[==============================] 100% Epoch 7/10 - loss: 0.1386 - accuracy_score: 0.9587 - 6.78s\n", + "[==============================] 100% Epoch 8/10 - loss: 0.1349 - accuracy_score: 0.9603 - 6.91s\n", + "[==============================] 100% Epoch 9/10 - loss: 0.1320 - accuracy_score: 0.9609 - 6.93s\n", + "[==============================] 100% Epoch 10/10 - loss: 0.1222 - accuracy_score: 0.9635 - 6.81s\n" ] } ], "source": [ - "model.train(x_train, y_train, epochs=20, batch_size=48, metrics=[accuracy_score], random_state=42)" + "model.fit(x_train, y_train, epochs=10, batch_size=48, metrics=[accuracy_score], random_state=42)" ] }, { @@ -225,8 +215,8 @@ "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:12:25.625272Z", - "start_time": "2024-04-21T13:12:25.570874800Z" + "end_time": "2024-04-23T23:30:26.752709800Z", + "start_time": "2024-04-23T23:30:26.683876200Z" } }, "outputs": [ @@ -234,7 +224,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Test loss: 0.1739562576224733\n" + "Test loss: 0.17413642094878234\n" ] } ], @@ -255,8 +245,8 @@ "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:12:25.669005800Z", - "start_time": "2024-04-21T13:12:25.619723700Z" + "end_time": "2024-04-23T23:30:26.808706400Z", + "start_time": "2024-04-23T23:30:26.747485900Z" } }, "outputs": [], @@ -276,8 +266,8 @@ "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:12:25.670014500Z", - "start_time": "2024-04-21T13:12:25.653477500Z" + "end_time": "2024-04-23T23:30:26.814711Z", + "start_time": "2024-04-23T23:30:26.781708700Z" } }, "outputs": [ @@ -285,9 +275,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "accuracy: 0.9568\n", - "f1_score: 0.9565405449722376\n", - "recall_score 0.9562654244701111\n" + "accuracy: 0.9549\n", + "f1_score: 0.9548478204173041\n", + "recall_score 0.9543130769611624\n" ] } ], @@ -309,17 +299,15 @@ "execution_count": 10, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:12:25.942550200Z", - "start_time": "2024-04-21T13:12:25.662547800Z" + "end_time": "2024-04-23T23:30:27.058485300Z", + "start_time": "2024-04-23T23:30:26.792708800Z" } }, "outputs": [ { "data": { - "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/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": [ - "
" - ] + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnIAAAMsCAYAAADQ3U+mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACBYElEQVR4nO3deXRUVfb//U8FyBwwhASIQIAoDgwik4rIJIMExAkxgop+RYMy2i2oQMsothNDM0TtVmKTQCsiIDYCogQQZ0RoEGxAItCgzAlzgDrPHzypH5VbIZVQSdUl79daWYuzc+6pXTdFzs6pe245jDFGAAAAsJ0gfycAAACA4qGQAwAAsCkKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsCkKOQAAAJuyXSFXu3ZtPfroo652ZmamHA6HMjMz/ZZTfvlzxKVp27at2rZt6+80AKBAzE1lz6OPPqratWv7O42iFXJpaWlyOByur9DQUNWrV08DBgzQH3/8UVI5lojFixdr9OjR/k7DYvTo0W7nOP/XmjVrLmn8zZs3u352R44cKfY4EyZM0IIFCy4pl9KQ/zWb/ysjI8PfKQK4RMxNJW/Lli0aNmyYGjdurKioKFWvXl1du3bVDz/84JPxjxw5otDQUDkcDm3evLnY48yYMUNpaWk+yakkHTx4UK+99ppat26t2NhYXXHFFbr55pv1/vvvF3ms8sVJYOzYsapTp45OnTqlL7/8UqmpqVq8eLE2btyo8PDw4gxZbK1bt9bJkycVHBxcpOMWL16s6dOnB9x/mHvvvVdXXXWVJT58+HAdO3ZMzZs3v6Tx09PTVa1aNR0+fFgffvih+vbtW6xxJkyYoB49eujuu+++pHxKWuvWrTVr1ixLfNKkSVq/fr1uv/12P2QFoCQwN5Wcf/zjH3rnnXd033336emnn1Z2drbeeust3XzzzVqyZIk6dOhwSePPnTtXDodD1apVU0ZGhsaPH1+scWbMmKEqVaoE/Mrj119/rREjRigpKUkjR45U+fLlNW/ePCUnJ+vnn3/WmDFjvB6rWIVcly5d1KxZM0lS3759FRMTo4kTJ2rhwoV68MEHPR5z/PhxRUREFOfhLiooKEihoaE+H9dfGjVqpEaNGrnFdu3apd27d6tv375F/qVwIWOMZs+erV69emnHjh3KyMgodiFnF3Xr1lXdunXdYidPntTTTz+t9u3bq1q1an7KDICvMTeVnAcffFCjR49WZGSkK/Z///d/uu666zR69OhLLuTS09OVlJSkhIQEzZ49u9iFnF3Ur19fW7duVUJCgiv29NNPq0OHDnrllVc0bNgwr1+XPrlGrn379pKkHTt2SDr/vnFkZKS2b9+upKQkRUVFqXfv3pIkp9OpyZMnq379+goNDVXVqlWVkpKiw4cPu41pjNH48eNVo0YNhYeHq127dtq0aZPlsQu6DuHbb79VUlKSoqOjFRERoUaNGmnKlCmu/KZPny5JbsvxeXydoyRt375d27dv9/aUupkzZ46MMa5zWFxr1qxRVlaWkpOTlZycrFWrVmn37t2Wfk6nU1OmTFHDhg0VGhqq2NhY3XHHHa4ldIfDoePHj+u9995znbu8v34KumYg7y3jC82cOVPt27dXXFycQkJCdP311ys1NdWr57Jz505t2bKlaCfg/7do0SIdPXr0ks8ngMDG3OS7ualp06ZuRZwkxcTE6Lbbbrukt0Kl87/PV69e7ZqbduzYoa+++spj3/T0dLVo0ULh4eGKjo5W69attWzZMknnrwHctGmTVq5c6Tp3eddXe5qDpP/3tnxWVpYrtnDhQnXt2lXx8fEKCQlRYmKixo0bp3PnzhX6XPbu3astW7bozJkzF+1Xp04dtyJOOv8zv/vuu3X69Gn9+uuvhT5WnmKtyOWX9yKIiYlxxc6ePavOnTurVatWev31113L2ikpKUpLS9Njjz2mQYMGaceOHZo2bZrWrVunNWvWqEKFCpKkF198UePHj1dSUpKSkpL0448/qlOnTsrNzS00n88++0zdunVT9erVNXjwYFWrVk2bN2/WJ598osGDByslJUV79uzRZ5995vFtt5LIMe8tvAtfLN7KyMhQzZo11bp16yIfm3+cxMRENW/eXA0aNFB4eLjmzJmjoUOHuvV7/PHHlZaWpi5duqhv3746e/asVq9erW+++UbNmjXTrFmz1LdvX7Vo0UJPPvmkJCkxMbHI+aSmpqp+/frq3r27ypcvr0WLFunpp5+W0+lU//79L3rsI488opUrV8oYU+THzcjIUFhYmO69994iHwvAPpibSnZukqTff/9dVapUKdaxeebMmaOIiAh169ZNYWFhSkxMVEZGhlq2bOnWb8yYMRo9erRatmypsWPHKjg4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VSrVx/z1118tsdq1a/ts/KNHj1pinu60HQh2795tib366qtu7R9++KG00nHJzs5WxYoVS/1xAcAf85K3EhISLLH8c86hQ4d89njr16+3xBo0aODVsR06dHBrr1ixwic5+VOgzE2syAEAANgUhRwAAIBNUcgBAADYFIUcAACATZX5T3bw9CkOjRo1ssQ2b95siV133XVu7SZNmlj6tG3b1hK7+eabLbFdu3a5tWvWrGnp462zZ8+6tffv32/p4+ku4Z7s3LnTre2PzQ4AAKvffvutRMcfOnSoW7tevXpeHfftt996FYNvsCIHAABgUxRyAAAANkUhBwAAYFNl/hq5zz//3KuYJ0uWLCm0T3R0tCXWuHFjS2zt2rVu7ebNm3uVgyenTp1ya//3v/+19PF0zV/lypUtse3btxc7DwCAPXTr1s0SGzt2rFs7ODjY0mffvn2W2AsvvGCJnThx4hKyw8WwIgcAAGBTFHIAAAA2RSEHAABgUxRyAAAANlXmNzuUtMOHD1tiK1asKPQ4bzdceOO+++6zxDxtwvjPf/5jib3//vs+ywMAEJiaNWtmiXna3JCfpzli5cqVPskJ3mFFDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsis0Ol6G4uDi39owZMyx9goKsNXz+u3hL0qFDh3yXGADA7xYsWGCJderUqdDj/vnPf1piI0eO9EVKuASsyAEAANgUhRwAAIBNUcgBAADYFIUcAACATbHZ4TLUv39/t3ZsbKylj6dPnPjll19KLCcAQOmrXr26JdayZUtLLCQkxBI7cOCAW3v8+PGWPseOHbuE7OALrMgBAADYFIUcAACATVHIAQAA2BTXyNncrbfeaok9//zzhR539913W2IbN270RUoAgAAxb948SywmJsarY9PT093a27dv90lO8C1W5AAAAGyKQg4AAMCmKOQAAABsikIOAADAptjsYHNJSUmWWIUKFdzan3/+uaXP119/XWI5AQD8o3v37m7tJk2aeHVcZmamJTZq1ChfpIQSxoocAACATVHIAQAA2BSFHAAAgE1RyAEAANgUmx1sJCwszBK74447LLHc3Fy3tqcLVs+cOeO7xAAApc7TJzQMHz7crZ1/81tBfvrpJ0vs2LFjxcoLpYsVOQAAAJuikAMAALApCjkAAACbopADAACwKTY72MjQoUMtsRtvvNESW7Jk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m5urgwcPFul8+mSzg7cSExO1fPly3XrrrRetNhMSEiSd/wukbt26rvj+/fstu3M8PYYkbdy4UR06dCiwX0E/1NLIsbStXLlSu3fv1tixYy0Xqh4+fFhPPvmkFixYoIceekiJiYlyOp36+eef1bhx4wLHLOj85f3Fd+TIEbe3D/L+SsyTmZmpgwcP6qOPPnK7z1Le7jIAKC3MTYVr3Lix/vGPf2jz5s1uCwLffvut6/tF9dFHH+nUqVNKTU1VlSpV3L73yy+/aOTIkVqzZo1atWqlxMRELV26VIcOHbroqtzF5iZPNxrOPzctWrRIp0+f1scff6xatWq54nlvXftK3vn64YcflJSU5Ir/8MMPcjqdRTqfpXpPhp49e+rcuXMaN26c5Xtnz551neQOHTqoQoUKmjp1qtt7zZMnTy70MZo0aaI6depo8uTJlh/ahWPl3Tcof5+SyrEotx/xtby3VYcOHaoePXq4fT3xxBO6+uqrXX/l3X333QoKCtLYsWMtf3nkP3+e/lPk/bJatWqVK5a3HfxCefcbunDM3NxczZgxw6vnVJTbjwDAxTA3FT433XXXXapQoYLb72hjjN58801deeWVlrsfeCM9PV1169ZVv379LHPTs88+q8jISNfcdN9998kY4/Fmyd7OTdnZ2dqwYYMrtnfvXs2fP9+tn6e5KTs7WzNnzvTqOXl7+5H27durcuXKltuapKamKjw83HW5kzdKdUWuTZs2SklJ0csvv6yffvpJnTp1UoUKFbR161bNnTtXU6ZMUY8ePRQbG6tnn31WL7/8srp166akpCStW7dOn376qaVqzy8oKEipqam688471bhxYz322GOqXr26tmzZok2bNrku7G/atKkkadCgQercubPKlSun5OTkEsuxKLcfmTVrln777TfXe/OrVq1y3bj34Ycfdv3FlZmZqXbt2mnUqFEFfqTL6dOnNW/ePHXs2LHAm1N2795dU6ZM0b59+3TVVVdpxIgRGjdunG677Tbde++9CgkJ0ffff6/4+Hi9/PLLrvOXmpqq8ePH66qrrlJcXJzat2+vTp06qVatWnr88cc1dOhQlStXTu+++65iY2O1c+dO12O2bNlS0dHR6tOnjwYNGiSHw6FZs2Z5dZGoVLTbj6xatcpVWO7fv1/Hjx93nc/WrVsX+c7rAC4vzE2Fz001atTQkCFD9Nprr+nMmTNq3ry5FixYoNWrVysjI8PtZsB5t0iZOXNmgZ/tumfPHq1YsUKDBg3y+P2QkBB17txZc+fO1d/+9je1a9dODz/8sP72t79p69atuuOOO+R0OrV69Wq1a9dOAwYMcJ2/5cuXa+LEiYqPj1edOnV00003KTk5Wc8995zuueceDRo0SCdOnFBqaqrq1aunH3/80fW4nTp1UnBwsO68806lpKTo2LFj+vvf/664uDjX28gX4+3tR8LCwjRu3Dj1799f999/vzp37qzVq1crPT1dL730UtGuBfR6f6v5f1u8v//++4v269Onj4mIiCjw+2+//bZp2rSpCQsLM1FRUaZhw4Zm2LBhZs+ePa4+586dM2PGjDHVq1c3YWFhpm3btmbjxo0mISHholu883z55ZemY8eOJioqykRERJhGjRqZqVOnur5/9uxZM3DgQBMbG2scDodlu7AvczSmaLcfydu+7Onrwue5aNEiI8m8+eabBY41b948I8m88847BfbJzMw0ksyUKVNcsXfffdfceOONJiQkxERHR5s2bdqYzz77zPX933//3XTt2tVERUUZSW5bsNeuXWtuuukmExwcbGrVqmUmTpzo8fYja9asMTfffLMJCwsz8fHxZtiwYWbp0qWW53mptx/J217u6ctXt3YB4D/MTaUzN507d85MmDDBJCQkmODgYFO/fn2Tnp5u6Td16lQjySxZsqTAsd544w0jyXz++ecF9klLSzOSzMKFC40x58/Na6+9Zq699loTHBxsYmNjTZcuXczatWtdx2zZssW0bt3ahIWFWW63smzZMtOgQQMTHBxsrrnmGpOenu7x9iMff/yxadSokQkNDTW1a9c2r7zyinn33Xctc86l3H4kz9tvv22uueYaExwcbBITE82kSZPcbqfiDYcxXi6BIOAMGzZMc+bM0bZt2zxuCwcAoLT17NlTWVlZ+u677/ydSplQqm+twrdWrFihv/zlLxRxAICAYIxRZmam0tPT/Z1KmcGKHAAAgE3xSeIAAAA2RSEHAABgUxRyAAAANkUhBwAAYFMBtWvV6XRqz549ioqK8slnq8HejDE6evSo4uPjLZ+NCAClgXkJ+QXa3BRQhdyePXtUs2ZNf6eBALNr1y7VqFHD32kAKIOYl1CQQJmb/F9KXiAqKsrfKSAA8boA4C/8/kFBAuW1EVCFHMvW8ITX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mjVrFjqWp00SBw8eLF5i8BlW5AAAAGyKQg4AAMCmKOQAAABsikIOAADAphzGGOPvJPLk5OR4/HSB0tapUydL7NNPPy30uGrVqlli+/fv90lOvla/fn1L7D//+Y8lNn/+fLf2o48+aulz9OhRn+XlSXZ2tseLbAGgpAXKvOStGjVquLXXrVtn6RMTE2OJeVMKeNr0N2DAAEvs0KFDhY51OQiUuYkVOQAAAJuikAMAALApCjkAAACbopADAACwqTL/yQ5xcXGW2H333efVsY8//rhb204bG5YvX+7Vsfk3O5T0xgYAQPE9++yzbu38n0B0KR544AFL7I477rDEPH1yxNSpU93aubm5PsurrGNFDgAAwKYo5AAAAGyKQg4AAMCmyvw1cm+88YYl9tBDD1lia9eutcTmzp1bIjn52m233WaJVa1a1RJLS0uzxNLT00siJQDAJUpISLDEHnvssUKP27BhgyX2xx9/WGIdOnQodCxPN0vOf52eJGVkZLi1f//990LHhndYkQMAALApCjkAAACbopADAACwKQo5AAAAmyrzmx2MMZaY0+m0xPbs2WOJBcINDcPCwiyx4cOHu7WffvppSx9Pz/v//u//fJcYAKBENW7c2BKLiopya69evdrSp02bNpZYaGioJfbggw+6tfPPLZKUmJhoiVWrVs0SW7hwoVu7S5culj6HDh2yxFA4VuQAAABsikIOAADApijkAAAAbIpCDgAAwKbK/GYHb3Xt2tUSW7ZsmVv7yJEjlj6pqak+y8HTBapt27a1xG6++eZCx/rwww99kRIAwE9CQkIssfwb2SZNmuTVWKdOnbLEZs6c6da+//77LX3q1q3r1fgnTpxwawfCZsHLBStyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTZX6zw5QpUyyxdu3aWWLx8fGWWOvWrd3aDofD0qd79+6XkJ07T+N7+oSG/H799VdLzNMdugEA9pH/kxc88bRRb8GCBcV6vGbNmhXrOEn65ptv3NrHjh0r9lhwx4ocAACATVHIAQAA2BSFHAAAgE2V+Wvk1q5da4k1atTIEmvcuLEldscdd7i1hw4daumzf/9+S+y9994rQob/z6xZsyyx9evXF3rcV199ZYlt3769WDkAAALDnDlzLLH812U3b97c0ufaa6+1xBo2bGiJ3XPPPW7t6OhoSx9PN8L31O+JJ55wa3uaz37++WdLDIVjRQ4AAMCmKOQAAABsikIOAADApijkAAAAbMphvLmjbCnJyclRpUqV/J1GwKpbt64ltm3bNkvsp59+cmt37tzZ0sfTJoxAlZ2drYoVK/o7DQBlUCDPS5UrV7bE8s8JnnIv7s3lly9fbon179/fEvvkk08ssauvvtqt/fe//93Sp1+/foXmEEgCZW5iRQ4AAMCmKOQAAABsikIOAADApijkAAAAbKrMf7KDnbz44ouWmKcLVJ977jm3tp02NgAAvHPo0CFLrGfPnm7tDz/80NLH280bU6dOdWvnn1sk6dSpU5bYRx99ZIk9//zzbm1Pm/ASExMtMT6FqHCsyAEAANgUhRwAAIBNUcgBAADYFIUcAACATbHZIUDdf//9ltgjjzxiiR09etQSO3jwYInkBAAIbPk/faFHjx6WPr169bLEjhw5Yonl32DnaWODJ+PGjbPErrvuOrd29+7dC308SerTp49Xj1mWsSIHAABgUxRyAAAANkUhBwAAYFNcIxegunTp4lW/Tz75xBL78ccffZ0OAMCG8l8zV1DMl06ePGmJvf/++25tT9fItWvXzhKrXLmyJebpRshlGStyAAAANkUhBwAAYFMUcgAAADZFIQcAAGBTbHYIUJ42Oxw/ftwSe+ONN0ojHQAAiu2DDz5wa3va7PDAAw9YYgMGDLDExo4d67vELgOsyAEAANgUhRwAAIBNUcgBAADYFIUcAACATTmMMcbfSeTJyclRpUqV/J2GX/Tr18+tPWPGDEufffv2WWLVqlUrsZwCRXZ2tipWrOjvNACUQWV5XipJjRs3tsTWrFljiYWGhlpi1113nVv7v//9r8/yKopAmZtYkQMAALApCjkAAACbopADAACwKQo5AAAAm+KTHQJE/s0Onvag/Pvf//ZqrKioKLd2dHS0pc/OnTuLkB0AAL7z008/WWIvvviiJfbaa69ZYhMmTHBrP/zww5Y+J0+eLH5yNsOKHAAAgE1RyAEAANgUhRwAAIBNcY2cjZw7d84S6927tyX2zDPPuLU3bdpk6dOnTx/fJQYAwCX65z//aYmlpKRYYvfee69be+zYsZY+GzZs8F1iAY4VOQAAAJuikAMAALApCjkAAACbopADAACwKYfxdOdZP8nJyVGlSpX8nYZf5L85YsOGDS19HA6HJebpx/fOO++4tceNG2fps2vXriJm6D/Z2dmqWLGiv9MAUAaV5XkpENSqVcsSy8rKcmvPmTPH0sfTRkBfC5S5iRU5AAAAm6KQAwAAsCkKOQAAAJuikAMAALApPtkhQAwYMMCt7elO1atWrbLEUlNTLbHDhw+7tXNzcy8xOwAASt/OnTstseXLl7u1u3fvbulz/fXXW2I///yz7xILIKzIAQAA2BSFHAAAgE1RyAEAANgUhRwAAIBNsdkhQHz55Zdu7fbt2/spEwAAAlePHj3c2uvXr7f0ueqqqywxNjsAAAAgoFDIAQAA2BSFHAAAgE1xjRwAALCNnJwct3adOnX8lElgYEUOAADApijkAAAAbIpCDgAAwKYo5AAAAGyKQg4AAMCmKOQAAABsikIOAADApijkAAAAbCqgCjljjL9TQADidQHAX/j9g4IEymsjoAq5o0eP+jsFBCBeFwD8hd8/KEigvDYcJlBKSklOp1N79uxRVFSUHA6Hv9OBnxljdPToUcXHxysoKKD+5gBQRjAvIb9Am5sCqpADAACA9/xfSgIAAKBYbFfI1a5dW48++qirnZmZKYfDoczMTL/llF/+HHFp2rZtq7Zt2/o7DQAoEHNT2RMoc1ORCrm0tDQ5HA7XV2hoqOrVq6cBAwbojz/+KKkcS8TixYs1evRof6dRoO3bt6tXr16Ki4tTWFiYrr76ao0YMeKSx928ebPrZ3fkyJFijzNhwgQtWLDgkvMpDRe+Zi/8+utf/+rv1AD4AHNT6di2bZt69Oih6OhohYeHq1WrVlqxYoVPxi6Lc9Mff/yhxx57zDXPN2nSRHPnzi3yOOWL8+Bjx45VnTp1dOrUKX355ZdKTU3V4sWLtXHjRoWHhxdnyGJr3bq1Tp48qeDg4CIdt3jxYk2fPj0g/8P89NNPatu2ra688kr9+c9/VkxMjHbu3Kldu3Zd8tjp6emqVq2aDh8+rA8//FB9+/Yt1jgTJkxQjx49dPfdd19yTqWhY8eOeuSRR9xiN954o5+yAVASmJtKzq5du3TLLbeoXLlyGjp0qCIiIjRz5kx16tRJn3/+uVq3bn1J45e1uSknJ0etWrXSH3/8ocGDB6tatWr64IMP1LNnT2VkZKhXr15ej1WsQq5Lly5q1qyZJKlv376KiYnRxIkTtXDhQj344IMejzl+/LgiIiKK83AXFRQUpNDQUJ+P6y9Op1MPP/ywrr32Wq1YsUJhYWE+G9sYo9mzZ6tXr17asWOHMjIyiv2fxW7q1aunhx56yN9pAChBzE0l569//auOHDmijRs36pprrpEkPfHEE7r22mv1zDPPaO3atcUeuyzOTW+99Za2bdumzz//XO3bt5ckPfXUU7r55pv15z//WT169PD6jwCfXCOXl8SOHTskSY8++qgiIyO1fft2JSUlKSoqSr1795Z0vlCZPHmy6tevr9DQUFWtWlUpKSk6fPiw25jGGI0fP141atRQeHi42rVrp02bNlkeu6DrEL799lslJSUpOjpaERERatSokaZMmeLKb/r06ZLc33bL4+scpfNvlW7fvr3Qc7ls2TJt3LhRo0aNUlhYmE6cOKFz584Vepw31qxZo6ysLCUnJys5OVmrVq3S7t27Lf2cTqemTJmihg0bKjQ0VLGxsbrjjjv0ww8/SDp/zo4fP6733nvPde7yrrt49NFHVbt2bcuYo0ePtmzdnzlzptq3b6+4uDiFhITo+uuvV2pqqlfPZefOndqyZUuRnv/Jkyd16tSpIh0DwL6Ym3w3N61evVo33nijq4iTpPDwcHXv3l0//vijtm7dWugYBSmLc9Pq1asVGxvreo1K54v/nj176vfff9fKlSu9ejypmCty+eW9CGJiYlyxs2fPqnPnzmrVqpVef/1117J2SkqK0tLS9Nhjj2nQoEHasWOHpk2bpnXr1mnNmjWqUKGCJOnFF1/U+PHjlZSUpKSkJP3444/q1KmTcnNzC83ns88+U7du3VS9enXXkuXmzZv1ySefaPDgwUpJSdGePXv02WefadasWZbjSyLH22+/XZKUlZV10dyXL18uSQoJCVGzZs20du1aBQcH65577tGMGTNUuXLlQp9/QTIyMpSYmKjmzZurQYMGCg8P15w5czR06FC3fo8//rjS0tLUpUsX9e3bV2fPntXq1av1zTffqFmzZpo1a5b69u2rFi1a6Mknn5QkJSYmFjmf1NRU1a9fX927d1f58uW1aNEiPf3003I6nerfv/9Fj33kkUe0cuVKr++snZaWphkzZsgYo+uuu04jR44s0tI1APthbvLd3HT69GlFR0db4nnnb+3atbr66qsLPQeelMW56fTp0x7fcbvwfHbs2NG7hE0RzJw500gyy5cvN/v37ze7du0y//rXv0xMTIwJCwszu3fvNsYY06dPHyPJPP/8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5PLxtGmhZs2altg///lPt/bixYstfaKjo716zPzPe9asWZY+R44c8WqsywErcgAAADZFIQcAAGBTFHIAAAA2RSEHAABgU2Vus0PLli0L7bNu3TpLbPfu3SWRDgAAbjxtIDh37pxXx549e9atfdNNN1n69OjRwxK79tprCx375MmTlth1113nVSz/pyNVrVq10McryB9//OHWHj9+vKXPmTNnij2+3bAiBwAAYFMUcgAAADZFIQcAAGBTDmOM8XcSeXJyclSpUqUSfYx9+/a5tWNiYix9Tp8+bYm98sorltjChQvd2j/99NOlJQePsrOzVbFiRX+nAaAMKo15Kb+wsDBLbPbs2ZZYhw4dLLHw8HC3dlCQdb3G22k//3V5nq7d8yWn02mJzZ8/3xIbNGiQW3vv3r0lltPFBMrcxIocAACATVHIAQAA2BSFHAAAgE1RyAEAANhUmdvskP/perq40lv5j33zzTctfb755htLrFatWpbYtm3b3NqbNm3yKof69etbYl9//bVb2+43Mw6UC0oBlD3+2OzgrSuuuMISe/75593at956q6XPwYMHLbGdO3daYiEhIW7tG264wdKnRYsWhaXpNU9z6PDhwy2xI0eO+OwxL0WgzE2syAEAANgUhRwAAIBNUcgBAADYFIUcAACATZW5zQ6vvfaaW/tPf/pTiT6eP+zfv9+tnZmZaemTnJxcStlcukC5oBRA2RPImx1K2z//+U9L7KGHHvLq2KNHj7q1Pc29aWlpllj+T5cIJIEyN7EiBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA2VeY2O5QrV86tfeONN1r6zJ492xIrX768JVazZk23dlBQYNbFnn7Eo0ePtsTGjx9fCtkUXaBcUAqg7CnLmx2GDRvm1vY0R3iaGz3p3bu3W3vOnDnFTyxABMrcFJiVBwAAAApFIQcAAGBTFHIAAAA25d2b25eR/DcX/OGHHyx96tWr59VYt99+u1u7QoUKlj6erkVr3ry5V+P7isPhsMSaNm1aqjkAAAJX3759LbGRI0e6tb29Hm7Tpk2W2EcffVS8xFAoVuQAAABsikIOAADApijkAAAAbIpCDgAAwKbK3GYHX/r8888L7dO4cWNLzNNmh7Nnz7q1Z86caenz97//3RIbMmSIJdarV69C8wIAlE0tWrSwxN544w1LLDIystCxjh07Zon169fPEjt9+rSX2aGoWJEDAACwKQo5AAAAm6KQAwAAsCkKOQAAAJtis0MJW7ZsmSX20ksvWWL575j9xBNPWPpcddVVlljbtm2Lldfu3buLdRwAwN7uvPNOSywqKqrQ444fP26Jde/e3RJbs2ZN8RJDsbAiBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA25TDGGH8nkScnJ0eVKlXydxo+FRYWZom9++67lljPnj199pjnzp1za//73/+29HnooYcsMU8XsgaC7OxsVaxY0d9pACiD7D4vedrEcODAAUusQoUKhY719ttvW2KePsWhrAiUuYkVOQAAAJuikAMAALApCjkAAACb4obAJezkyZOW2JAhQyyxyMhIt3azZs0sfeLi4iyxrKwsS2zWrFlu7dGjR188SQDAZSH/XPLzzz9b+nhzPZwkbdiwwa3tae6C/7EiBwAAYFMUcgAAADZFIQcAAGBTFHIAAAA2xWYHP/jjjz8ssTvvvNOt/fDDD1v63HzzzZbYmDFjLLF9+/ZdQnYAALtq3769W7tGjRqWPt5+DsAzzzzj1j516lTxE0OJYUUOAADApijkAAAAbIpCDgAAwKYo5AAAAGzKYby96rEU5OTkqFKlSv5OAwEmOztbFStW9HcaAMogu81L69evd2s3bNjQq+Nee+01S+y5557zSU6Xq0CZm1iRAwAAsCkKOQAAAJuikAMAALApCjkAAACb4pMdAAC4TFSuXNmt7XA4LH08ffrP5MmTSyollDBW5AAAAGyKQg4AAMCmKOQAAABsimvkAAC4TEycOPGibUkaN26cJbZ3794SywklixU5AAAAm6KQAwAAsCkKOQAAAJuikAMAALAphzHG+DuJPDk5OapUqZK/00CAyc7OVsWKFf2dBoAyiHkJBQmUuYkVOQAAAJuikAMAALApCjkAAACbCqhCLoAu10MA4XUBwF/4/YOCBMprI6AKuaNHj/o7BQQgXhcA/IXfPyhIoLw2AmrXqtPp1J49exQVFSWHw+HvdOBnxhgdPXpU8fHxCgoKqL85AJQRzEvIL9DmpoAq5AAAAOA9/5eSAAAAKBYKOQAAAJuikAMAALApCjkAAACbopADAACwKQo5AAAAm6KQAwAAsKn/DyViu2mhlNteAAAAAElFTkSuQmCC\n" }, "metadata": {}, "output_type": "display_data" @@ -346,8 +334,8 @@ "execution_count": 11, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:12:26.112578100Z", - "start_time": "2024-04-21T13:12:25.931021900Z" + "end_time": "2024-04-23T23:30:27.226005600Z", + "start_time": "2024-04-23T23:30:27.057483700Z" } }, "outputs": [], diff --git a/examples/cnn-classification/simple_cnn_classification_mnist.ipynb b/examples/cnn-classification/simple_cnn_classification_mnist.ipynb index 0ed6117..98385b0 100644 --- a/examples/cnn-classification/simple_cnn_classification_mnist.ipynb +++ b/examples/cnn-classification/simple_cnn_classification_mnist.ipynb @@ -21,8 +21,8 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:59:06.963987800Z", - "start_time": "2024-04-21T13:59:02.342450300Z" + "end_time": "2024-04-23T23:34:31.702298200Z", + "start_time": "2024-04-23T23:34:27.614924700Z" } }, "outputs": [], @@ -52,8 +52,8 @@ "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:59:07.142613500Z", - "start_time": "2024-04-21T13:59:06.964989400Z" + "end_time": "2024-04-23T23:34:31.891335500Z", + "start_time": "2024-04-23T23:34:31.704297500Z" } }, "outputs": [], @@ -73,8 +73,8 @@ "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:59:07.253448500Z", - "start_time": "2024-04-21T13:59:07.144680500Z" + "end_time": "2024-04-23T23:34:32.090375Z", + "start_time": "2024-04-23T23:34:31.893335500Z" } }, "outputs": [], @@ -97,8 +97,8 @@ "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:59:07.270516400Z", - "start_time": "2024-04-21T13:59:07.257449600Z" + "end_time": "2024-04-23T23:34:32.105372800Z", + "start_time": "2024-04-23T23:34:32.096373900Z" } }, "outputs": [ @@ -149,8 +149,8 @@ "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T13:59:07.322785100Z", - "start_time": "2024-04-21T13:59:07.267961400Z" + "end_time": "2024-04-23T23:34:32.193406400Z", + "start_time": "2024-04-23T23:34:32.104373900Z" } }, "outputs": [ @@ -197,8 +197,8 @@ "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T14:04:14.757698500Z", - "start_time": "2024-04-21T13:59:07.286701700Z" + "end_time": "2024-04-23T23:40:29.450560800Z", + "start_time": "2024-04-23T23:34:32.121373200Z" } }, "outputs": [ @@ -206,21 +206,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "[==============================] 100% Epoch 1/10 - loss: 0.7568 - accuracy_score: 0.7469 - 30.60s - val_accuracy: 0.8824\n", - "[==============================] 100% Epoch 2/10 - loss: 0.3492 - accuracy_score: 0.8896 - 27.70s - val_accuracy: 0.9090\n", - "[==============================] 100% Epoch 3/10 - loss: 0.2760 - accuracy_score: 0.9131 - 27.41s - val_accuracy: 0.9248\n", - "[==============================] 100% Epoch 4/10 - loss: 0.2290 - accuracy_score: 0.9287 - 28.12s - val_accuracy: 0.9306\n", - "[==============================] 100% Epoch 5/10 - loss: 0.1984 - accuracy_score: 0.9385 - 29.91s - val_accuracy: 0.9359\n", - "[==============================] 100% Epoch 6/10 - loss: 0.1761 - accuracy_score: 0.9453 - 29.25s - val_accuracy: 0.9403\n", - "[==============================] 100% Epoch 7/10 - loss: 0.1575 - accuracy_score: 0.9516 - 31.05s - val_accuracy: 0.9446\n", - "[==============================] 100% Epoch 8/10 - loss: 0.1420 - accuracy_score: 0.9566 - 29.53s - val_accuracy: 0.9495\n", - "[==============================] 100% Epoch 9/10 - loss: 0.1281 - accuracy_score: 0.9613 - 27.19s - val_accuracy: 0.9552\n", - "[==============================] 100% Epoch 10/10 - loss: 0.1161 - accuracy_score: 0.9649 - 28.16s - val_accuracy: 0.9597\n" + "[==============================] 100% Epoch 1/10 - loss: 0.7568 - accuracy_score: 0.7469 - 32.51s - val_accuracy: 0.8824\n", + "[==============================] 100% Epoch 2/10 - loss: 0.3492 - accuracy_score: 0.8896 - 35.16s - val_accuracy: 0.9090\n", + "[==============================] 100% Epoch 3/10 - loss: 0.2760 - accuracy_score: 0.9131 - 31.36s - val_accuracy: 0.9248\n", + "[==============================] 100% Epoch 4/10 - loss: 0.2290 - accuracy_score: 0.9287 - 30.44s - val_accuracy: 0.9306\n", + "[==============================] 100% Epoch 5/10 - loss: 0.1984 - accuracy_score: 0.9385 - 38.86s - val_accuracy: 0.9359\n", + "[==============================] 100% Epoch 6/10 - loss: 0.1761 - accuracy_score: 0.9453 - 54.44s - val_accuracy: 0.9403\n", + "[==============================] 100% Epoch 7/10 - loss: 0.1575 - accuracy_score: 0.9516 - 32.83s - val_accuracy: 0.9446\n", + "[==============================] 100% Epoch 8/10 - loss: 0.1420 - accuracy_score: 0.9566 - 26.88s - val_accuracy: 0.9495\n", + "[==============================] 100% Epoch 9/10 - loss: 0.1281 - accuracy_score: 0.9613 - 26.80s - val_accuracy: 0.9552\n", + "[==============================] 100% Epoch 10/10 - loss: 0.1161 - accuracy_score: 0.9649 - 27.73s - val_accuracy: 0.9597\n" ] } ], "source": [ - "model.train(x_train, y_train, epochs=10, batch_size=128, metrics=[\n", + "model.fit(x_train, y_train, epochs=10, batch_size=128, metrics=[\n", " accuracy_score], random_state=42, validation_data=(x_test, y_test))" ] }, @@ -236,8 +236,8 @@ "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T14:04:16.312526400Z", - "start_time": "2024-04-21T14:04:14.753676500Z" + "end_time": "2024-04-23T23:40:30.972697200Z", + "start_time": "2024-04-23T23:40:29.470562300Z" } }, "outputs": [ @@ -266,8 +266,8 @@ "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T14:04:18.043740600Z", - "start_time": "2024-04-21T14:04:16.310956700Z" + "end_time": "2024-04-23T23:40:32.548225200Z", + "start_time": "2024-04-23T23:40:30.978698900Z" } }, "outputs": [], @@ -287,8 +287,8 @@ "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T14:04:18.054771900Z", - "start_time": "2024-04-21T14:04:18.046739300Z" + "end_time": "2024-04-23T23:40:32.579219700Z", + "start_time": "2024-04-23T23:40:32.550236700Z" } }, "outputs": [ @@ -320,8 +320,8 @@ "execution_count": 10, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T14:04:18.315666800Z", - "start_time": "2024-04-21T14:04:18.058285200Z" + "end_time": "2024-04-23T23:40:33.035884200Z", + "start_time": "2024-04-23T23:40:32.586224100Z" } }, "outputs": [ @@ -355,8 +355,8 @@ "execution_count": 11, "metadata": { "ExecuteTime": { - "end_time": "2024-04-21T14:04:18.477652200Z", - "start_time": "2024-04-21T14:04:18.317667200Z" + "end_time": "2024-04-23T23:40:33.205916600Z", + "start_time": "2024-04-23T23:40:33.039881500Z" } }, "outputs": [], diff --git a/examples/real-life-applications/tic_tac_toe_alternative_dataset_shape.py b/examples/real-life-applications/tic_tac_toe_alternative_dataset_shape.py index 6bf5da5..623e475 100644 --- a/examples/real-life-applications/tic_tac_toe_alternative_dataset_shape.py +++ b/examples/real-life-applications/tic_tac_toe_alternative_dataset_shape.py @@ -72,7 +72,7 @@ def main(): model.compile(loss_function=BinaryCrossentropy(), optimizer=Adam(learning_rate=0.001)) # 7. Train the model - model.train(x_train, y_train, epochs=500, batch_size=32, metrics=[accuracy_score], random_state=42) + model.fit(x_train, y_train, epochs=500, batch_size=32, metrics=[accuracy_score], random_state=42) # 8. Evaluate the model loss = model.evaluate(x_test, y_test) diff --git a/neuralnetlib/layers.py b/neuralnetlib/layers.py index 5ff03a5..4888abc 100644 --- a/neuralnetlib/layers.py +++ b/neuralnetlib/layers.py @@ -120,6 +120,7 @@ def __str__(self): def forward_pass(self, input_data: np.ndarray) -> np.ndarray: if self.weights is None: + assert len(input_data.shape) == 2, f"Dense input must be 2D (batch_size, features), got {input_data.shape}" self.initialize_weights(input_data.shape[1]) self.input = input_data @@ -265,6 +266,7 @@ def __str__(self): def forward_pass(self, input_data: np.ndarray) -> np.ndarray: if self.weights is None: + assert len(input_data.shape) == 4, f"Conv2D input must be 4D (batch_size, channels, height, width), got {input_data.shape}" self.initialize_weights(input_data.shape[1:]) self.input = input_data @@ -363,6 +365,7 @@ def __str__(self): return f'MaxPooling2D(pool_size={self.pool_size}, stride={self.stride}, padding={self.padding})' def forward_pass(self, input_data: np.ndarray) -> np.ndarray: + assert len(input_data.shape) == 4, f"MaxPooling2D input must be 4D (batch_size, channels, height, width), got {input_data.shape}" self.input = input_data output = self._pool(self.input, self.pool_size, self.stride, self.padding) return output @@ -446,6 +449,7 @@ def __str__(self): return 'Flatten' def forward_pass(self, input_data: np.ndarray) -> np.ndarray: + assert len(input_data.shape) >= 2, f"Flatten input must be at least 2D, got {input_data.shape}" self.input_shape = input_data.shape return input_data.reshape(input_data.shape[0], -1) @@ -508,6 +512,7 @@ def __str__(self): def forward_pass(self, input_data: np.ndarray) -> np.ndarray: if self.weights is None: + assert len(input_data.shape) == 3, f"Conv1D input must be 3D (batch_size, steps, features), got {input_data.shape}" self.initialize_weights(input_data.shape[1:]) self.input = input_data @@ -600,6 +605,7 @@ def __str__(self): return f'MaxPooling1D(pool_size={self.pool_size}, stride={self.stride}, padding={self.padding})' def forward_pass(self, input_data: np.ndarray) -> np.ndarray: + assert len(input_data.shape) == 3, f"MaxPooling1D input must be 3D (batch_size, steps, features), got {input_data.shape}" self.input = input_data output = self._pool(self.input, self.pool_size, self.stride, self.padding) return output @@ -692,6 +698,7 @@ def __str__(self): def forward_pass(self, input_data: np.ndarray) -> np.ndarray: if self.weights is None: + assert len(input_data.shape) == 2, f"Embedding input must be 2D (batch_size, sequence_length), got {input_data.shape}" self.initialize_weights() self.input = input_data diff --git a/neuralnetlib/model.py b/neuralnetlib/model.py index f5f6a67..2178926 100644 --- a/neuralnetlib/model.py +++ b/neuralnetlib/model.py @@ -3,7 +3,7 @@ import numpy as np -from neuralnetlib.layers import Layer, Input, Activation, Dense, Flatten, Conv2D, Dropout, Conv1D, Embedding +from neuralnetlib.layers import Layer, Input, Dense, Activation, Conv2D, MaxPooling2D, Conv1D, MaxPooling1D, Flatten, Dropout, Embedding from neuralnetlib.losses import LossFunction, CategoricalCrossentropy from neuralnetlib.optimizers import Optimizer from neuralnetlib.utils import shuffle, progress_bar @@ -33,16 +33,43 @@ 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, (Dense, Conv1D, Embedding)): - prev_layer = [l for l in self.layers if isinstance(l, (Input, Dense, Conv2D, Conv1D, Flatten, Embedding))][-1] - if isinstance(prev_layer, Flatten): - prev_layer = [l for l in self.layers if isinstance(l, (Dense, Conv2D, Conv1D))][-1] - if hasattr(prev_layer, 'output_size') and prev_layer.output_size != layer.input_size: - raise ValueError( - f'Layer input size {layer.input_size} does not match previous layer output size {prev_layer.output_size}.') - elif self.layers and isinstance(layer, Dropout): - if isinstance(self.layers[-1], Dropout): - raise ValueError("Cannot add consecutive Dropout layers.") + if not self.layers: + if not isinstance(layer, Input): + raise ValueError("The first layer must be an Input layer.") + else: + previous_layer = self.layers[-1] + + if isinstance(previous_layer, Input): + if not isinstance(layer, (Dense, Conv2D, Conv1D, Embedding)): + raise ValueError("Input layer can only be followed by Dense, Conv2D, Conv1D, or Embedding.") + elif isinstance(previous_layer, Dense): + if not isinstance(layer, (Dense, Activation, Dropout)): + raise ValueError("Dense layer can only be followed by Dense, Activation, or Dropout.") + elif isinstance(previous_layer, Activation): + if not isinstance(layer, (Dense, Conv2D, Conv1D, MaxPooling2D, MaxPooling1D, Flatten, Dropout)): + raise ValueError("Activation layer can only be followed by Dense, Conv2D, Conv1D, MaxPooling2D, MaxPooling1D, Flatten, or Dropout.") + elif isinstance(previous_layer, Conv2D): + if not isinstance(layer, (Conv2D, MaxPooling2D, Activation, Dropout, Flatten)): + raise ValueError("Conv2D layer can only be followed by Conv2D, MaxPooling2D, Activation, Dropout, or Flatten.") + elif isinstance(previous_layer, MaxPooling2D): + if not isinstance(layer, (Conv2D, MaxPooling2D, Flatten)): + raise ValueError("MaxPooling2D layer can only be followed by Conv2D, MaxPooling2D, or Flatten.") + elif isinstance(previous_layer, Conv1D): + if not isinstance(layer, (Conv1D, MaxPooling1D, Activation, Dropout, Flatten)): + raise ValueError("Conv1D layer can only be followed by Conv1D, MaxPooling1D, Activation, Dropout, or Flatten.") + elif isinstance(previous_layer, MaxPooling1D): + if not isinstance(layer, (Conv1D, MaxPooling1D, Flatten)): + raise ValueError("MaxPooling1D layer can only be followed by Conv1D, MaxPooling1D, or Flatten.") + elif isinstance(previous_layer, Flatten): + if not isinstance(layer, (Dense, Dropout)): + raise ValueError("Flatten layer can only be followed by Dense or Dropout.") + elif isinstance(previous_layer, Dropout): + if not isinstance(layer, (Dense, Conv2D, Conv1D, Activation)): + raise ValueError("Dropout layer can only be followed by Dense, Conv2D, Conv1D, or Activation.") + elif isinstance(previous_layer, Embedding): + if not isinstance(layer, (Conv1D, Flatten, Dense)): + raise ValueError("Embedding layer can only be followed by Conv1D, Flatten, or Dense.") + self.layers.append(layer) def compile(self, loss_function: LossFunction, optimizer: Optimizer, verbose: bool = False): @@ -88,8 +115,21 @@ def train_on_batch(self, x_batch: np.ndarray, y_batch: np.ndarray) -> float: self.backward_pass(error) return loss - def train(self, x_train: np.ndarray, y_train: np.ndarray, epochs: int, batch_size: int = None, - verbose: bool = True, metrics: list = None, random_state: int = None, validation_data: tuple = None): + def fit(self, x_train: np.ndarray, y_train: np.ndarray, epochs: int, batch_size: int = None, + verbose: bool = True, metrics: list = None, random_state: int = None, validation_data: tuple = None): + """ + Fit the model to the training data. + + Args: + x_train: Training data + y_train: Training labels + epochs: Number of epochs to train the model + batch_size: Number of samples per gradient update + verbose: Whether to print training progress + metrics: List of metrics to evaluate the model (functions from neuralnetlib.metrics module) + random_state: Random seed for shuffling the data + validation_data: Tuple of validation data and labels + """ for i in range(epochs): start_time = time.time() diff --git a/tests/test_model.py b/tests/test_model.py index fe04027..7c519ae 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -24,11 +24,11 @@ def setUp(self): self.y_test = rng.random((10, 20)) def test_model_train_on_batch(self): - loss = self.model.train_on_batch(self.x_train[:10], self.y_train[:10]) + loss = self.model.fit_on_batch(self.x_train[:10], self.y_train[:10]) self.assertIsInstance(loss, float) def test_model_train(self): - self.model.train(self.x_train, self.y_train, epochs=1, batch_size=10, verbose=False) + self.model.fit(self.x_train, self.y_train, epochs=1, batch_size=10, verbose=False) def test_model_evaluate(self): loss = self.model.evaluate(self.x_test, self.y_test)