diff --git a/02-01-Recreer Tensorflow.ipynb b/02-01-Recreer Tensorflow.ipynb index 0951545..6748b5c 100644 --- a/02-01-Recreer Tensorflow.ipynb +++ b/02-01-Recreer Tensorflow.ipynb @@ -1 +1,2528 @@ -{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyOl/sW8a9+bUAxFqg+HL1YI"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","execution_count":230,"metadata":{"id":"UT74bNWZakgN","executionInfo":{"status":"ok","timestamp":1687387972531,"user_tz":-60,"elapsed":467,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"outputs":[],"source":["import numpy as np"]},{"cell_type":"code","source":[],"metadata":{"id":"3_UF7yxRpVQ4"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# La boite générique"],"metadata":{"id":"L1c696dgpV6F"}},{"cell_type":"code","source":["class Boite():\n","\n"," def __init__(self):\n"," pass\n","\n"," def forward(self, inputs):\n"," self.inputs = inputs\n"," self.output = self.operation()\n"," return self.output\n","\n"," def backward(self, derivee_output):\n"," assert derivee_output.shape == self.output.shape, f\"La derivee_output reçue a un shape {derivee_output.shape} et different du shape de output : {self.output.shape}\"\n","\n"," self.derivee_inputs = self.gradient(derivee_output)\n"," assert self.derivee_inputs.shape == self.inputs.shape, f\"La derivee_input calculée a un shape {self.derivee_inputs.shape } et different du shape de inputs : {self.inputs.shape}\"\n","\n"," return self.derivee_inputs\n","\n","\n"," def operation(self):\n"," pass\n","\n"," def gradient(self, derivee_output):\n"," pass\n"],"metadata":{"id":"TZFzM_1BfRxH","executionInfo":{"status":"ok","timestamp":1687392395222,"user_tz":-60,"elapsed":481,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":414,"outputs":[]},{"cell_type":"code","source":[],"metadata":{"id":"bivQj03vpanD"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# La boite paramètrée"],"metadata":{"id":"B1fYIrJgpbUz"}},{"cell_type":"code","source":["class BoiteParam():\n","\n"," def __init__(self, param):\n"," self.param = param\n","\n"," def forward(self, inputs):\n"," self.inputs = inputs\n"," self.output = self.operation()\n"," return self.output\n","\n"," def backward(self, derivee_output):\n"," assert derivee_output.shape == self.output.shape, f\"La derivee_output reçue a un shape {derivee_output.shape} et different du shape de output : {self.output}\"\n","\n"," self.derivee_inputs = self.gradient(derivee_output)\n"," assert self.derivee_inputs.shape == self.inputs.shape, f\"La derivee_input calculée a un shape {self.derivee_inputs.shape } et different du shape de inputs : {self.inputs.shape}\"\n","\n"," self.derivee_param = self.gradient_param(derivee_output)\n"," assert self.derivee_param.shape == self.param.shape, f\"La derivee de param a un shape {self.derivee_param.shape} et different du shape de param : {self.param.shape}\"\n","\n"," return self.derivee_inputs\n","\n","\n"," def operation(self):\n"," pass\n","\n"," def gradient(self, derivee_output):\n"," pass\n","\n","\n"," def gradient_param(self, derivee_output):\n"," pass"],"metadata":{"id":"MkjaXZU6gNs_","executionInfo":{"status":"ok","timestamp":1687388825470,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":301,"outputs":[]},{"cell_type":"markdown","source":["# La classe Dot"],"metadata":{"id":"y8Rt0F5Wifmp"}},{"cell_type":"code","source":["class Dot(BoiteParam):\n","\n"," def __init__(self, weights):\n"," super().__init__(weights)\n","\n"," def operation(self):\n"," return np.dot(self.inputs, self.param)\n","\n"," def gradient(self, derivee_output):\n"," return np.dot( derivee_output, self.param.T)\n","\n"," def gradient_param(self, derivee_output):\n"," return np.dot(self.inputs.T, derivee_output)\n","\n"," def __repr__(self):\n"," return \"DotProduct\""],"metadata":{"id":"eK4i0lrqiHJh","executionInfo":{"status":"ok","timestamp":1687388827304,"user_tz":-60,"elapsed":440,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":302,"outputs":[]},{"cell_type":"code","source":["X = np.array([[ 2, 3, -2],\n"," [ 4, 5, -1],\n"," [-5, 2, 3],\n"," [ 0, 5, 4]])"],"metadata":{"id":"usc5umRWjnBS","executionInfo":{"status":"ok","timestamp":1687388829277,"user_tz":-60,"elapsed":398,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":303,"outputs":[]},{"cell_type":"code","source":["X.shape"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Oj1075Umjr7Q","executionInfo":{"status":"ok","timestamp":1687388830942,"user_tz":-60,"elapsed":5,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"4253c2e3-454c-4f9e-9d85-5475c0c40c95"},"execution_count":304,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(4, 3)"]},"metadata":{},"execution_count":304}]},{"cell_type":"code","source":["W = np.array([[ 0.49671415],\n"," [-0.1382643 ],\n"," [ 0.64768854]])\n","W.shape"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"arp83t_djtWK","executionInfo":{"status":"ok","timestamp":1687388831513,"user_tz":-60,"elapsed":4,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"d5e28430-6430-4853-8763-f1f4979706a1"},"execution_count":305,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(3, 1)"]},"metadata":{},"execution_count":305}]},{"cell_type":"code","source":["np.dot(X, W)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"W6bkTgYWjyGG","executionInfo":{"status":"ok","timestamp":1687361118701,"user_tz":-60,"elapsed":393,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"bb3b807e-0888-4625-d804-cab678fabe56"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-0.71674168],\n"," [ 0.64784656],\n"," [-0.81703373],\n"," [ 1.89943266]])"]},"metadata":{},"execution_count":11}]},{"cell_type":"code","source":["M = Dot(weights=W)\n","out = M.forward(X)\n","out"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"-v0D4QMIj1zH","executionInfo":{"status":"ok","timestamp":1687387986260,"user_tz":-60,"elapsed":4,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"03245972-e16e-4cd8-e5ea-14eb36aac935"},"execution_count":236,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-0.71674168],\n"," [ 0.64784656],\n"," [-0.81703373],\n"," [ 1.89943266]])"]},"metadata":{},"execution_count":236}]},{"cell_type":"code","source":["M"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"z8ocMfPXkEgy","executionInfo":{"status":"ok","timestamp":1687387987145,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"380a1668-49d6-4205-97e3-0c10299069d5"},"execution_count":237,"outputs":[{"output_type":"execute_result","data":{"text/plain":["DotProduct"]},"metadata":{},"execution_count":237}]},{"cell_type":"code","source":["d_out = np.random.randn(4, 1)\n","d_out"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nW3vfrDGkHee","executionInfo":{"status":"ok","timestamp":1687387987724,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"a28f2605-9319-41c1-c4a8-d2ad3d2a33a4"},"execution_count":238,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 1.52302986],\n"," [-0.23415337],\n"," [-0.23413696],\n"," [ 1.57921282]])"]},"metadata":{},"execution_count":238}]},{"cell_type":"code","source":["M.backward(d_out)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"M_NNDC2ikahu","executionInfo":{"status":"ok","timestamp":1687387989009,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"781685e6-6f7c-413d-bd10-c3b1caa4f4a6"},"execution_count":239,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 0.75651048, -0.21058066, 0.98644898],\n"," [-0.11630729, 0.03237505, -0.15165846],\n"," [-0.11629914, 0.03237278, -0.15164782],\n"," [ 0.78441735, -0.21834875, 1.02283804]])"]},"metadata":{},"execution_count":239}]},{"cell_type":"markdown","source":["# La classe ADD"],"metadata":{"id":"hCdAVoDwlY3Y"}},{"cell_type":"code","source":["class Add(BoiteParam):\n","\n"," def __init__(self, biais):\n"," super().__init__(biais)\n","\n"," def operation(self):\n"," return self.inputs + self.param\n","\n"," def gradient(self, derivee_output):\n"," return np.ones_like(self.inputs) * derivee_output\n","\n"," def gradient_param(self, derivee_output):\n"," r = np.ones_like(self.param) * derivee_output\n"," return r.sum(axis=0).reshape(1, self.param.shape[1])\n","\n"," def __repr__(self):\n"," return \"AddBiais\""],"metadata":{"id":"CCIbOH5XkdsV","executionInfo":{"status":"ok","timestamp":1687388836047,"user_tz":-60,"elapsed":913,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":306,"outputs":[]},{"cell_type":"code","source":["\n","B = np.random.rand(1, 1)\n","B"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Fbl0R6csmBKP","executionInfo":{"status":"ok","timestamp":1687388837998,"user_tz":-60,"elapsed":4,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"1dc2f267-00a0-4de6-f1ef-e4b5bcce7337"},"execution_count":307,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[0.15601864]])"]},"metadata":{},"execution_count":307}]},{"cell_type":"code","source":["b = Add(biais=B)\n","b"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"8LJMlXg3mZ0i","executionInfo":{"status":"ok","timestamp":1687387993785,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"f41b2c71-cfb0-4494-943f-2e1f0ca58422"},"execution_count":242,"outputs":[{"output_type":"execute_result","data":{"text/plain":["AddBiais"]},"metadata":{},"execution_count":242}]},{"cell_type":"code","source":["out_b = b.forward(out)\n","out_b"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"EDL9Js2tmgL9","executionInfo":{"status":"ok","timestamp":1687387994348,"user_tz":-60,"elapsed":5,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"cf149898-c7c4-4c3d-c780-d02dccc70f14"},"execution_count":243,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-0.69615719],\n"," [ 0.66843105],\n"," [-0.79644924],\n"," [ 1.92001715]])"]},"metadata":{},"execution_count":243}]},{"cell_type":"code","source":["d_out"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"K0YiOGLhmmAU","executionInfo":{"status":"ok","timestamp":1687387995396,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"6df860f0-89b6-49f7-bb28-593b3939478a"},"execution_count":244,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 1.52302986],\n"," [-0.23415337],\n"," [-0.23413696],\n"," [ 1.57921282]])"]},"metadata":{},"execution_count":244}]},{"cell_type":"code","source":["b.backward(d_out)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"GRWbVaOdmvnD","executionInfo":{"status":"ok","timestamp":1687387996299,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"0244eb73-c7c3-4e29-aa25-664aedbc6302"},"execution_count":245,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 1.52302986],\n"," [-0.23415337],\n"," [-0.23413696],\n"," [ 1.57921282]])"]},"metadata":{},"execution_count":245}]},{"cell_type":"markdown","source":["# La classe Sigmoid"],"metadata":{"id":"4O_Gztx2nexA"}},{"cell_type":"code","source":["class Sigmoid(Boite):\n","\n"," def __init__(self):\n"," super().__init__()\n","\n"," def operation(self):\n"," return 1 / (1 + np.exp(-1 * self.inputs))\n","\n"," def gradient(self, derivee_output):\n"," return self.output * (1 - self.output) * derivee_output\n","\n"," def __repr__(self):\n"," return \"sigmoid\""],"metadata":{"id":"x2v8AHH1mzXx","executionInfo":{"status":"ok","timestamp":1687392444134,"user_tz":-60,"elapsed":464,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":422,"outputs":[]},{"cell_type":"code","source":["sig = Sigmoid()"],"metadata":{"id":"_q-CdGHzoRyr","executionInfo":{"status":"ok","timestamp":1687387998941,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":247,"outputs":[]},{"cell_type":"code","source":["sig_out = sig.forward(out_b)\n","sig_out"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"xiLYgEBroeX-","executionInfo":{"status":"ok","timestamp":1687387999461,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"bbb95eab-61e5-44e4-9ce7-9ae555ca0369"},"execution_count":248,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[0.33266478],\n"," [0.66115176],\n"," [0.31078557],\n"," [0.87214035]])"]},"metadata":{},"execution_count":248}]},{"cell_type":"code","source":["sig.backward(d_out)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"zDmURwKyoiwE","executionInfo":{"status":"ok","timestamp":1687388001611,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"1899ccdb-4675-43dd-c8b7-10e86f606e3e"},"execution_count":249,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 0.33811099],\n"," [-0.05245741],\n"," [-0.05015164],\n"," [ 0.17610049]])"]},"metadata":{},"execution_count":249}]},{"cell_type":"markdown","source":["# La classe Loss"],"metadata":{"id":"7t-HDIwHpD7L"}},{"cell_type":"code","source":["class Loss():\n","\n"," def __init__(self):\n"," pass\n","\n"," def forward(self, prediction, target):\n"," assert prediction.shape == target.shape, f\"Prediction shape {prediction.shape} Target shape {target.shape}\"\n"," self.prediction = prediction\n"," self.target = target\n"," loss = np.mean((self.target - self.prediction) ** 2)\n"," return loss\n","\n"," def backward(self):\n","\n"," self.loss_derivee = -2 * (self.target - self.prediction)\n"," assert self.loss_derivee.shape == self.prediction.shape, f\"La derivee du loss un shape {self.loss_derivee.shape } et different du shape de Prediction : {self.prediction.shape}\"\n","\n"," return self.loss_derivee\n","\n","\n","\n","\n"],"metadata":{"id":"76THFCNOo2hf","executionInfo":{"status":"ok","timestamp":1687388843968,"user_tz":-60,"elapsed":834,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":309,"outputs":[]},{"cell_type":"code","source":["X"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tMlcLYJuqu1W","executionInfo":{"status":"ok","timestamp":1687388007238,"user_tz":-60,"elapsed":513,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"861ab6fd-e306-4d55-8915-ec1c60237a73"},"execution_count":251,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 2, 3, -2],\n"," [ 4, 5, -1],\n"," [-5, 2, 3],\n"," [ 0, 5, 4]])"]},"metadata":{},"execution_count":251}]},{"cell_type":"code","source":["Y = np.random.randn(4, 1)\n","Y"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"XLU5_s3FqqAi","executionInfo":{"status":"ok","timestamp":1687388849267,"user_tz":-60,"elapsed":392,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"5ba865dc-20a1-4ece-e9dc-2710bd4526b9"},"execution_count":310,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 1.52302986],\n"," [ 0.27904129],\n"," [ 1.01051528],\n"," [-0.58087813]])"]},"metadata":{},"execution_count":310}]},{"cell_type":"code","source":["P = sig_out"],"metadata":{"id":"wPNTTwgwqzwZ","executionInfo":{"status":"ok","timestamp":1687388851449,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":311,"outputs":[]},{"cell_type":"code","source":["mse = Loss()"],"metadata":{"id":"ffvXTFltq4xw","executionInfo":{"status":"ok","timestamp":1687388851968,"user_tz":-60,"elapsed":7,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":312,"outputs":[]},{"cell_type":"code","source":["mse.forward(P, Y)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"VkdX8tkPq640","executionInfo":{"status":"ok","timestamp":1687388851969,"user_tz":-60,"elapsed":7,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"ff95a943-3d52-412a-ff40-6e3a35bc9ca8"},"execution_count":313,"outputs":[{"output_type":"execute_result","data":{"text/plain":["1.0409654495073746"]},"metadata":{},"execution_count":313}]},{"cell_type":"code","source":["mse.backward()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"rtPshNcMq-VU","executionInfo":{"status":"ok","timestamp":1687388855114,"user_tz":-60,"elapsed":522,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"3ed84c94-68ab-4b7e-d106-4a83df8f0520"},"execution_count":314,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-2.38073015],\n"," [ 0.76422093],\n"," [-1.39945942],\n"," [ 2.90603696]])"]},"metadata":{},"execution_count":314}]},{"cell_type":"markdown","source":["# La Classe Dense"],"metadata":{"id":"tyW04IkDts4V"}},{"cell_type":"code","source":["class Dense():\n","\n"," def __init__(self, neurons, activation=None):\n"," self.neurons = neurons\n"," self.activation = activation\n"," self.params = []\n"," self.suite = []\n"," self.initialisation = True\n","\n","\n"," def build(self, inputs):\n"," # weights initialization\n"," np.random.seed(42)\n","\n"," self.weights = np.random.randn(inputs.shape[1], self.neurons)\n"," self.biais = np.random.randn(1, self.neurons)\n","\n"," self.params.append(self.weights)\n"," self.params.append(self.biais)\n","\n"," # construction de la suite d'opération\n"," self.suite = [Dot(weights=self.params[0]), Add(biais=self.params[1])]\n"," if self.activation:\n"," self.suite.append(self.activation)\n","\n","\n","\n"," def forward(self, inputs):\n"," if self.initialisation:\n"," self.build(inputs)\n"," self.initialisation = False\n","\n"," for boite in self.suite:\n"," inputs = boite.forward(inputs)\n","\n"," self.output = inputs\n","\n"," return self.output\n","\n","\n"," def backward(self, derivee_output):\n"," assert derivee_output.shape == self.output.shape\n","\n"," for boite in reversed(self.suite):\n"," derivee_output = boite.backward(derivee_output)\n","\n"," derivee_inputs = derivee_output\n","\n"," self.get_layer_gradients()\n","\n"," return derivee_inputs\n","\n"," def get_layer_gradients(self):\n","\n"," self.derivee_params = []\n","\n"," for boite in self.suite:\n"," if issubclass(boite.__class__, BoiteParam):\n"," self.derivee_params.append(boite.derivee_param)\n","\n","\n","\n"," def __repr__(self):\n"," r = f\"DenseLayer(neurons={self.neurons})\"\n"," if self.activation:\n"," r += \" avec Sigmoid\"\n","\n"," return r\n","\n","\n"],"metadata":{"id":"RAVfMX1SrBbG","executionInfo":{"status":"ok","timestamp":1687392440527,"user_tz":-60,"elapsed":448,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":421,"outputs":[]},{"cell_type":"code","source":["sigmoid = Sigmoid()"],"metadata":{"id":"AmyOHtSs0L5c","executionInfo":{"status":"ok","timestamp":1687388866983,"user_tz":-60,"elapsed":412,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":316,"outputs":[]},{"cell_type":"code","source":["couche = Dense(neurons=2, activation=sigmoid)"],"metadata":{"id":"Khx1pGgC0Ddt","executionInfo":{"status":"ok","timestamp":1687388867694,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":317,"outputs":[]},{"cell_type":"code","source":["couche"],"metadata":{"id":"TRACwiapuBS-","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1687388868296,"user_tz":-60,"elapsed":6,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"7d3ca868-bac0-4a9b-e941-12672bf3ae1a"},"execution_count":318,"outputs":[{"output_type":"execute_result","data":{"text/plain":["DenseLayer(neurons=2) avec Sigmoid"]},"metadata":{},"execution_count":318}]},{"cell_type":"code","source":["X"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"xNsEoApYy6Wt","executionInfo":{"status":"ok","timestamp":1687388869506,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"3e87e243-f091-4045-9c12-2aea2c20a147"},"execution_count":319,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 2, 3, -2],\n"," [ 4, 5, -1],\n"," [-5, 2, 3],\n"," [ 0, 5, 4]])"]},"metadata":{},"execution_count":319}]},{"cell_type":"code","source":["couche.forward(X)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"YFhSB16p0XIM","executionInfo":{"status":"ok","timestamp":1687388873818,"user_tz":-60,"elapsed":1223,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"7a2252b8-b6f4-4f2f-84b9-0e76dd871e2f"},"execution_count":320,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[0.99320003, 0.99604286],\n"," [0.99912347, 0.99968533],\n"," [0.42276305, 0.97817014],\n"," [0.97978765, 0.99941659]])"]},"metadata":{},"execution_count":320}]},{"cell_type":"code","source":["couche.params"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"glLf10UP0rCJ","executionInfo":{"status":"ok","timestamp":1687388877018,"user_tz":-60,"elapsed":4,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"cfc4f8ca-78bf-4f9f-e2dd-72ddb87004e2"},"execution_count":321,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[array([[ 0.49671415, -0.1382643 ],\n"," [ 0.64768854, 1.52302986],\n"," [-0.23415337, -0.23413696]]),\n"," array([[1.57921282, 0.76743473]])]"]},"metadata":{},"execution_count":321}]},{"cell_type":"code","source":["d_out = np.random.randn(4, 2)\n","d_out"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ZJTw4mSO0ugc","executionInfo":{"status":"ok","timestamp":1687388022345,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"72b35b0f-88a6-46d1-ff96-b5a3c4f71299"},"execution_count":264,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-0.46947439, 0.54256004],\n"," [-0.46341769, -0.46572975],\n"," [ 0.24196227, -1.91328024],\n"," [-1.72491783, -0.56228753]])"]},"metadata":{},"execution_count":264}]},{"cell_type":"code","source":["couche.backward(d_out)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"bbOZbASt1BSI","executionInfo":{"status":"ok","timestamp":1687388024543,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"10e90b06-b088-4c2e-a10c-28213504e588"},"execution_count":265,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-0.00187061, 0.00120335, 0.00024173],\n"," [-0.00018133, -0.00048599, 0.00012933],\n"," [ 0.03497832, -0.02397904, -0.00426045],\n"," [-0.0169224 , -0.02262434, 0.00807543]])"]},"metadata":{},"execution_count":265}]},{"cell_type":"code","source":["couche.suite"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ZiUtTJyP1H78","executionInfo":{"status":"ok","timestamp":1687388026878,"user_tz":-60,"elapsed":928,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"3dbf3677-d3b5-4cb8-df74-2fac9cc0f15f"},"execution_count":266,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[DotProduct, AddBiais, sigmoid]"]},"metadata":{},"execution_count":266}]},{"cell_type":"markdown","source":["# La classe Model"],"metadata":{"id":"RnBMDZSF2qco"}},{"cell_type":"code","source":["from copy import deepcopy"],"metadata":{"id":"wIeY_EiRerby","executionInfo":{"status":"ok","timestamp":1687393350529,"user_tz":-60,"elapsed":414,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":451,"outputs":[]},{"cell_type":"code","source":["class Model():\n","\n"," def __init__(self, layers):\n"," self.layers = layers\n"," self.compiled = False\n","\n","\n"," def forward(self, inputs):\n","\n","\n"," for layer in self.layers:\n","\n"," inputs = layer.forward(inputs)\n"," self.output = inputs\n"," return self.output\n","\n","\n"," def backward(self, loss_derivee):\n","\n"," assert loss_derivee.shape == self.output.shape\n","\n"," for layer in reversed(self.layers):\n"," loss_derivee = layer.backward(loss_derivee)\n","\n"," return None\n","\n"," def get_params(self):\n"," for layer in self.layers:\n"," yield from layer.params\n","\n","\n"," def get_derivee_params(self):\n"," for layer in self.layers:\n"," yield from layer.derivee_params\n","\n","\n"," def update(self):\n","\n"," for (param, derivee_param) in zip(self.get_params(), self.get_derivee_params()):\n"," assert param.shape == derivee_param.shape\n"," param -= self.learning_rate * derivee_param\n","\n","\n"," def compile(self, loss, learning_rate):\n"," self.loss = loss\n"," self.learning_rate = learning_rate\n"," self.compiled = True\n","\n","\n"," def fit(self, X, Y, epochs, validation_data=None):\n","\n"," if validation_data:\n"," assert len(validation_data) == 2\n"," assert validation_data[0].shape[1] == X.shape[1]\n"," assert validation_data[1].shape[1] == Y.shape[1]\n","\n"," self.history = {\"loss\":[]}\n"," if validation_data:\n"," self.history['val_loss'] = []\n","\n","\n"," if not self.compiled:\n"," raise NotImplementedError(\"Pas de loss et de learning_rate: Compilez\")\n","\n"," for epoch in range(epochs):\n"," # forward pass\n"," predictions = model.forward(X)\n"," loss = self.loss.forward(predictions, Y)\n"," self.history['loss'].append(loss)\n","\n","\n"," # val loss\n"," if validation_data:\n"," val_preds = model.forward(validation_data[0])\n"," val_loss = self.loss.forward(val_preds, validation_data[1])\n"," self.history['val_loss'].append(val_loss)\n","\n"," log = f'Epoch {epoch+1} .............. loss : {loss}'\n"," if validation_data:\n"," log += f\" ....val_loss : {val_loss}\"\n"," print(log)\n","\n","\n","\n"," # backward pass\n"," loss_derivee = self.loss.backward()\n"," self.backward(loss_derivee)\n","\n"," # update\n"," self.update()\n","\n"," return self.history\n","\n"," def save_model(self, file):\n"," model_save = deepcopy(self)\n","\n"," import pickle\n"," with open(file, \"wb\") as f:\n"," pickle.dump(model_save, f)\n","\n","\n"," def __repr__(self):\n","\n"," r = \"Layers .................\"\n"," for layer in self.layers:\n"," r += f\" \\n {str(layer)}\"\n","\n"," return r\n","\n","\n"],"metadata":{"id":"9AlQAwxh1LHm","executionInfo":{"status":"ok","timestamp":1687393497452,"user_tz":-60,"elapsed":380,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":454,"outputs":[]},{"cell_type":"code","source":["model = Model(layers = [ Dense(neurons=3, activation=sigmoid),\n"," Dense(neurons=1)])"],"metadata":{"id":"MRAtYdS23VB1","executionInfo":{"status":"ok","timestamp":1687388953156,"user_tz":-60,"elapsed":556,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":326,"outputs":[]},{"cell_type":"code","source":["model"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"FMA6qXMQ4Zzg","executionInfo":{"status":"ok","timestamp":1687388954057,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"43bcc3cd-9331-4e09-86a4-9aa993eb7fdd"},"execution_count":327,"outputs":[{"output_type":"execute_result","data":{"text/plain":["Layers ................. \n"," DenseLayer(neurons=3) avec Sigmoid \n"," DenseLayer(neurons=1)"]},"metadata":{},"execution_count":327}]},{"cell_type":"code","source":["X"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"DtXdTjHX4avb","executionInfo":{"status":"ok","timestamp":1687388955119,"user_tz":-60,"elapsed":5,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"a44658d1-0387-45a8-c434-193d4f5ba612"},"execution_count":328,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 2, 3, -2],\n"," [ 4, 5, -1],\n"," [-5, 2, 3],\n"," [ 0, 5, 4]])"]},"metadata":{},"execution_count":328}]},{"cell_type":"code","source":["Y"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"JPgUWnTO4hhO","executionInfo":{"status":"ok","timestamp":1687388955970,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"0ff50d0e-419d-4bfb-9a8d-5ef738fa55c4"},"execution_count":329,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 1.52302986],\n"," [ 0.27904129],\n"," [ 1.01051528],\n"," [-0.58087813]])"]},"metadata":{},"execution_count":329}]},{"cell_type":"code","source":["model.forward(X)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"clMMuqNT4jpg","executionInfo":{"status":"ok","timestamp":1687388956528,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"8e7f58f6-ba93-4c6b-ae9a-9104fe7e5c4c"},"execution_count":330,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[2.47005633],\n"," [2.53479834],\n"," [1.89807891],\n"," [1.92678186]])"]},"metadata":{},"execution_count":330}]},{"cell_type":"code","source":["loss_derivee = np.random.randn(4, 1)\n","loss_derivee"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"inVYjF6R4mgG","executionInfo":{"status":"ok","timestamp":1687388959934,"user_tz":-60,"elapsed":784,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"bffef576-e2d7-44f2-b0ee-9a87ac7bdb32"},"execution_count":331,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-0.23415337],\n"," [-0.23413696],\n"," [ 1.57921282],\n"," [ 0.76743473]])"]},"metadata":{},"execution_count":331}]},{"cell_type":"code","source":["model.backward(loss_derivee)"],"metadata":{"id":"Ir1dYOj84vP1","executionInfo":{"status":"ok","timestamp":1687388961289,"user_tz":-60,"elapsed":1,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":332,"outputs":[]},{"cell_type":"code","source":["model.get_params()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"dijAWVTA-Q0a","executionInfo":{"status":"ok","timestamp":1687388962786,"user_tz":-60,"elapsed":6,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"52bcd33d-b2dd-4786-f2d4-4071489bcc92"},"execution_count":333,"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":333}]},{"cell_type":"code","source":["model.get_derivee_params()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"AFcqd1YC-RKl","executionInfo":{"status":"ok","timestamp":1687388964319,"user_tz":-60,"elapsed":4,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"92d90cd8-aa7d-480e-f4da-27cb51d954c2"},"execution_count":334,"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":334}]},{"cell_type":"markdown","source":["# Update des paramètres"],"metadata":{"id":"AxUR5XBm6CKi"}},{"cell_type":"code","source":["M"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"6Fw7biGb6Xl9","executionInfo":{"status":"ok","timestamp":1687388967627,"user_tz":-60,"elapsed":469,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"ced7e56a-1c11-4f9d-b49a-f85231af7173"},"execution_count":335,"outputs":[{"output_type":"execute_result","data":{"text/plain":["DotProduct"]},"metadata":{},"execution_count":335}]},{"cell_type":"code","source":["issubclass(M.__class__, BoiteParam)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"owmo8Idu7zMu","executionInfo":{"status":"ok","timestamp":1687388967628,"user_tz":-60,"elapsed":6,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"4f54918d-0353-42c5-bfe2-85da9af5a3e3"},"execution_count":336,"outputs":[{"output_type":"execute_result","data":{"text/plain":["False"]},"metadata":{},"execution_count":336}]},{"cell_type":"code","source":["M.__class__"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"k72CYUW17vBv","executionInfo":{"status":"ok","timestamp":1687388968111,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"1a84f3c0-0954-4815-d663-39b79d934633"},"execution_count":337,"outputs":[{"output_type":"execute_result","data":{"text/plain":["__main__.Dot"]},"metadata":{},"execution_count":337}]},{"cell_type":"code","source":["M.param"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"DnCnHh4H6Z75","executionInfo":{"status":"ok","timestamp":1687388968505,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"97e1c763-5275-409f-e480-0ec5bdcaa381"},"execution_count":338,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 0.49671415],\n"," [-0.1382643 ],\n"," [ 0.64768854]])"]},"metadata":{},"execution_count":338}]},{"cell_type":"code","source":["M.derivee_inputs"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"4hfwXK2o6Zja","executionInfo":{"status":"ok","timestamp":1687388970116,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"cf67017e-b85f-4c3f-e10e-0e63f4530bad"},"execution_count":339,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 0.75651048, -0.21058066, 0.98644898],\n"," [-0.11630729, 0.03237505, -0.15165846],\n"," [-0.11629914, 0.03237278, -0.15164782],\n"," [ 0.78441735, -0.21834875, 1.02283804]])"]},"metadata":{},"execution_count":339}]},{"cell_type":"code","source":["couche.params"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"mhJRmt5P6rj6","executionInfo":{"status":"ok","timestamp":1687388970593,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"561949a1-cbe3-497b-fbfb-eff5bdb95822"},"execution_count":340,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[array([[ 0.49671415, -0.1382643 ],\n"," [ 0.64768854, 1.52302986],\n"," [-0.23415337, -0.23413696]]),\n"," array([[1.57921282, 0.76743473]])]"]},"metadata":{},"execution_count":340}]},{"cell_type":"code","source":["couche.derivee_params"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":166},"id":"-lVwnct56rSS","executionInfo":{"status":"error","timestamp":1687388971820,"user_tz":-60,"elapsed":5,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"b39b524a-6e9f-4134-8c6c-974883d3519b"},"execution_count":341,"outputs":[{"output_type":"error","ename":"AttributeError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcouche\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mderivee_params\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;31mAttributeError\u001b[0m: 'Dense' object has no attribute 'derivee_params'"]}]},{"cell_type":"code","source":[],"metadata":{"id":"m5r00F5h60rm"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["model = Model(layers = [ Dense(neurons=2, activation=sigmoid),\n"," Dense(neurons=1)])\n","#forward\n","P = model.forward(X)\n","mse = Loss()\n","loss = mse.forward(P, Y)\n","print(loss)\n","#backward\n","loss_derivee = mse.backward()\n","model.backward(loss_derivee)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"39vyMOtD_p7I","executionInfo":{"status":"ok","timestamp":1687389326042,"user_tz":-60,"elapsed":521,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"befb8df6-bc67-40cf-e069-c9e3b0d5f136"},"execution_count":356,"outputs":[{"output_type":"stream","name":"stdout","text":["0.842077961233807\n"]}]},{"cell_type":"code","source":["model.update()"],"metadata":{"id":"QFwIqqpSBNy-","executionInfo":{"status":"ok","timestamp":1687389352610,"user_tz":-60,"elapsed":375,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":361,"outputs":[]},{"cell_type":"code","source":["P = model.forward(X)\n","mse = Loss()\n","loss = mse.forward(P, Y)\n","print(loss)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"x7sg7A3jCSay","executionInfo":{"status":"ok","timestamp":1687389355402,"user_tz":-60,"elapsed":945,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"6e904ce9-45fa-4b97-f956-0d3fdae67d34"},"execution_count":362,"outputs":[{"output_type":"stream","name":"stdout","text":["0.6952654031037216\n"]}]},{"cell_type":"code","source":["P"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"pM52nFBfCSTf","executionInfo":{"status":"ok","timestamp":1687369543144,"user_tz":-60,"elapsed":465,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"08cc8bb2-1f9f-458e-ebf3-d9bb5406b8cc"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 2, 3, -2],\n"," [ 4, 5, -1],\n"," [-5, 2, 3],\n"," [ 0, 5, 4]])"]},"metadata":{},"execution_count":187}]},{"cell_type":"code","source":["X"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"-lZRh2N0D_Z8","executionInfo":{"status":"ok","timestamp":1687369549732,"user_tz":-60,"elapsed":362,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"090cd283-515c-4c53-f233-448c472232cb"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 2, 3, -2],\n"," [ 4, 5, -1],\n"," [-5, 2, 3],\n"," [ 0, 5, 4]])"]},"metadata":{},"execution_count":188}]},{"cell_type":"code","source":["model.forward(X)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"j3OqP1JfCSLN","executionInfo":{"status":"ok","timestamp":1687369789158,"user_tz":-60,"elapsed":361,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"fbf4581d-a071-44c5-f592-1b89b24a377e"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 2, 3, -2],\n"," [ 4, 5, -1],\n"," [-5, 2, 3],\n"," [ 0, 5, 4]])"]},"metadata":{},"execution_count":200}]},{"cell_type":"code","source":["model.layers[1].params"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"IIR-ubh9CSCS","executionInfo":{"status":"ok","timestamp":1687369436833,"user_tz":-60,"elapsed":481,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"ae8fdb07-978f-4644-b3df-7d8a5348d674"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[array([[ 0.49671415],\n"," [-0.1382643 ],\n"," [ 0.64768854]]),\n"," array([[1.52302986]])]"]},"metadata":{},"execution_count":182}]},{"cell_type":"code","source":[],"metadata":{"id":"LOiOIVTEB9lZ"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# Test de la fonction fit"],"metadata":{"id":"gg5wBZ4ER5v2"}},{"cell_type":"code","source":["model = Model(layers = [ Dense(neurons=2, activation=sigmoid),\n"," Dense(neurons=1)])\n","mse = Loss()\n","model.compile(loss=mse, learning_rate=0.01)\n","h = model.fit(X, Y, epochs=10)\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"DUqiq7JVR8Cp","executionInfo":{"status":"ok","timestamp":1687390173716,"user_tz":-60,"elapsed":497,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"14b839b3-265d-4bba-f355-0ec7ab3fc98e"},"execution_count":371,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1 .............. loss : 0.842077961233807\n","Epoch 2 .............. loss : 0.7777763005223045\n","Epoch 3 .............. loss : 0.7378092038206442\n","Epoch 4 .............. loss : 0.7127364993320435\n","Epoch 5 .............. loss : 0.6967967141402815\n","Epoch 6 .............. loss : 0.6864678726180334\n","Epoch 7 .............. loss : 0.6795949011879614\n","Epoch 8 .............. loss : 0.6748583180356648\n","Epoch 9 .............. loss : 0.6714498781367876\n","Epoch 10 .............. loss : 0.6688742506264982\n"]}]},{"cell_type":"markdown","source":["# Comparaison Tensorflow"],"metadata":{"id":"o9j7MxEvSzFA"}},{"cell_type":"code","source":["import tensorflow as tf\n","from tensorflow.keras.models import Sequential\n","from tensorflow.keras.layers import Dense\n","from tensorflow.keras.optimizers import SGD\n","\n","model = Sequential([Dense(units=2, activation='sigmoid'),\n"," Dense(units=1)])\n","model.compile(optimizer=SGD(learning_rate=0.1), loss='mse')\n","history = model.fit(X, Y, epochs=10)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"o2d5rlEGSG2v","executionInfo":{"status":"ok","timestamp":1687390368892,"user_tz":-60,"elapsed":5270,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"3db5128d-ce7b-4318-b255-1ccef276551c"},"execution_count":372,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/10\n","1/1 [==============================] - 1s 670ms/step - loss: 0.6090\n","Epoch 2/10\n","1/1 [==============================] - 0s 8ms/step - loss: 0.5552\n","Epoch 3/10\n","1/1 [==============================] - 0s 11ms/step - loss: 0.5371\n","Epoch 4/10\n","1/1 [==============================] - 0s 9ms/step - loss: 0.5276\n","Epoch 5/10\n","1/1 [==============================] - 0s 9ms/step - loss: 0.5204\n","Epoch 6/10\n","1/1 [==============================] - 0s 9ms/step - loss: 0.5139\n","Epoch 7/10\n","1/1 [==============================] - 0s 11ms/step - loss: 0.5078\n","Epoch 8/10\n","1/1 [==============================] - 0s 8ms/step - loss: 0.5019\n","Epoch 9/10\n","1/1 [==============================] - 0s 9ms/step - loss: 0.4963\n","Epoch 10/10\n","1/1 [==============================] - 0s 8ms/step - loss: 0.4908\n"]}]},{"cell_type":"code","source":["??Sequential"],"metadata":{"id":"nZm1MFmWTZuR","executionInfo":{"status":"ok","timestamp":1687390428403,"user_tz":-60,"elapsed":543,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":373,"outputs":[]},{"cell_type":"markdown","source":["# Validation"],"metadata":{"id":"zblJpIGTWOyn"}},{"cell_type":"code","source":["model = Model(layers = [ Dense(neurons=2, activation=sigmoid),\n"," Dense(neurons=1)])\n","mse = Loss()\n","model.compile(loss=mse, learning_rate=0.01)\n","h = model.fit(X, Y, epochs=10, validation_data=(X, Y))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"MtRdtc2aTpi3","executionInfo":{"status":"ok","timestamp":1687391187450,"user_tz":-60,"elapsed":574,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"e82f2371-100c-4cf0-b8b8-e669ae2dc7fd"},"execution_count":379,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1 .............. loss : 0.842077961233807 ....val_loss : 0.842077961233807\n","Epoch 2 .............. loss : 0.7777763005223045 ....val_loss : 0.7777763005223045\n","Epoch 3 .............. loss : 0.7378092038206442 ....val_loss : 0.7378092038206442\n","Epoch 4 .............. loss : 0.7127364993320435 ....val_loss : 0.7127364993320435\n","Epoch 5 .............. loss : 0.6967967141402815 ....val_loss : 0.6967967141402815\n","Epoch 6 .............. loss : 0.6864678726180334 ....val_loss : 0.6864678726180334\n","Epoch 7 .............. loss : 0.6795949011879614 ....val_loss : 0.6795949011879614\n","Epoch 8 .............. loss : 0.6748583180356648 ....val_loss : 0.6748583180356648\n","Epoch 9 .............. loss : 0.6714498781367876 ....val_loss : 0.6714498781367876\n","Epoch 10 .............. loss : 0.6688742506264982 ....val_loss : 0.6688742506264982\n"]}]},{"cell_type":"markdown","source":["# Test du code final sur le boston dataset"],"metadata":{"id":"zgt9tphxWtGC"}},{"cell_type":"code","source":["import pandas as pd\n","import numpy as np\n","\n","data_url = \"http://lib.stat.cmu.edu/datasets/boston\"\n","raw_df = pd.read_csv(data_url, sep=\"\\s+\", skiprows=22, header=None)\n","data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])\n","target = raw_df.values[1::2, 2]\n","data = data\n","target = target\n","\n","X = data\n","Y = target.reshape((506, 1))\n","\n","from sklearn.model_selection import train_test_split\n","X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.25, random_state=0)\n","\n","from sklearn.preprocessing import StandardScaler\n","scaler = StandardScaler()\n","X_train = scaler.fit_transform(X_train)\n","X_test = scaler.transform(X_test)"],"metadata":{"id":"mgpj1WeQWbW4","executionInfo":{"status":"ok","timestamp":1687391318497,"user_tz":-60,"elapsed":2331,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":380,"outputs":[]},{"cell_type":"code","source":["X_train.shape, y_train.shape"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"waVJvouyXCWw","executionInfo":{"status":"ok","timestamp":1687391339511,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"159589eb-a58d-4350-f1c5-4e150221c4d7"},"execution_count":382,"outputs":[{"output_type":"execute_result","data":{"text/plain":["((379, 13), (379, 1))"]},"metadata":{},"execution_count":382}]},{"cell_type":"code","source":["X_test.shape, y_test.shape"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"HulBlSzZXF6E","executionInfo":{"status":"ok","timestamp":1687391354808,"user_tz":-60,"elapsed":5,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"ff07a682-7383-42f8-a1ac-8baa8880ac4a"},"execution_count":383,"outputs":[{"output_type":"execute_result","data":{"text/plain":["((127, 13), (127, 1))"]},"metadata":{},"execution_count":383}]},{"cell_type":"markdown","source":["## Regression linéaire simple"],"metadata":{"id":"taFtZbqEXR5R"}},{"cell_type":"code","source":["model = Model([ Dense(neurons=1)])\n","mse = Loss()\n","model.compile(loss=mse, learning_rate=0.001)\n","h = model.fit(X_train, y_train, epochs=30, validation_data=(X_test, y_test))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"pKYLFTtfXL0F","executionInfo":{"status":"ok","timestamp":1687391646275,"user_tz":-60,"elapsed":444,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"3b8e6585-be29-4de4-87e7-a13baaf6aea9"},"execution_count":390,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1 .............. loss : 712.1743316753176 ....val_loss : 671.7547143671588\n","Epoch 2 .............. loss : 384.0837028693358 ....val_loss : 383.82786822291087\n","Epoch 3 .............. loss : 247.75414344252928 ....val_loss : 229.1941295737599\n","Epoch 4 .............. loss : 148.3806303920543 ....val_loss : 144.19534190777878\n","Epoch 5 .............. loss : 103.89520896898965 ....val_loss : 96.47739842280843\n","Epoch 6 .............. loss : 71.33479105168065 ....val_loss : 69.15302180485378\n","Epoch 7 .............. loss : 55.97937743045081 ....val_loss : 53.20253156199875\n","Epoch 8 .............. loss : 44.69041961018085 ....val_loss : 43.70966230146516\n","Epoch 9 .............. loss : 39.11541183660613 ....val_loss : 37.94536623883121\n","Epoch 10 .............. loss : 35.00552004305203 ....val_loss : 34.3691118394618\n","Epoch 11 .............. loss : 32.86685286102087 ....val_loss : 32.09754754821056\n","Epoch 12 .............. loss : 31.27998033095609 ....val_loss : 30.616578716256143\n","Epoch 13 .............. loss : 30.39111885607059 ....val_loss : 29.622717392182356\n","Epoch 14 .............. loss : 29.716242894637325 ....val_loss : 28.93430154637416\n","Epoch 15 .............. loss : 29.293243882027436 ....val_loss : 28.44108945283857\n","Epoch 16 .............. loss : 28.95482063865208 ....val_loss : 28.075249108343932\n","Epoch 17 .............. loss : 28.7089786277432 ....val_loss : 27.79444481334606\n","Epoch 18 .............. loss : 28.497466286622565 ....val_loss : 27.571855135441425\n","Epoch 19 .............. loss : 28.321231946325064 ....val_loss : 27.390212568490785\n","Epoch 20 .............. loss : 28.160012267263177 ....val_loss : 27.238204534604474\n","Epoch 21 .............. loss : 28.013601705576395 ....val_loss : 27.10827654993127\n","Epoch 22 .............. loss : 27.875042004989993 ....val_loss : 26.995276952012357\n","Epoch 23 .............. loss : 27.74416729188687 ....val_loss : 26.895611914363833\n","Epoch 24 .............. loss : 27.618652933103757 ....val_loss : 26.806712942523752\n","Epoch 25 .............. loss : 27.498454618593712 ....val_loss : 26.726697569350943\n","Epoch 26 .............. loss : 27.382818478029847 ....val_loss : 26.654150638874846\n","Epoch 27 .............. loss : 27.271736860497047 ....val_loss : 26.587981576323592\n","Epoch 28 .............. loss : 27.16495168322497 ....val_loss : 26.527330004354646\n","Epoch 29 .............. loss : 27.062434602101924 ....val_loss : 26.471502428119276\n","Epoch 30 .............. loss : 26.9640574302144 ....val_loss : 26.419929095745758\n"]}]},{"cell_type":"code","source":["h.keys()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"AC4Z4TujX5Lz","executionInfo":{"status":"ok","timestamp":1687391667606,"user_tz":-60,"elapsed":2,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"07755b56-a68c-441d-f6bf-002c563bd6e4"},"execution_count":392,"outputs":[{"output_type":"execute_result","data":{"text/plain":["dict_keys(['loss', 'val_loss'])"]},"metadata":{},"execution_count":392}]},{"cell_type":"code","source":["import matplotlib.pyplot as plt\n","\n","def plot_learning_curve(history):\n","\n","\n"," plt.plot(list(range(len(history['loss']))), history['loss'])\n"," plt.plot(list(range(len(history['val_loss']))), history['val_loss'])\n"," plt.xlabel('Epochs')\n"," plt.ylabel(\"Loss\")\n"," plt.title(\"Learning Curve\")\n"," plt.show()"],"metadata":{"id":"xpgN4qzNXin-","executionInfo":{"status":"ok","timestamp":1687391767580,"user_tz":-60,"elapsed":460,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":394,"outputs":[]},{"cell_type":"code","source":["plot_learning_curve(h)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":472},"id":"nJbequnSYuuc","executionInfo":{"status":"ok","timestamp":1687391777191,"user_tz":-60,"elapsed":532,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"0f7b8ba5-f0c2-4d81-afc9-df9136dd0237"},"execution_count":395,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAj0AAAHHCAYAAABUcOnjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABQ0UlEQVR4nO3de3wU9b3/8dfsJtlcd5NArhJuKkIQUEEhVUQlJVC8ILFeigrKkSMNHpWjp+VXC156itJWqVWxVAU9XlCsWqVFBFSsEkFAFEERFEkENgFCsknIdXd+fyRZslwEYpLZZN/Px2Me7M58Z+Yz457mfWa+8x3DNE0TERERkU7OZnUBIiIiIu1BoUdERERCgkKPiIiIhASFHhEREQkJCj0iIiISEhR6REREJCQo9IiIiEhIUOgRERGRkKDQIyIiIiFBoUdEgl7Pnj2ZNGmS1WWISAen0CMSIhYuXIhhGKxbt87qUjqc6upqHnnkEYYOHYrL5SIyMpI+ffowbdo0vv76a6vLE5ETFGZ1ASIix7N161ZsNmv+f7R9+/YxevRo1q9fz6WXXsovfvELYmNj2bp1K4sWLWL+/PnU1tZaUpuInByFHhFpV/X19fh8PiIiIk54HYfD0YYV/bBJkybx6aef8uqrr5Kbmxuw7IEHHuA3v/lNq+ynJedFRE6Obm+JSIBdu3Zx8803k5KSgsPhoH///jzzzDMBbWpra5k5cyaDBw/G5XIRExPD8OHDee+99wLafffddxiGwR//+Efmzp3LqaeeisPhYMuWLdx7770YhsH27duZNGkS8fHxuFwubrrpJg4ePBiwncP79DTdqvvoo4+YPn06SUlJxMTEcOWVV7J3796AdX0+H/feey/p6elER0dz8cUXs2XLlhPqJ7RmzRr++c9/Mnny5CMCDzSEsT/+8Y/+7xdddBEXXXTREe0mTZpEz549j3tePv30U8LCwrjvvvuO2MbWrVsxDIPHHnvMP6+0tJQ77riDjIwMHA4Hp512Gg899BA+n+8Hj0skVOlKj4j4FRUVMWzYMAzDYNq0aSQlJbF06VImT56Mx+PhjjvuAMDj8fDUU09x3XXXccstt1BeXs7TTz9NTk4Oa9eu5ayzzgrY7oIFC6iurmbKlCk4HA4SExP9y66++mp69erF7Nmz2bBhA0899RTJyck89NBDx633tttuIyEhgVmzZvHdd98xd+5cpk2bxssvv+xvM2PGDObMmcNll11GTk4On332GTk5OVRXVx93+2+++SYAN9xwwwmcvZN3+HlJS0tjxIgRvPLKK8yaNSug7csvv4zdbufnP/85AAcPHmTEiBHs2rWL//zP/6R79+6sXr2aGTNmsGfPHubOndsmNYt0aKaIhIQFCxaYgPnJJ58cs83kyZPNtLQ0c9++fQHzr732WtPlcpkHDx40TdM06+vrzZqamoA2Bw4cMFNSUsybb77ZP2/Hjh0mYDqdTrO4uDig/axZs0wgoL1pmuaVV15pdunSJWBejx49zIkTJx5xLNnZ2abP5/PPv/POO0273W6WlpaapmmabrfbDAsLM8eNGxewvXvvvdcEArZ5NFdeeaUJmAcOHPjBdk1GjBhhjhgx4oj5EydONHv06OH//kPn5a9//asJmJs2bQqYn5mZaV5yySX+7w888IAZExNjfv311wHtfv3rX5t2u90sKCg4oZpFQolub4kIAKZp8ve//53LLrsM0zTZt2+ff8rJyaGsrIwNGzYAYLfb/X1PfD4fJSUl1NfXM2TIEH+b5nJzc0lKSjrqfm+99daA78OHD2f//v14PJ7j1jxlyhQMwwhY1+v1snPnTgBWrlxJfX09v/zlLwPWu+222467bcBfQ1xc3Am1P1lHOy/jx48nLCws4GrVF198wZYtW7jmmmv88xYvXszw4cNJSEgI+G+VnZ2N1+vlgw8+aJOaRToy3d4SEQD27t1LaWkp8+fPZ/78+UdtU1xc7P/87LPP8qc//YmvvvqKuro6//xevXodsd7R5jXp3r17wPeEhAQADhw4gNPp/MGaf2hdwB9+TjvttIB2iYmJ/rY/pGn/5eXlxMfHH7f9yTraeenatSsjR47klVde4YEHHgAabm2FhYUxfvx4f7tt27bx+eefHzNMNv9vJSINFHpEBMDf+fX6669n4sSJR20zcOBAAJ5//nkmTZrEuHHjuPvuu0lOTsZutzN79my++eabI9aLioo65n7tdvtR55umedyaf8y6J6Jv374AbNq0ieHDhx+3vWEYR9231+s9avtjnZdrr72Wm266iY0bN3LWWWfxyiuvMHLkSLp27epv4/P5+OlPf8r//M//HHUbffr0OW69IqFGoUdEAEhKSiIuLg6v10t2dvYPtn311Vfp3bs3r732WsDtpcM731qtR48eAGzfvj3gqsr+/fv9V4N+yGWXXcbs2bN5/vnnTyj0JCQk8O233x4xv+mK04kaN24c//mf/+m/xfX1118zY8aMgDannnoqFRUVx/1vJSKHqE+PiAANV01yc3P5+9//zhdffHHE8uaPgjddYWl+VWPNmjXk5+e3faEnYeTIkYSFhTFv3ryA+c0f+/4hWVlZjB49mqeeeoo33njjiOW1tbXcdddd/u+nnnoqX331VcC5+uyzz/joo49Oqu74+HhycnJ45ZVXWLRoEREREYwbNy6gzdVXX01+fj7Lli07Yv3S0lLq6+tPap8ioUBXekRCzDPPPMPbb799xPzbb7+dBx98kPfee4+hQ4dyyy23kJmZSUlJCRs2bGDFihWUlJQAcOmll/Laa69x5ZVXMnbsWHbs2MGTTz5JZmYmFRUV7X1Ix5SSksLtt9/On/70Jy6//HJGjx7NZ599xtKlS+natWvAVapjee655xg1ahTjx4/nsssuY+TIkcTExLBt2zYWLVrEnj17/GP13HzzzTz88MPk5OQwefJkiouLefLJJ+nfv/8Jdcxu7pprruH666/niSeeICcn54g+RXfffTdvvvkml156KZMmTWLw4MFUVlayadMmXn31Vb777ruA22EiotAjEnIOv+rRZNKkSXTr1o21a9dy//3389prr/HEE0/QpUsX+vfvHzBuzqRJk3C73fz1r39l2bJlZGZm8vzzz7N48WLef//9djqSE/PQQw8RHR3N3/72N1asWEFWVhbvvPMOF1xwAZGRkcddPykpidWrV/PEE0/w8ssv85vf/Iba2lp69OjB5Zdfzu233+5v269fP5577jlmzpzJ9OnTyczM5P/+7/948cUXT/q8XH755URFRVFeXh7w1FaT6OhoVq1axe9//3sWL17Mc889h9PppE+fPtx33324XK6T2p9IKDDM1urxJyLSQZSWlpKQkMDvfve7VnuNhIgEP/XpEZFOraqq6oh5TaMVH+2VESLSeen2loh0ai+//DILFy7kZz/7GbGxsXz44Ye89NJLjBo1ivPPP9/q8kSkHSn0iEinNnDgQMLCwpgzZw4ej8ffufl3v/ud1aWJSDtTnx4REREJCerTIyIiIiFBoUdERERCgvr00PAOm927dxMXF3dCg5WJiIiI9UzTpLy8nPT0dGy241/HUegBdu/eTUZGhtVliIiI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avLy8ujSpQuxsbHk5uYe8fLnUHMi5+2iiy464vd26623WlRxcJg3bx4DBw7E6XTidDrJyspi6dKl/uWt9VtT6GkjL7/8MtOnT2fWrFls2LCBQYMGkZOTQ3FxsdWlBbX+/fuzZ88e//Thhx9aXVJQqaysZNCgQTz++ONHXT5nzhweffRRnnzySdasWUNMTAw5OTlUV1e3c6XB5XjnDWD06NEBv72XXnqpHSsMPqtWrSIvL4+PP/6Y5cuXU1dXx6hRo6isrPS3ufPOO3nrrbdYvHgxq1atYvfu3YwfP97Cqq13IucN4JZbbgn4vc2ZM8eiioNDt27dePDBB1m/fj3r1q3jkksu4YorrmDz5s1AK/7WTGkT5513npmXl+f/7vV6zfT0dHP27NkWVhXcZs2aZQ4aNMjqMjoMwHz99df9330+n5mammr+4Q9/8M8rLS01HQ6H+dJLL1lQYXA6/LyZpmlOnDjRvOKKKyypp6MoLi42AXPVqlWmaTb8tsLDw83Fixf723z55ZcmYObn51tVZtA5/LyZpmmOGDHCvP32260rqoNISEgwn3rqqVb9relKTxuora1l/fr1ZGdn++fZbDays7PJz8+3sLLgt23bNtLT0+nduzcTJkygoKDA6pI6jB07duB2uwN+dy6Xi6FDh+p3dwLef/99kpOTOeOMM5g6dSr79++3uqSgUlZWBkBiYiIA69evp66uLuD31rdvX7p3767fWzOHn7cmL7zwAl27duXMM89kxowZHDx40IrygpLX62XRokVUVlaSlZXVqr+1TvGW9WCzb98+vF7vEW95T0lJ4auvvrKoquA3dOhQFi5cyBlnnMGePXu47777GD58OF988QVxcXFWlxf03G43wFF/d03L5OhGjx7N+PHj6dWrF9988w3/7//9P8aMGUN+fj52u93q8izn8/m44447OP/88znzzDOBht9bREQE8fHxAW31ezvkaOcN4Be/+AU9evQgPT2dzz//nF/96lds3bqV1157zcJqrbdp0yaysrKorq4mNjaW119/nczMTDZu3NhqvzWFHgkaY8aM8X8eOHAgQ4cOpUePHrzyyitMnjzZwsqks7v22mv9nwcMGMDAgQM59dRTef/99xk5cqSFlQWHvLw8vvjiC/WxO0nHOm9Tpkzxfx4wYABpaWmMHDmSb775hlNPPbW9ywwaZ5xxBhs3bqSsrIxXX32ViRMnsmrVqlbdh25vtYGuXbtit9uP6FleVFREamqqRVV1PPHx8fTp04ft27dbXUqH0PTb0u/ux+vduzddu3bVbw+YNm0aS5Ys4b333qNbt27++ampqdTW1lJaWhrQXr+3Bsc6b0czdOhQgJD/vUVERHDaaacxePBgZs+ezaBBg/jzn//cqr81hZ42EBERweDBg1m5cqV/ns/nY+XKlWRlZVlYWcdSUVHBN998Q1pamtWldAi9evUiNTU14Hfn8XhYs2aNfncn6fvvv2f//v0h/dszTZNp06bx+uuv8+6779KrV6+A5YMHDyY8PDzg97Z161YKCgpC+vd2vPN2NBs3bgQI6d/b0fh8Pmpqalr3t9a6fa2lyaJFi0yHw2EuXLjQ3LJlizllyhQzPj7edLvdVpcWtP77v//bfP/9980dO3aYH330kZmdnW127drVLC4utrq0oFFeXm5++umn5qeffmoC5sMPP2x++umn5s6dO03TNM0HH3zQjI+PN//xj3+Yn3/+uXnFFVeYvXr1Mquqqiyu3Fo/dN7Ky8vNu+66y8zPzzd37NhhrlixwjznnHPM008/3ayurra6dMtMnTrVdLlc5vvvv2/u2bPHPx08eNDf5tZbbzW7d+9uvvvuu+a6devMrKwsMysry8KqrXe887Z9+3bz/vvvN9etW2fu2LHD/Mc//mH27t3bvPDCCy2u3Fq//vWvzVWrVpk7duwwP//8c/PXv/61aRiG+c4775im2Xq/NYWeNvSXv/zF7N69uxkREWGed9555scff2x1SUHtmmuuMdPS0syIiAjzlFNOMa+55hpz+/btVpcVVN577z0TOGKaOHGiaZoNj63/9re/NVNSUkyHw2GOHDnS3Lp1q7VFB4EfOm8HDx40R40aZSYlJZnh4eFmjx49zFtuuSXk/x+Uo50vwFywYIG/TVVVlfnLX/7STEhIMKOjo80rr7zS3LNnj3VFB4HjnbeCggLzwgsvNBMTE02Hw2Gedtpp5t13322WlZVZW7jFbr75ZrNHjx5mRESEmZSUZI4cOdIfeEyz9X5rhmmaZguvPImIiIh0GOrTIyIiIiFBoUdERERCgkKPiIiIhASFHhEREQkJCj0iIiISEhR6REREJCQo9IiIiEhIUOgREQEMw+CNN96wugwRaUMKPSJiuUmTJmEYxhHT6NGjrS5NRDqRMKsLEBEBGD16NAsWLAiY53A4LKpGRDojXekRkaDgcDhITU0NmBISEoCGW0/z5s1jzJgxREVF0bt3b1599dWA9Tdt2sQll1xCVFQUXbp0YcqUKVRUVAS0eeaZZ+jfvz8Oh4O0tDSmTZsWsHzfvn1ceeWVREdHc/rpp/Pmm2/6lx04cIAJEyaQlJREVFQUp59++hEhTUSCm0KPiHQIv/3tb8nNzeWzzz5jwoQJXHvttXz55ZcAVFZWkpOTQ0JCAp988gmLFy9mxYoVAaFm3rx55OXlMWXKFDZt2sSbb77JaaedFrCP++67j6uvvprPP/+cn/3sZ0yYMIGSkhL//rds2cLSpUv58ssvmTdvHl27dm2/EyAiP17rvSNVRKRlJk6caNrtdjMmJiZg+t///V/TNBveXH3rrbcGrDN06FBz6tSppmma5vz5882EhASzoqLCv/yf//ynabPZ/G9LT09PN3/zm98cswbAvOeee/zfKyoqTMBcunSpaZqmedlll5k33XRT6xywiFhCfXpEJChcfPHFzJs3L2BeYmKi/3NWVlbAsqysLDZu3AjAl19+yaBBg4iJifEvP//88/H5fGzduhXDMNi9ezcjR478wRoGDhzo/xwTE4PT6aS4uBiAqVOnkpuby4YNGxg1ahTjxo3jJz/5SYuOVUSsodAjIkEhJibmiNtNrSUqKuqE2oWHhwd8NwwDn88HwJgxY9i5cyf/+te/WL58OSNHjiQvL48//vGPrV6viLQN9ekRkQ7h448/PuJ7v379AOjXrx+fffYZlZWV/uUfffQRNpuNM844g7i4OHr27MnKlSt/VA1JSUlMnDiR559/nrlz5zJ//vwftT0RaV+60iMiQaGmpga32x0wLywszN9ZePHixQwZMoQLLriAF154gbVr1/L0008DMGHCBGbNmsXEiRO599572bt3L7fddhs33HADKSkpANx7773ceuutJCcnM2bMGMrLy/noo4+47bbbTqi+mTNnMnjwYPr3709NTQ1Llizxhy4R6RgUekQkKLz99tukpaUFzDvjjDP46quvgIYnqxYtWsQvf/lL0tLSeOmll8jMzAQgOjqaZcuWcfvtt3PuuecSHR1Nbm4uDz/8sH9bEydOpLq6mkceeYS77rqLrl27ctVVV51wfREREcyYMYPvvvuOqKgohg8fzqJFi1rhyEWkvRimaZpWFyEi8kMMw+D1119n3LhxVpciIh2Y+vSIiIhISFDoERERkZCgPj0iEvR0F15EWoOu9IiIiEhIUOgRERGRkKDQIyIiIiFBoUdERERCgkKPiIiIhASFHhEREQkJCj0iIiISEhR6REREJCQo9IiIiEhI+P+oNg3dFeRRpAAAAABJRU5ErkJggg==\n"},"metadata":{}}]},{"cell_type":"markdown","source":["## Réseau de neurones simple"],"metadata":{"id":"2lR22NKdZVF0"}},{"cell_type":"code","source":["sigmoid = Sigmoid()\n","model = Model([ Dense(neurons=3, activation=sigmoid),\n"," Dense(neurons=1)\n"," ])"],"metadata":{"id":"cIJ_hfG1ZdJT","executionInfo":{"status":"ok","timestamp":1687392537690,"user_tz":-60,"elapsed":532,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":435,"outputs":[]},{"cell_type":"code","source":["model"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"LmiAC4rkZqsR","executionInfo":{"status":"ok","timestamp":1687392538491,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"531e2202-e2e2-478e-a74f-43f762c5bdc5"},"execution_count":436,"outputs":[{"output_type":"execute_result","data":{"text/plain":["Layers ................. \n"," DenseLayer(neurons=3) avec Sigmoid \n"," DenseLayer(neurons=1)"]},"metadata":{},"execution_count":436}]},{"cell_type":"code","source":["mse = Loss()\n","model.compile(loss=mse, learning_rate=0.0001)\n","h = model.fit(X_train, y_train, epochs=150, validation_data=(X_test, y_test))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"uD0dtDp8YyyV","executionInfo":{"status":"ok","timestamp":1687392541246,"user_tz":-60,"elapsed":447,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"49b6926d-dbf1-43df-b28e-30ad34982620"},"execution_count":437,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1 .............. loss : 507.9248956497336 ....val_loss : 492.311693850643\n","Epoch 2 .............. loss : 466.24520089721494 ....val_loss : 451.5607557083814\n","Epoch 3 .............. loss : 427.7318622051442 ....val_loss : 413.9124130384742\n","Epoch 4 .............. loss : 391.9445763802112 ....val_loss : 378.9220233229542\n","Epoch 5 .............. loss : 358.64849568841305 ....val_loss : 346.36124271593445\n","Epoch 6 .............. loss : 327.7617822429383 ....val_loss : 316.1600493240994\n","Epoch 7 .............. loss : 299.2676236516309 ....val_loss : 288.3099264728872\n","Epoch 8 .............. loss : 273.13622523629294 ....val_loss : 262.78193463964385\n","Epoch 9 .............. loss : 249.29517625915642 ....val_loss : 239.50103731811706\n","Epoch 10 .............. loss : 227.63791951268425 ....val_loss : 218.36067475205962\n","Epoch 11 .............. loss : 208.03992319108744 ....val_loss : 199.24113995526798\n","Epoch 12 .............. loss : 190.36761824850086 ....val_loss : 182.0169604282577\n","Epoch 13 .............. loss : 174.48132826613926 ....val_loss : 166.55758033726065\n","Epoch 14 .............. loss : 160.2373877660901 ....val_loss : 152.72817521222836\n","Epoch 15 .............. loss : 147.49213642139273 ....val_loss : 140.39369302710537\n","Epoch 16 .............. loss : 136.10807073394298 ....val_loss : 129.4266588617602\n","Epoch 17 .............. loss : 125.96005042278307 ....val_loss : 119.71304197365491\n","Epoch 18 .............. loss : 116.93619404383797 ....val_loss : 111.1455403981217\n","Epoch 19 .............. loss : 108.93089266089396 ....val_loss : 103.60774406587444\n","Epoch 20 .............. loss : 101.83844353958814 ....val_loss : 96.96951004926161\n","Epoch 21 .............. loss : 95.55606579719415 ....val_loss : 91.09914936496412\n","Epoch 22 .............. loss : 89.99316542944221 ....val_loss : 85.88076187359752\n","Epoch 23 .............. loss : 85.0797863891724 ....val_loss : 81.23032261860891\n","Epoch 24 .............. loss : 80.76874841898717 ....val_loss : 77.1066717562455\n","Epoch 25 .............. loss : 77.02651759310706 ....val_loss : 73.50424553625534\n","Epoch 26 .............. loss : 73.81484783078726 ....val_loss : 70.42003921110141\n","Epoch 27 .............. loss : 71.07813912785376 ....val_loss : 67.8214885725702\n","Epoch 28 .............. loss : 68.74771096995089 ....val_loss : 65.6462032660693\n","Epoch 29 .............. loss : 66.75445606175039 ....val_loss : 63.822082675892396\n","Epoch 30 .............. loss : 65.03745027994101 ....val_loss : 62.28288764393278\n","Epoch 31 .............. loss : 63.54634633177122 ....val_loss : 60.97353071205928\n","Epoch 32 .............. loss : 62.24054219862075 ....val_loss : 59.84982479798374\n","Epoch 33 .............. loss : 61.087469983750644 ....val_loss : 58.87661701467563\n","Epoch 34 .............. loss : 60.06094702186249 ....val_loss : 58.025873950715265\n","Epoch 35 .............. loss : 59.139823571218756 ....val_loss : 57.275113624333386\n","Epoch 36 .............. loss : 58.30692492487099 ....val_loss : 56.60619800672443\n","Epoch 37 .............. loss : 57.54823196113008 ....val_loss : 56.00441451316407\n","Epoch 38 .............. loss : 56.852244452189154 ....val_loss : 55.45777395518676\n","Epoch 39 .............. loss : 56.209483016535096 ....val_loss : 54.956468508282875\n","Epoch 40 .............. loss : 55.612096744538555 ....val_loss : 54.49244857110679\n","Epoch 41 .............. loss : 55.05355205428039 ....val_loss : 54.059088853415076\n","Epoch 42 .............. loss : 54.52838448445342 ....val_loss : 53.65092206747318\n","Epoch 43 .............. loss : 54.03199953686629 ....val_loss : 53.26342416555792\n","Epoch 44 .............. loss : 53.560511881718085 ....val_loss : 52.8928389449061\n","Epoch 45 .............. loss : 53.11061461736576 ....val_loss : 52.536032567989\n","Epoch 46 .............. loss : 52.6794720976204 ....val_loss : 52.19037047744537\n","Epoch 47 .............. loss : 52.26463130133323 ....val_loss : 51.85361057633516\n","Epoch 48 .............. loss : 51.86394800081757 ....val_loss : 51.523807627570385\n","Epoch 49 .............. loss : 51.47552530291856 ....val_loss : 51.19922491536677\n","Epoch 50 .............. loss : 51.09766380971813 ....val_loss : 50.87825088124481\n","Epoch 51 .............. loss : 50.7288251855307 ....val_loss : 50.55932185480677\n","Epoch 52 .............. loss : 50.36761506755083 ....val_loss : 50.240859372612874\n","Epoch 53 .............. loss : 50.01279774169708 ....val_loss : 49.921245520485\n","Epoch 54 .............. loss : 49.66336318555973 ....val_loss : 49.59888553451402\n","Epoch 55 .............. loss : 49.31867097034068 ....val_loss : 49.27243735609513\n","Epoch 56 .............. loss : 48.97867658577628 ....val_loss : 48.941282630794284\n","Epoch 57 .............. loss : 48.64417269364475 ....val_loss : 48.60617503634132\n","Epoch 58 .............. loss : 48.316849201351516 ....val_loss : 48.26966722405963\n","Epoch 59 .............. loss : 47.99892244221096 ....val_loss : 47.93568662008473\n","Epoch 60 .............. loss : 47.69233833768087 ....val_loss : 47.60816373524545\n","Epoch 61 .............. loss : 47.39801758559914 ....val_loss : 47.28967500126016\n","Epoch 62 .............. loss : 47.115661828962544 ....val_loss : 46.981095919974\n","Epoch 63 .............. loss : 46.844111810755244 ....val_loss : 46.682132163029806\n","Epoch 64 .............. loss : 46.581858280850376 ....val_loss : 46.391997037683595\n","Epoch 65 .............. loss : 46.32741201414948 ....val_loss : 46.109834987643424\n","Epoch 66 .............. loss : 46.079483149109315 ....val_loss : 45.834893016978356\n","Epoch 67 .............. loss : 45.83703171984428 ....val_loss : 45.56655596872626\n","Epoch 68 .............. loss : 45.59925484619439 ....val_loss : 45.30433011631969\n","Epoch 69 .............. loss : 45.36555065768121 ....val_loss : 45.04781482122885\n","Epoch 70 .............. loss : 45.135478325458635 ....val_loss : 44.79667654100699\n","Epoch 71 .............. loss : 44.90872200688446 ....val_loss : 44.5506287006048\n","Epoch 72 .............. loss : 44.685061033004786 ....val_loss : 44.309417232400236\n","Epoch 73 .............. loss : 44.464346364713776 ....val_loss : 44.0728106504937\n","Epoch 74 .............. loss : 44.24648250945984 ....val_loss : 43.84059350674433\n","Epoch 75 .............. loss : 44.03141388866228 ....val_loss : 43.61256229369409\n","Epoch 76 .............. loss : 43.819114693430016 ....val_loss : 43.388523089858275\n","Epoch 77 .............. loss : 43.60958139634553 ....val_loss : 43.16829042871423\n","Epoch 78 .............. loss : 43.40282723160738 ....val_loss : 42.95168700988071\n","Epoch 79 .............. loss : 43.198878089290304 ....val_loss : 42.73854396870362\n","Epoch 80 .............. loss : 42.99776938470999 ....val_loss : 42.52870148915845\n","Epoch 81 .............. loss : 42.79954356102666 ....val_loss : 42.32200959318739\n","Epoch 82 .............. loss : 42.60424796501946 ....val_loss : 42.118328973792664\n","Epoch 83 .............. loss : 42.41193290563046 ....val_loss : 41.91753176430316\n","Epoch 84 .............. loss : 42.22264976522918 ....val_loss : 41.71950215596651\n","Epoch 85 .............. loss : 42.03644908658515 ....val_loss : 41.52413679326066\n","Epoch 86 .............. loss : 41.8533786053007 ....val_loss : 41.331344893166886\n","Epoch 87 .............. loss : 41.673481238039145 ....val_loss : 41.14104805242936\n","Epoch 88 .............. loss : 41.49679307058096 ....val_loss : 40.953179726099165\n","Epoch 89 .............. loss : 41.3233414153459 ....val_loss : 40.76768438119792\n","Epoch 90 .............. loss : 41.15314302422827 ....val_loss : 40.58451635024624\n","Epoch 91 .............. loss : 40.9862025484439 ....val_loss : 40.40363842929208\n","Epoch 92 .............. loss : 40.82251133236724 ....val_loss : 40.22502028231934\n","Epoch 93 .............. loss : 40.662046613823684 ....val_loss : 40.04863672694097\n","Epoch 94 .............. loss : 40.50477118081201 ....val_loss : 39.87446598381044\n","Epoch 95 .............. loss : 40.35063350683473 ....val_loss : 39.70248797345854\n","Epoch 96 .............. loss : 40.19956835706255 ....val_loss : 39.5326827391291\n","Epoch 97 .............. loss : 40.05149782865205 ....val_loss : 39.365029063143375\n","Epoch 98 .............. loss : 39.90633276347519 ....val_loss : 39.1995033284611\n","Epoch 99 .............. loss : 39.763974452403666 ....val_loss : 39.036078657998985\n","Epoch 100 .............. loss : 39.624316538334256 ....val_loss : 38.874724343790334\n","Epoch 101 .............. loss : 39.48724702066852 ....val_loss : 38.71540555817277\n","Epoch 102 .............. loss : 39.35265026651055 ....val_loss : 38.55808332165222\n","Epoch 103 .............. loss : 39.22040894236437 ....val_loss : 38.402714688280355\n","Epoch 104 .............. loss : 39.09040579317325 ....val_loss : 38.24925310011091\n","Epoch 105 .............. loss : 38.96252521156863 ....val_loss : 38.09764885776169\n","Epoch 106 .............. loss : 38.83665455765584 ....val_loss : 37.947849653936096\n","Epoch 107 .............. loss : 38.71268520721598 ....val_loss : 37.79980112018688\n","Epoch 108 .............. loss : 38.59051332280145 ....val_loss : 37.653447343247066\n","Epoch 109 .............. loss : 38.4700403571245 ....val_loss : 37.50873131491534\n","Epoch 110 .............. loss : 38.351173310991996 ....val_loss : 37.36559528790041\n","Epoch 111 .............. loss : 38.233824778713455 ....val_loss : 37.22398101857871\n","Epoch 112 .............. loss : 38.11791282251151 ....val_loss : 37.08382988595363\n","Epoch 113 .............. loss : 38.00336072425227 ....val_loss : 36.945082884163476\n","Epoch 114 .............. loss : 37.89009666812495 ....val_loss : 36.807680493870414\n","Epoch 115 .............. loss : 37.778053412093804 ....val_loss : 36.671562446233224\n","Epoch 116 .............. loss : 37.66716800933388 ....val_loss : 36.536667402617226\n","Epoch 117 .............. loss : 37.55738164364766 ....val_loss : 36.40293258465987\n","Epoch 118 .............. loss : 37.44863964501532 ....val_loss : 36.27029340393963\n","Epoch 119 .............. loss : 37.34089175253839 ....val_loss : 36.138683159568096\n","Epoch 120 .............. loss : 37.234092691005024 ....val_loss : 36.00803289670882\n","Epoch 121 .............. loss : 37.128203121979716 ....val_loss : 35.878271549840996\n","Epoch 122 .............. loss : 37.02319101697063 ....val_loss : 35.74932653037652\n","Epoch 123 .............. loss : 36.919033473002756 ....val_loss : 35.62112495440456\n","Epoch 124 .............. loss : 36.81571894157369 ....val_loss : 35.493595732241516\n","Epoch 125 .............. loss : 36.71324976037905 ....val_loss : 35.36667273730125\n","Epoch 126 .............. loss : 36.611644753828095 ....val_loss : 35.24029920638452\n","Epoch 127 .............. loss : 36.510941500013196 ....val_loss : 35.11443335635405\n","Epoch 128 .............. loss : 36.411197661901035 ....val_loss : 34.98905489578731\n","Epoch 129 .............. loss : 36.31249059344468 ....val_loss : 34.86417165869364\n","Epoch 130 .............. loss : 36.21491434470053 ....val_loss : 34.73982506141262\n","Epoch 131 .............. loss : 36.11857333110693 ....val_loss : 34.61609267197933\n","Epoch 132 .............. loss : 36.02357242751006 ....val_loss : 34.493086179102846\n","Epoch 133 .............. loss : 35.93000413497726 ....val_loss : 34.370943735947705\n","Epoch 134 .............. loss : 35.837934586858985 ....val_loss : 34.249817065789195\n","Epoch 135 .............. loss : 35.747391105350445 ....val_loss : 34.129855439414975\n","Epoch 136 .............. loss : 35.65835426890982 ....val_loss : 34.01118988236355\n","Epoch 137 .............. loss : 35.570756669065204 ....val_loss : 33.89392103055879\n","Epoch 138 .............. loss : 35.484488870634124 ....val_loss : 33.77811281814869\n","Epoch 139 .............. loss : 35.39941118697494 ....val_loss : 33.66379227998596\n","Epoch 140 .............. loss : 35.3153685294316 ....val_loss : 33.55095410885875\n","Epoch 141 .............. loss : 35.232205253759396 ....val_loss : 33.43956783274636\n","Epoch 142 .............. loss : 35.1497775380875 ....val_loss : 33.32958559296686\n","Epoch 143 .............. loss : 35.06796193938238 ....val_loss : 33.220949134036125\n","Epoch 144 .............. loss : 34.986659886518474 ....val_loss : 33.11359533465999\n","Epoch 145 .............. loss : 34.90579865930361 ....val_loss : 33.00746015863697\n","Epoch 146 .............. loss : 34.825329789776134 ....val_loss : 32.90248121680383\n","Epoch 147 .............. loss : 34.74522587897512 ....val_loss : 32.79859925066848\n","Epoch 148 .............. loss : 34.665476680065716 ....val_loss : 32.69575885078554\n","Epoch 149 .............. loss : 34.5860850756599 ....val_loss : 32.59390867182821\n","Epoch 150 .............. loss : 34.50706335243698 ....val_loss : 32.49300134130421\n"]}]},{"cell_type":"code","source":["plot_learning_curve(h)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":472},"id":"PofKkfo2ZupJ","executionInfo":{"status":"ok","timestamp":1687392548006,"user_tz":-60,"elapsed":481,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"5b164152-6a20-4cee-ed54-ba3e7ff7642e"},"execution_count":438,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPcUlEQVR4nO3deXxU1f3/8dedNetMQshCZHeDqKhFhVStVhBQXBBsq0VE5VerRr8u1Vq+WtxqUVurtSpKa0W/alGsWqW1iGixSlgEQRBBVCBANiBkX2a7vz8mGTKyBUjmJpP38/G4j8zce2fmcyaWvHvOuecapmmaiIiIiMQpm9UFiIiIiHQkhR0RERGJawo7IiIiEtcUdkRERCSuKeyIiIhIXFPYERERkbimsCMiIiJxTWFHRERE4prCjoiIiMQ1hR0R6fT69+/PVVddZXUZItJFKeyIdBOzZs3CMAw+/fRTq0vpchobG3nssccYNmwYXq+XhIQEjjnmGG688Ua++uorq8sTkQNwWF2AiMiBrF+/HpvNmv9vtmPHDsaMGcPy5cu54IIL+OlPf0pKSgrr169n9uzZzJw5E5/PZ0ltItI2CjsiElOBQIBQKITL5Wrza9xudwdWtH9XXXUVn332Ga+//joTJkyIOvbAAw9w1113tcvnHMr3IiJto2EsEYmybds2rrnmGrKzs3G73Rx33HH89a9/jTrH5/Mxbdo0hg4ditfrJTk5mTPPPJMPP/ww6rxNmzZhGAa///3vefzxxznyyCNxu92sXbuWe++9F8Mw+Prrr7nqqqtIS0vD6/Vy9dVXU19fH/U+352z0zIk98knn3DbbbeRmZlJcnIyl1xyCdu3b496bSgU4t577yU3N5ekpCR++MMfsnbt2jbNA1qyZAn//Oc/mTJlyh5BB8Ih7Pe//33k+dlnn83ZZ5+9x3lXXXUV/fv3P+D38tlnn+FwOLjvvvv2eI/169djGAZPPvlkZF9lZSW33HILffr0we12c9RRR/Hwww8TCoX22y6R7kY9OyISUVZWxvDhwzEMgxtvvJHMzEzeffddpkyZQnV1NbfccgsA1dXV/OUvf+Hyyy/nZz/7GTU1NTz33HOMHj2apUuXctJJJ0W97/PPP09jYyPXXnstbrebHj16RI79+Mc/ZsCAAUyfPp0VK1bwl7/8haysLB5++OED1nvTTTeRnp7OPffcw6ZNm3j88ce58cYbefXVVyPnTJ06lUceeYQLL7yQ0aNHs2rVKkaPHk1jY+MB3//tt98GYNKkSW349g7ed7+XXr16cdZZZ/Haa69xzz33RJ376quvYrfb+dGPfgRAfX09Z511Ftu2bePnP/85ffv2ZdGiRUydOpWSkhIef/zxDqlZpEsyRaRbeP75503AXLZs2T7PmTJlitmrVy9zx44dUfsvu+wy0+v1mvX19aZpmmYgEDCbmpqiztm1a5eZnZ1tXnPNNZF9GzduNAHT4/GY5eXlUeffc889JhB1vmma5iWXXGJmZGRE7evXr585efLkPdoycuRIMxQKRfbfeuutpt1uNysrK03TNM3S0lLT4XCY48aNi3q/e++91wSi3nNvLrnkEhMwd+3atd/zWpx11lnmWWedtcf+yZMnm/369Ys839/38uyzz5qAuXr16qj9eXl55jnnnBN5/sADD5jJycnmV199FXXer371K9Nut5tFRUVtqlmkO9AwlogAYJomf//737nwwgsxTZMdO3ZEttGjR1NVVcWKFSsAsNvtkbkloVCIiooKAoEAp5xySuSc1iZMmEBmZuZeP/e6666Len7mmWeyc+dOqqurD1jztddei2EYUa8NBoNs3rwZgAULFhAIBLjhhhuiXnfTTTcd8L2BSA2pqaltOv9g7e17GT9+PA6HI6p3as2aNaxdu5af/OQnkX1z5szhzDPPJD09Pep3NXLkSILBIB999FGH1CzSFWkYS0QA2L59O5WVlcycOZOZM2fu9Zzy8vLI4xdeeIFHH32UdevW4ff7I/sHDBiwx+v2tq9F3759o56np6cDsGvXLjwez35r3t9rgUjoOeqoo6LO69GjR+Tc/Wn5/JqaGtLS0g54/sHa2/fSs2dPRowYwWuvvcYDDzwAhIewHA4H48ePj5y3YcMGPv/8832GyNa/K5HuTmFHRAAik1qvuOIKJk+evNdzhgwZAsBLL73EVVddxbhx47jjjjvIysrCbrczffp0vvnmmz1el5iYuM/Ptdvte91vmuYBaz6c17bFoEGDAFi9ejVnnnnmAc83DGOvnx0MBvd6/r6+l8suu4yrr76alStXctJJJ/Haa68xYsQIevbsGTknFApx7rnn8stf/nKv73HMMcccsF6R7kJhR0QAyMzMJDU1lWAwyMiRI/d77uuvv87AgQN54403ooaRvjup1mr9+vUD4Ouvv47qRdm5c2ek92d/LrzwQqZPn85LL73UprCTnp7Ot99+u8f+lh6mtho3bhw///nPI0NZX331FVOnTo0658gjj6S2tvaAvysR0aXnItLMbrczYcIE/v73v7NmzZo9jre+pLulR6V1L8aSJUsoLCzs+EIPwogRI3A4HMyYMSNqf+vLt/cnPz+fMWPG8Je//IW33nprj+M+n4/bb7898vzII49k3bp1Ud/VqlWr+OSTTw6q7rS0NEaPHs1rr73G7NmzcblcjBs3LuqcH//4xxQWFjJv3rw9Xl9ZWUkgEDiozxSJZ+rZEelm/vrXv/Lvf/97j/0333wzDz30EB9++CHDhg3jZz/7GXl5eVRUVLBixQref/99KioqALjgggt44403uOSSSxg7diwbN27kmWeeIS8vj9ra2lg3aZ+ys7O5+eabefTRR7nooosYM2YMq1at4t1336Vnz55RvVL78uKLLzJq1CjGjx/PhRdeyIgRI0hOTmbDhg3Mnj2bkpKSyFo711xzDX/4wx8YPXo0U6ZMoby8nGeeeYbjjjuuTROuW/vJT37CFVdcwdNPP83o0aP3mDN0xx138Pbbb3PBBRdw1VVXMXToUOrq6li9ejWvv/46mzZtihr2EunOFHZEupnv9nK0uOqqq+jduzdLly7l/vvv54033uDpp58mIyOD4447Lmrdm6uuuorS0lKeffZZ5s2bR15eHi+99BJz5szhP//5T4xa0jYPP/wwSUlJ/PnPf+b9998nPz+f9957jzPOOIOEhIQDvj4zM5NFixbx9NNP8+qrr3LXXXfh8/no168fF110ETfffHPk3MGDB/Piiy8ybdo0brvtNvLy8vi///s/XnnllYP+Xi666CISExOpqamJugqrRVJSEgsXLuS3v/0tc+bM4cUXX8Tj8XDMMcdw33334fV6D+rzROKZYbbXTD4RkS6isrKS9PR0fvOb37Tb7R5EpPPSnB0RiWsNDQ177GtZXXhvt3YQkfijYSwRiWuvvvoqs2bN4vzzzyclJYWPP/6Yv/3tb4waNYrTTz/d6vJEJAYUdkQkrg0ZMgSHw8EjjzxCdXV1ZNLyb37zG6tLE5EY0ZwdERERiWuasyMiIiJxTWFHRERE4prm7BC+x0xxcTGpqaltWmRMRERErGeaJjU1NeTm5mKz7bv/RmEHKC4upk+fPlaXISIiIodgy5Yt9O7de5/HFXaA1NRUIPxleTwei6sRERGRtqiurqZPnz6Rv+P7orADkaErj8ejsCMiItLFHGgKiiYoi4iISFxT2BEREZG4prAjIiIicU1hR0REROKawo6IiIjENYUdERERiWsKOyIiIhLXFHZEREQkrinsiIiISFxT2BEREZG4prAjIiIicU1hR0REROKawk4Hqmn083V5LY3+oNWliIiIdFsKOx1o5B8WMvIPC/mqrMbqUkRERLothZ0OlO1JAKCsusniSkRERLovS8POvffei2EYUdugQYMixxsbGykoKCAjI4OUlBQmTJhAWVlZ1HsUFRUxduxYkpKSyMrK4o477iAQCMS6KXuVldoSdhotrkRERKT7clhdwHHHHcf7778fee5w7C7p1ltv5Z///Cdz5szB6/Vy4403Mn78eD755BMAgsEgY8eOJScnh0WLFlFSUsKVV16J0+nkt7/9bczb8l05XjcA5Qo7IiIilrE87DgcDnJycvbYX1VVxXPPPccrr7zCOeecA8Dzzz/P4MGDWbx4McOHD+e9995j7dq1vP/++2RnZ3PSSSfxwAMPcOedd3Lvvfficrli3Zwo2c09O6UKOyIiIpaxfM7Ohg0byM3NZeDAgUycOJGioiIAli9fjt/vZ+TIkZFzBw0aRN++fSksLASgsLCQE044gezs7Mg5o0ePprq6mi+++CK2DdkLzdkRERGxnqU9O8OGDWPWrFkce+yxlJSUcN9993HmmWeyZs0aSktLcblcpKWlRb0mOzub0tJSAEpLS6OCTsvxlmP70tTURFPT7gBSXV3dTi2KluUJD2Npzo6IiIh1LA075513XuTxkCFDGDZsGP369eO1114jMTGxwz53+vTp3HfffR32/i1yvJqgLCIiYjXLh7FaS0tL45hjjuHrr78mJycHn89HZWVl1DllZWWROT45OTl7XJ3V8nxv84BaTJ06laqqqsi2ZcuW9m1Is5Y5O7vq/TQFtLCgiIiIFTpV2KmtreWbb76hV69eDB06FKfTyYIFCyLH169fT1FREfn5+QDk5+ezevVqysvLI+fMnz8fj8dDXl7ePj/H7Xbj8Xiito6QluTE5Qh/xeWatyMiImIJS8PO7bffzsKFC9m0aROLFi3ikksuwW63c/nll+P1epkyZQq33XYbH374IcuXL+fqq68m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\n"},"metadata":{}}]},{"cell_type":"markdown","source":["## Deep Neural Network"],"metadata":{"id":"acUQvSjvabqB"}},{"cell_type":"code","source":["sigmoid = Sigmoid()\n","model = Model([ Dense(neurons=13, activation=sigmoid),\n"," Dense(neurons=1),\n","\n"," ])"],"metadata":{"id":"u8wMC3ppaN0M","executionInfo":{"status":"ok","timestamp":1687392627734,"user_tz":-60,"elapsed":401,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":447,"outputs":[]},{"cell_type":"code","source":["model"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"jeTyisrraqmj","executionInfo":{"status":"ok","timestamp":1687392629360,"user_tz":-60,"elapsed":3,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"44189696-770e-4b35-f662-e5ed38f98bcd"},"execution_count":448,"outputs":[{"output_type":"execute_result","data":{"text/plain":["Layers ................. \n"," DenseLayer(neurons=13) avec Sigmoid \n"," DenseLayer(neurons=1)"]},"metadata":{},"execution_count":448}]},{"cell_type":"code","source":["mse = Loss()\n","model.compile(loss=mse, learning_rate=0.0001)\n","h = model.fit(X_train, y_train, epochs=150, validation_data=(X_test, y_test))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"W9Vb4FC3ar8w","executionInfo":{"status":"ok","timestamp":1687392631894,"user_tz":-60,"elapsed":568,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"c1e95779-6149-4b54-ed7e-4b0941c1ed6f"},"execution_count":449,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1 .............. loss : 609.4535263872165 ....val_loss : 594.285047596059\n","Epoch 2 .............. loss : 494.7172454598782 ....val_loss : 479.0339597155269\n","Epoch 3 .............. loss : 403.8643944989146 ....val_loss : 388.125852443045\n","Epoch 4 .............. loss : 331.0559254119759 ....val_loss : 315.67394558965\n","Epoch 5 .............. loss : 272.44802631944543 ....val_loss : 257.80096535791387\n","Epoch 6 .............. loss : 225.32104126553727 ....val_loss : 211.7461595039089\n","Epoch 7 .............. loss : 187.60578616146617 ....val_loss : 175.37471756759948\n","Epoch 8 .............. loss : 157.62037539699094 ....val_loss : 146.91491099254424\n","Epoch 9 .............. loss : 133.9379615740088 ....val_loss : 124.84238208175846\n","Epoch 10 .............. loss : 115.33306807953525 ....val_loss : 107.84460906755527\n","Epoch 11 .............. loss : 100.76383198721742 ....val_loss : 94.8136613248053\n","Epoch 12 .............. loss : 89.36281102397759 ....val_loss : 84.83959359519152\n","Epoch 13 .............. loss : 80.42414713510476 ....val_loss : 77.19470874462637\n","Epoch 14 .............. loss : 73.38501999017595 ....val_loss : 71.30927122086527\n","Epoch 15 .............. loss : 67.80394933610259 ....val_loss : 66.74384710569032\n","Epoch 16 .............. loss : 63.338980777709935 ....val_loss : 63.16320594326976\n","Epoch 17 .............. loss : 59.72772046662133 ....val_loss : 60.31410463055445\n","Epoch 18 .............. loss : 56.77014011013003 ....val_loss : 58.00697905732569\n","Epoch 19 .............. loss : 54.314382766974546 ....val_loss : 56.10095172821895\n","Epoch 20 .............. loss : 52.245467403626975 ....val_loss : 54.49191732965117\n","Epoch 21 .............. loss : 50.47654447278566 ....val_loss : 53.1034202822021\n","Epoch 22 .............. loss : 48.942161999056076 ....val_loss : 51.87970350441654\n","Epoch 23 .............. loss : 47.59303981617112 ....val_loss : 50.780330560710794\n","Epoch 24 .............. loss : 46.392019075413714 ....val_loss : 49.776027668240474\n","Epoch 25 .............. loss : 45.31096948445956 ....val_loss : 48.84553815905314\n","Epoch 26 .............. loss : 44.32847517552106 ....val_loss : 47.97331299490986\n","Epoch 27 .............. loss : 43.4281343598411 ....val_loss : 47.147866866640136\n","Epoch 28 .............. loss : 42.59732683484983 ....val_loss : 46.36064944995507\n","Epoch 29 .............. loss : 41.82632768413527 ....val_loss : 45.605311093475684\n","Epoch 30 .............. loss : 41.10766782791384 ....val_loss : 44.87726565591287\n","Epoch 31 .............. loss : 40.43565769907934 ....val_loss : 44.17345671665201\n","Epoch 32 .............. loss : 39.80600064159016 ....val_loss : 43.49221408000989\n","Epoch 33 .............. loss : 39.215436372136075 ....val_loss : 42.83306654260564\n","Epoch 34 .............. loss : 38.6613841238386 ....val_loss : 42.19640255910404\n","Epoch 35 .............. loss : 38.14160148197 ....val_loss : 41.582977151351066\n","Epoch 36 .............. loss : 37.65391501487248 ....val_loss : 40.99340130420351\n","Epoch 37 .............. loss : 37.19607734993321 ....val_loss : 40.427797681822355\n","Epoch 38 .............. loss : 36.765757738138504 ....val_loss : 39.88571176993216\n","Epoch 39 .............. loss : 36.36061993592687 ....val_loss : 39.366225827214805\n","Epoch 40 .............. loss : 35.9784234656955 ....val_loss : 38.868155209383524\n","Epoch 41 .............. loss : 35.617102700902 ....val_loss : 38.390229029964544\n","Epoch 42 .............. loss : 35.27480708792659 ....val_loss : 37.93121150658964\n","Epoch 43 .............. loss : 34.94990589755357 ....val_loss : 37.489960848761314\n","Epoch 44 .............. loss : 34.64096896707942 ....val_loss : 37.06544069044981\n","Epoch 45 .............. loss : 34.34673549473888 ....val_loss : 36.656703391349964\n","Epoch 46 .............. loss : 34.06608054688218 ....val_loss : 36.26286278090327\n","Epoch 47 .............. loss : 33.79798576157045 ....val_loss : 35.8830693990944\n","Epoch 48 .............. loss : 33.54151756594019 ....val_loss : 35.51649538738862\n","Epoch 49 .............. loss : 33.295813469490774 ....val_loss : 35.1623304451514\n","Epoch 50 .............. loss : 33.06007504271835 ....val_loss : 34.81978629766011\n","Epoch 51 .............. loss : 32.83356527482038 ....val_loss : 34.48810562414441\n","Epoch 52 .............. loss : 32.61560802327613 ....val_loss : 34.166571869850216\n","Epoch 53 .............. loss : 32.40558784871422 ....val_loss : 33.85451772047728\n","Epoch 54 .............. loss : 32.202949254775206 ....val_loss : 33.551331322479314\n","Epoch 55 .............. loss : 32.007194946988 ....val_loss : 33.25646015967647\n","Epoch 56 .............. loss : 31.817883087859673 ....val_loss : 32.96941282770702\n","Epoch 57 .............. loss : 31.634623681634665 ....val_loss : 32.68975895187364\n","Epoch 58 .............. loss : 31.457074246267982 ....val_loss : 32.41712736155871\n","Epoch 59 .............. loss : 31.28493489871303 ....val_loss : 32.151202510159074\n","Epoch 60 .............. loss : 31.11794294998327 ....val_loss : 31.89171910094423\n","Epoch 61 .............. loss : 30.955867111220783 ....val_loss : 31.63845498126893\n","Epoch 62 .............. loss : 30.798501459312636 ....val_loss : 31.391222584969668\n","Epoch 63 .............. loss : 30.645659386547436 ....val_loss : 31.149859473979227\n","Epoch 64 .............. loss : 30.497167833436613 ....val_loss : 30.914218762685792\n","Epoch 65 .............. loss : 30.352862142074976 ....val_loss : 30.68416031040627\n","Epoch 66 .............. loss : 30.212581843342793 ....val_loss : 30.45954348544016\n","Epoch 67 .............. loss : 30.076167599880154 ....val_loss : 30.240222049671715\n","Epoch 68 .............. loss : 29.943459387228504 ....val_loss : 30.026041357434682\n","Epoch 69 .............. loss : 29.81429584334349 ....val_loss : 29.81683770707524\n","Epoch 70 .............. loss : 29.688514589159947 ....val_loss : 29.612439416054652\n","Epoch 71 .............. loss : 29.565953245530167 ....val_loss : 29.41266905566337\n","Epoch 72 .............. loss : 29.446450851868157 ....val_loss : 29.217346276557524\n","Epoch 73 .............. loss : 29.3298494201223 ....val_loss : 29.026290745082914\n","Epoch 74 .............. loss : 29.2159954161379 ....val_loss : 28.839324845115105\n","Epoch 75 .............. loss : 29.104741029809762 ....val_loss : 28.656275939766143\n","Epoch 76 .............. loss : 28.99594516068419 ....val_loss : 28.47697810555209\n","Epoch 77 .............. loss : 28.889474098142035 ....val_loss : 28.301273337410766\n","Epoch 78 .............. loss : 28.785201911977875 ....val_loss : 28.12901227622496\n","Epoch 79 .............. loss : 28.683010591008 ....val_loss : 27.96005453707506\n","Epoch 80 .............. loss : 28.582789977236505 ....val_loss : 27.7942687240216\n","Epoch 81 .............. loss : 28.48443754459485 ....val_loss : 27.63153221298081\n","Epoch 82 .............. loss : 28.38785806754813 ....val_loss : 27.47173077380462\n","Epoch 83 .............. loss : 28.292963218445838 ....val_loss : 27.314758089862796\n","Epoch 84 .............. loss : 28.19967112514306 ....val_loss : 27.16051522061794\n","Epoch 85 .............. loss : 28.10790591323169 ....val_loss : 27.00891004114925\n","Epoch 86 .............. loss : 28.01759725079982 ....val_loss : 26.859856682858847\n","Epoch 87 .............. loss : 27.92867990823961 ....val_loss : 26.713274991787337\n","Epoch 88 .............. loss : 27.841093341289376 ....val_loss : 26.56909001493585\n","Epoch 89 .............. loss : 27.75478130214716 ....val_loss : 26.427231520499202\n","Epoch 90 .............. loss : 27.669691480994977 ....val_loss : 26.287633554686362\n","Epoch 91 .............. loss : 27.58577517847407 ....val_loss : 26.15023403557705\n","Epoch 92 .............. loss : 27.5029870084069 ....val_loss : 26.014974383004574\n","Epoch 93 .............. loss : 27.421284629242212 ....val_loss : 25.881799182570322\n","Epoch 94 .............. loss : 27.340628502200172 ....val_loss : 25.750655881423725\n","Epoch 95 .............. loss : 27.26098167382669 ....val_loss : 25.62149451325792\n","Epoch 96 .............. loss : 27.18230958056549 ....val_loss : 25.4942674499789\n","Epoch 97 .............. loss : 27.10457987296989 ....val_loss : 25.36892917763184\n","Epoch 98 .............. loss : 27.027762257267355 ....val_loss : 25.245436094358304\n","Epoch 99 .............. loss : 26.951828352129755 ....val_loss : 25.12374632837613\n","Epoch 100 .............. loss : 26.87675155867179 ....val_loss : 25.003819574193948\n","Epoch 101 .............. loss : 26.80250694188499 ....val_loss : 24.885616945477768\n","Epoch 102 .............. loss : 26.72907112190448 ....val_loss : 24.76910084317046\n","Epoch 103 .............. loss : 26.656422173695486 ....val_loss : 24.654234837620933\n","Epoch 104 .............. loss : 26.584539533929245 ....val_loss : 24.540983563608503\n","Epoch 105 .............. loss : 26.513403913993365 ....val_loss : 24.429312627250923\n","Epoch 106 .............. loss : 26.442997218245473 ....val_loss : 24.31918852386517\n","Epoch 107 .............. loss : 26.37330246677077 ....val_loss : 24.210578565912243\n","Epoch 108 .............. loss : 26.30430372204368 ....val_loss : 24.10345082020478\n","Epoch 109 .............. loss : 26.235986019018913 ....val_loss : 23.997774053593595\n","Epoch 110 .............. loss : 26.16833529828923 ....val_loss : 23.893517686379237\n","Epoch 111 .............. loss : 26.101338342044805 ....val_loss : 23.79065175272151\n","Epoch 112 .............. loss : 26.0349827126528 ....val_loss : 23.68914686734416\n","Epoch 113 .............. loss : 25.969256693745816 ....val_loss : 23.588974197858512\n","Epoch 114 .............. loss : 25.904149233764535 ....val_loss : 23.49010544205569\n","Epoch 115 .............. loss : 25.83964989194355 ....val_loss : 23.39251280954827\n","Epoch 116 .............. loss : 25.77574878676168 ....val_loss : 23.296169007174143\n","Epoch 117 .............. loss : 25.712436546898793 ....val_loss : 23.201047227611557\n","Epoch 118 .............. loss : 25.64970426475255 ....val_loss : 23.107121140692442\n","Epoch 119 .............. loss : 25.587543452570834 ....val_loss : 23.014364886941628\n","Epoch 120 .............. loss : 25.525946001251373 ....val_loss : 22.922753072911924\n","Epoch 121 .............. loss : 25.46490414184905 ....val_loss : 22.83226076792713\n","Epoch 122 .............. loss : 25.404410409816638 ....val_loss : 22.74286350188819\n","Epoch 123 .............. loss : 25.344457611986456 ....val_loss : 22.65453726384\n","Epoch 124 .............. loss : 25.28503879627986 ....val_loss : 22.567258501036637\n","Epoch 125 .............. loss : 25.226147224110633 ....val_loss : 22.48100411828211\n","Epoch 126 .............. loss : 25.16777634542719 ....val_loss : 22.39575147736038\n","Epoch 127 .............. loss : 25.10991977631833 ....val_loss : 22.31147839640187\n","Epoch 128 .............. loss : 25.05257127908885 ....val_loss : 22.22816314906518\n","Epoch 129 .............. loss : 24.9957247446948 ....val_loss : 22.145784463440464\n","Epoch 130 .............. loss : 24.93937417741419 ....val_loss : 22.064321520605528\n","Epoch 131 .............. loss : 24.88351368161772 ....val_loss : 21.983753952787616\n","Epoch 132 .............. loss : 24.82813745049533 ....val_loss : 21.904061841102322\n","Epoch 133 .............. loss : 24.773239756588698 ....val_loss : 21.8252257128568\n","Epoch 134 .............. loss : 24.718814943976415 ....val_loss : 21.74722653841746\n","Epoch 135 .............. loss : 24.664857421957816 ....val_loss : 21.670045727652816\n","Epoch 136 .............. loss : 24.61136166008277 ....val_loss : 21.59366512597048\n","Epoch 137 .............. loss : 24.558322184378078 ....val_loss : 21.51806700997318\n","Epoch 138 .............. loss : 24.505733574626102 ....val_loss : 21.443234082763546\n","Epoch 139 .............. loss : 24.453590462557475 ....val_loss : 21.369149468929805\n","Epoch 140 .............. loss : 24.401887530827313 ....val_loss : 21.295796709246424\n","Epoch 141 .............. loss : 24.350619512652397 ....val_loss : 21.223159755123795\n","Epoch 142 .............. loss : 24.299781191995653 ....val_loss : 21.151222962841146\n","Epoch 143 .............. loss : 24.249367404193457 ....val_loss : 21.079971087595062\n","Epoch 144 .............. loss : 24.19937303693042 ....val_loss : 21.00938927739476\n","Epoch 145 .............. loss : 24.149793031475543 ....val_loss : 20.939463066832875\n","Epoch 146 .............. loss : 24.100622384102994 ....val_loss : 20.870178370758428\n","Epoch 147 .............. loss : 24.051856147629017 ....val_loss : 20.801521477875614\n","Epoch 148 .............. loss : 24.00348943300558 ....val_loss : 20.733479044290082\n","Epoch 149 .............. loss : 23.955517410918613 ....val_loss : 20.66603808702128\n","Epoch 150 .............. loss : 23.907935313346876 ....val_loss : 20.59918597749719\n"]}]},{"cell_type":"code","source":["plot_learning_curve(h)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":472},"id":"1tLPfhXNa1mV","executionInfo":{"status":"ok","timestamp":1687392643125,"user_tz":-60,"elapsed":479,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"b3f2697f-c167-4cc7-ae90-808df5086dbb"},"execution_count":450,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABP0klEQVR4nO3deXxU9b3/8deZmWSyT1gTIquKhSAoBYWIXq1QgqIWwVotVbA85GqBilyp5afi1orSulyrglTrctWieNVavGgRFVuNgCwKIouVTSEJWzLZZj+/P2YyZFgDZOYkk/fz8TiPzJzzPed8vrGXvO/3fM85hmmaJiIiIiJJymZ1ASIiIiLxpLAjIiIiSU1hR0RERJKawo6IiIgkNYUdERERSWoKOyIiIpLUFHZEREQkqSnsiIiISFJT2BEREZGkprAjIs1e9+7dGT9+vNVliEgLpbAj0ko8//zzGIbB559/bnUpLY7H4+HRRx9l0KBBuFwu0tLSOOOMM5g8eTKbNm2yujwROQaH1QWIiBzLxo0bsdms+f/N9uzZw4gRI1i5ciWXXXYZP//5z8nKymLjxo3Mnz+fefPm4fP5LKlNRBpHYUdEEioQCBAKhUhNTW30Pk6nM44VHd348eNZvXo1r7/+OmPGjInZdv/993PHHXc0yXlO5PciIo2jy1giEuP777/nl7/8JXl5eTidTvr06cNf/vKXmDY+n4+ZM2cyYMAAXC4XmZmZXHDBBXz44Ycx7bZu3YphGPzxj3/kscce47TTTsPpdLJ+/XruueceDMPgm2++Yfz48eTm5uJyubjhhhuora2NOc7Bc3bqL8l98sknTJs2jQ4dOpCZmcmVV17J7t27Y/YNhULcc889FBQUkJGRwY9+9CPWr1/fqHlAy5Yt45133mHChAmHBB0Ih7A//vGP0e8XXXQRF1100SHtxo8fT/fu3Y/5e1m9ejUOh4N77733kGNs3LgRwzB44oknousqKiqYOnUqXbp0wel0cvrpp/PQQw8RCoWO2i+R1kYjOyISVVZWxuDBgzEMg8mTJ9OhQwcWLVrEhAkTcLvdTJ06FQC3280zzzzDtddey4033khVVRXPPvssxcXFLF++nLPPPjvmuM899xwej4eJEyfidDpp27ZtdNvVV19Njx49mDVrFqtWreKZZ56hY8eOPPTQQ8esd8qUKbRp04a7776brVu38thjjzF58mReffXVaJsZM2Ywe/ZsLr/8coqLi/niiy8oLi7G4/Ec8/hvv/02ANddd10jfnvH7+DfS6dOnbjwwgt57bXXuPvuu2Pavvrqq9jtdn76058CUFtby4UXXsj333/Pf/7nf9K1a1c+/fRTZsyYwa5du3jsscfiUrNIi2SKSKvw3HPPmYC5YsWKI7aZMGGC2alTJ3PPnj0x66+55hrT5XKZtbW1pmmaZiAQML1eb0yb/fv3m3l5eeYvf/nL6LotW7aYgJmTk2OWl5fHtL/77rtNIKa9aZrmlVdeabZr1y5mXbdu3cxx48Yd0pdhw4aZoVAouv7WW2817Xa7WVFRYZqmaZaWlpoOh8McNWpUzPHuueceE4g55uFceeWVJmDu37//qO3qXXjhheaFF154yPpx48aZ3bp1i34/2u/l6aefNgFz7dq1MesLCwvNiy++OPr9/vvvNzMzM81NmzbFtPvtb39r2u12c/v27Y2qWaQ10GUsEQHANE3+93//l8svvxzTNNmzZ090KS4uprKyklWrVgFgt9ujc0tCoRD79u0jEAgwcODAaJuGxowZQ4cOHQ573ptuuinm+wUXXMDevXtxu93HrHnixIkYhhGzbzAYZNu2bQAsWbKEQCDAr371q5j9pkyZcsxjA9EasrOzG9X+eB3u9zJ69GgcDkfM6NS6detYv349P/vZz6LrFixYwAUXXECbNm1i/lsNGzaMYDDIxx9/HJeaRVoiXcYSEQB2795NRUUF8+bNY968eYdtU15eHv38wgsv8PDDD7Nhwwb8fn90fY8ePQ7Z73Dr6nXt2jXme5s2bQDYv38/OTk5R635aPsC0dBz+umnx7Rr27ZttO3R1J+/qqqK3NzcY7Y/Xof7vbRv356hQ4fy2muvcf/99wPhS1gOh4PRo0dH223evJkvv/zyiCGy4X8rkdZOYUdEAKKTWn/xi18wbty4w7bp168fAC+99BLjx49n1KhRTJ8+nY4dO2K325k1axb//ve/D9kvPT39iOe12+2HXW+a5jFrPpl9G6NXr14ArF27lgsuuOCY7Q3DOOy5g8HgYdsf6fdyzTXXcMMNN7BmzRrOPvtsXnvtNYYOHUr79u2jbUKhED/+8Y/5zW9+c9hjnHHGGcesV6S1UNgREQA6dOhAdnY2wWCQYcOGHbXt66+/zqmnnsobb7wRcxnp4Em1VuvWrRsA33zzTcwoyt69e6OjP0dz+eWXM2vWLF566aVGhZ02bdrw7bffHrK+foSpsUaNGsV//ud/Ri9lbdq0iRkzZsS0Oe2006iurj7mfysR0a3nIhJht9sZM2YM//u//8u6desO2d7wlu76EZWGoxjLli2jpKQk/oUeh6FDh+JwOJgzZ07M+oa3bx9NUVERI0aM4JlnnuGtt946ZLvP5+O2226Lfj/ttNPYsGFDzO/qiy++4JNPPjmuunNzcykuLua1115j/vz5pKamMmrUqJg2V199NSUlJbz33nuH7F9RUUEgEDiuc4okM43siLQyf/nLX3j33XcPWX/LLbfw4IMP8uGHHzJo0CBuvPFGCgsL2bdvH6tWreL9999n3759AFx22WW88cYbXHnllYwcOZItW7Ywd+5cCgsLqa6uTnSXjigvL49bbrmFhx9+mCuuuIIRI0bwxRdfsGjRItq3bx8zKnUkL774IsOHD2f06NFcfvnlDB06lMzMTDZv3sz8+fPZtWtX9Fk7v/zlL3nkkUcoLi5mwoQJlJeXM3fuXPr06dOoCdcN/exnP+MXv/gFTz31FMXFxYfMGZo+fTpvv/02l112GePHj2fAgAHU1NSwdu1aXn/9dbZu3Rpz2UukNVPYEWllDh7lqDd+/Hg6d+7M8uXLue+++3jjjTd46qmnaNeuHX369Il57s348eMpLS3l6aef5r333qOwsJCXXnqJBQsW8NFHHyWoJ43z0EMPkZGRwZ///Gfef/99ioqK+Mc//sH5559PWlraMffv0KEDn376KU899RSvvvoqd9xxBz6fj27dunHFFVdwyy23RNv27t2bF198kZkzZzJt2jQKCwv5n//5H1555ZXj/r1cccUVpKenU1VVFXMXVr2MjAyWLl3KAw88wIIFC3jxxRfJycnhjDPO4N5778Xlch3X+USSmWE21Uw+EZEWoqKigjZt2vC73/2uyV73ICLNl+bsiEhSq6urO2Rd/dOFD/dqBxFJPrqMJSJJ7dVXX+X555/n0ksvJSsri3/961/89a9/Zfjw4QwZMsTq8kQkARR2RCSp9evXD4fDwezZs3G73dFJy7/73e+sLk1EEkRzdkRERCSpac6OiIiIJDWFHREREUlqmrND+B0zO3fuJDs7u1EPGRMRERHrmaZJVVUVBQUF2GxHHr9R2AF27txJly5d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xosvvsjjjz/epAUmNZuNkNMFQLBGYUdERCQeTijs1NbWkp2dDcA//vEPRo8ejc1mY/DgwWzbtq1JC0x6kdvPU7yVeANBi4sRERFJPicUdk4//XTeeustduzYwXvvvcfw4cMBKC8vJycnp0kLTHa2zPCt+m2MKvbqjiwREZEmd0JhZ+bMmdx22210796dc889l6KiIiA8ytO/f/8mLTDZGZkdAGhvVOpZOyIiInFwQreeX3XVVZx//vns2rUr+owdgKFDh3LllVc2WXGtQlb47jWFHRERkfg4obADkJ+fT35+fvTt5507d9YDBU9EJOx0oJI9VbqMJSIi0tRO6DJWKBTivvvuw+Vy0a1bN7p160Zubi73338/oVCoqWtMbg1GdvRgQRERkaZ3QmHnjjvu4IknnuDBBx9k9erVrF69mgceeIA//elP3HXXXY0+zpw5c+jXrx85OTnk5ORQVFTEokWLots9Hg+TJk2iXbt2ZGVlMWbMGMrKymKOsX37dkaOHElGRgYdO3Zk+vTpBAKBE+mWNTIjIztGBburFHZERESa2gldxnrhhRd45plnom87B+jXrx+nnHIKv/rVr/j973/fqON07tyZBx98kJ49e2KaJi+88AI/+clPWL16NX369OHWW2/lnXfeYcGCBbhcLiZPnszo0aP55JNPAAgGg4wcOZL8/Hw+/fRTdu3axfXXX09KSgoPPPDAiXQt8bLyAGiP5uyIiIjEg2Gapnm8O6WlpfHll19yxhlnxKzfuHEjZ599NnV1dSdcUNu2bfnDH/7AVVddRYcOHXjllVe46qqrANiwYQO9e/empKSEwYMHs2jRIi677DJ27txJXl44NMydO5fbb7+d3bt3k5qa2qhzut1uXC4XlZWVib91ft+38Hh/6sxUbij4G/P/87zEnl9ERKSFauzf7xO6jHXWWWfxxBNPHLL+iSeeoF+/fidySILBIPPnz6empoaioiJWrlyJ3+9n2LBh0Ta9evWia9eulJSUAFBSUkLfvn2jQQeguLgYt9vNV199dcRzeb1e3G53zGKZyGWsdMNHTXWldXWIiIgkqRO6jDV79mxGjhzJ+++/H33GTklJCTt27OD//u//jutYa9eupaioCI/HQ1ZWFm+++SaFhYWsWbOG1NRUcnNzY9rn5eVRWloKQGlpaUzQqd9ev+1IZs2axb333ntcdcaNM4uQIwNboBajutzqakRERJLOCY3sXHjhhWzatIkrr7ySiooKKioqGD16NF999RX/8z//c1zH+sEPfsCaNWtYtmwZN998M+PGjWP9+vUnUlajzZgxg8rKyuiyY8eOuJ7vWMzIHVmpnj34ArqbTUREpCmd8HN2CgoKDpmI/MUXX/Dss88yb968Rh8nNTWV008/HYABAwawYsUK/vu//5uf/exn+Hw+KioqYkZ3ysrKyM/PB8LP+lm+fHnM8erv1qpvczhOpxOn09noGuPNlpUHFVvpYFSyt8ZLJ1e61SWJiIgkjRMa2YmnUCiE1+tlwIABpKSksGTJkui2jRs3sn379uils6KiItauXUt5+YHLP4sXLyYnJ4fCwsKE136ijKwGr4zQgwVFRESa1AmP7DSFGTNmcMkll9C1a1eqqqp45ZVX+Oijj3jvvfdwuVxMmDCBadOm0bZtW3JycpgyZQpFRUUMHjwYgOHDh1NYWMh1113H7NmzKS0t5c4772TSpEnNauTmmOpvP9crI0RERJqcpWGnvLyc66+/nl27duFyuejXrx/vvfceP/7xjwF49NFHsdlsjBkzBq/XS3FxMU899VR0f7vdzsKFC7n55pspKioiMzOTcePGcd9991nVpRMTfWVEhZ6iLCIi0sSOK+yMHj36qNsrKiqO6+TPPvvsUbenpaXx5JNP8uSTTx6xTbdu3Y77DrBmpz7sGG42K+yIiIg0qeMKOy6X65jbr7/++pMqqFVq8MqIEs3ZERERaVLHFXaee+65eNXRujWYs6PLWCIiIk2r2d2N1SpF7sbqQCV73B6LixEREUkuCjvNQeQyltPwU1u93+JiREREkovCTnOQmkEwJQsAo7rM4mJERESSi8JOcxF9ZcRe/EG9MkJERKSpKOw0E7bIJOUORiX7anRHloiISFNR2GkmGr4yYneV7sgSERFpKgo7zYVuPxcREYkLhZ3mouErI9wKOyIiIk1FYae5iISd9kYlOyvrLC5GREQkeSjsNBfRV0ZUsqtCDxYUERFpKgo7zUWDOTu79BRlERGRJqOw01zU341FJbv211pcjIiISPJQ2Gkuoq+MCFDj3mtxMSIiIslDYae5SEnDdOYAkO7bi9vjt7ggERGR5KCw04wYWZqkLCIi0tQUdpqTyCTljlTo9nMREZEmorDTnOQUAJBv7KW0UiM7IiIiTUFhpzlxdQagwNjLrgqN7IiIiDQFhZ3mJOcUIBx2dmpkR0REpEko7DQnri5AZGRHc3ZERESahMJOc+IKj+x0MvbqbiwREZEmorDTnETm7LQzqthfWYlpmhYXJCIi0vIp7DQnabmYKZkA5AZ2U1mnBwuKiIicLIWd5sQwMKJ3ZO1hpy5liYiInDSFnebGdeCOLE1SFhEROXkKO81N/cgOuv1cRESkKSjsNDc54bDTydhLqUZ2RERETprCTnMT8xRljeyIiIicLIWd5sbV8CnKGtkRERE5WQo7zU3kKcqd9H4sERGRJqGw09xE3nyeaXipde/VgwVFREROksJOc5OSjpnRHoD2wd3srfFZXJCIiEjLprDTDBnReTt7KNXt5yIiIidFYac5is7b2cdOzdsRERE5KQo7zVFOeGTnFGMP3+1X2BERETkZCjvNkevAgwW37a2xuBgREZGWTWGnOWrwrJ2te2stLkZERKRlU9hpjiJzdgo0siMiInLSFHaao8icnXz2sXN/Df5gyOKCREREWi6FneYoOx/TsOMwQrQJ7dcdWSIiIidBYac5stkxIk9SPsXYo3k7IiIiJ0Fhp7lq8PZzzdsRERE5cQo7zVVuNwC6GmVs3aORHRERkROlsNNctTsdgB5GqUZ2REREToKlYWfWrFmcc845ZGdn07FjR0aNGsXGjRtj2ng8HiZNmkS7du3IyspizJgxlJWVxbTZvn07I0eOJCMjg44dOzJ9+nQCgUAiu9L02p0KQA9bKVsVdkRERE6YpWFn6dKlTJo0ic8++4zFixfj9/sZPnw4NTUH/rjfeuut/P3vf2fBggUsXbqUnTt3Mnr06Oj2YDDIyJEj8fl8fPrpp7zwwgs8//zzzJw504ouNZ22pwHQ3Shlx746giHT4oJERERaJsM0zWbzV3T37t107NiRpUuX8h//8R9UVlbSoUMHXnnlFa666ioANmzYQO/evSkpKWHw4MEsWrSIyy67jJ07d5KXlwfA3Llzuf3229m9ezepqanHPK/b7cblclFZWUlOTk5c+9ho3iqYFZ6k3M/zZ/7v9svo3CbD4qJERESaj8b+/W5Wc3YqKysBaNu2LQArV67E7/czbNiwaJtevXrRtWtXSkpKACgpKaFv377RoANQXFyM2+3mq6++SmD1TcyZDVnhPnU3Stmm289FREROSLMJO6FQiKlTpzJkyBDOPPNMAEpLS0lNTSU3NzembV5eHqWlpdE2DYNO/fb6bYfj9Xpxu90xS7PU4FKW5u2IiIicmGYTdiZNmsS6deuYP39+3M81a9YsXC5XdOnSpUvcz3lC2oXDTg+N7IiIiJywZhF2Jk+ezMKFC/nwww/p3LlzdH1+fj4+n4+KioqY9mVlZeTn50fbHHx3Vv33+jYHmzFjBpWVldFlx44dTdibJhQJO91tpWzdo5EdERGRE2Fp2DFNk8mTJ/Pmm2/ywQcf0KNHj5jtAwYMICUlhSVLlkTXbdy4ke3bt1NUVARAUVERa9eupby8PNpm8eLF5OTkUFhYeNjzOp1OcnJyYpZmqW39yM4ujeyIiIicIIeVJ580aRKvvPIKf/vb38jOzo7OsXG5XKSnp+NyuZgwYQLTpk2jbdu25OTkMGXKFIqKihg8eDAAw4cPp7CwkOuuu47Zs2dTWlrKnXfeyaRJk3A6nVZ27+Q1fLDgvmpCIRObzbC4KBERkZbF0rAzZ84cAC666KKY9c899xzjx48H4NFHH8VmszFmzBi8Xi/FxcU89dRT0bZ2u52FCxdy8803U1RURGZmJuPGjeO+++5LVDfip214pMtl1JLur6S8yku+K83iokRERFqWZvWcHas0y+fs1HukD7i/Y7T3Hn5z4/UMPrWd1RWJiIg0Cy3yOTtyGA3uyNqiScoiIiLHTWGnuWtwR9bG0iqLixEREWl5FHaauwZ3ZCnsiIiIHD+FneauwR1ZG0rdaIqViIjI8VHYae7aHXhlxP5aH7urvBYXJCIi0rIo7DR3ud3AsJFpeOlIBRt0KUtEROS4KOw0d45UyO0KhC9lad6OiIjI8VHYaQki83ZOte3UyI6IiMhxUthpCTqG3/HVy9jOhlK3xcWIiIi0LAo7LUF+PwAKbdvYXF5NIBiyuCAREZGWQ2GnJcg/E4BCYzv+QICtegO6iIhIoynstATteoLdSabhoatRrktZIiIix0FhpyWwOyAvPG+nt7Fdd2SJiIgcB4WdliIvcinLtlV3ZImIiBwHhZ2Won6SsrFNIzsiIiLHQWGnpcjvC4TvyNq+r5Zqb8DigkRERFoGhZ2WIq8PAAXGPnKpYlOZRndEREQaQ2GnpUjLgTbdAeht287Xu3RHloiISGMo7LQk9ZeyjK2s2V5hbS0iIiIthMJOS9LgScort++3uBgREZGWQWGnJck78CTlb3fXUFHrs7ggERGR5k9hpyWJXMbqafueVPys1qUsERGRY1LYaUlcnSEtFwdBehrfs3KbLmWJiIgci8JOS2IYDZ63s5VVmrcjIiJyTAo7Lc0pPwRggLGJL3ZUEAiGLC5IRESkeVPYaWm6DQFgsH0jNb4gG/VwQRERkaNS2GlpugwCDLobu+hABas0SVlEROSoFHZamvTc6C3o59g2sFqTlEVERI5KYacl6lYEwDm2jXq4oIiIyDEo7LREXcNhZ5BtA9v21rKn2mtxQSIiIs2Xwk5L1O08AHrZtpNDDat0KUtEROSIFHZaoux8aHsqNkwG2DZR8u1eqysSERFpthR2WqrI6M65tg0s3bjb4mJERESaL4WdlqprOOwMsm3g2z01bN9ba3FBIiIizZPCTksVGdnpZ9tCGl4+2lRucUEiIiLNk8JOS9WmO2R3wkGA/rZv+EiXskRERA5LYaelMozo6M4Q2zo+/fcePP6gxUWJiIg0Pwo7LdkZIwC4JGUVHn+I5Vv2WVyQiIhI86Ow05L1/DHYHJxm7qC7sUuXskRERA5DYaclS28D3c8H4Me2lZqkLCIichgKOy1dr8sAKLav5NvdNezYp1vQRUREGlLYael+cAkAP7Rtoh2VfLBBozsiIiINKey0dK7O0OlsbJgMta/ib2u+t7oiERGRZkVhJxnUX8qyfc6q7RVs3VNjcUEiIiLNh8JOMug1EoAL7OvIwMObqzW6IyIiUk9hJxl07A1tepCKnwttX/Dm6u8xTdPqqkRERJoFS8POxx9/zOWXX05BQQGGYfDWW2/FbDdNk5kzZ9KpUyfS09MZNmwYmzdvjmmzb98+xo4dS05ODrm5uUyYMIHq6uoE9qIZMAwovAKAn6X8k+37alm5bb/FRYmIiDQPloadmpoazjrrLJ588snDbp89ezaPP/44c+fOZdmyZWRmZlJcXIzH44m2GTt2LF999RWLFy9m4cKFfPzxx0ycODFRXWg+fjgOgP8wVnMKu3lDl7JEREQAMMxmcr3DMAzefPNNRo0aBYRHdQoKCviv//ovbrvtNgAqKyvJy8vj+eef55prruHrr7+msLCQFStWMHDgQADeffddLr30Ur777jsKCgoadW63243L5aKyspKcnJy49C8hXvwJfPsRfwqM4s+On7PizmE4HXarqxIREYmLxv79brZzdrZs2UJpaSnDhg2LrnO5XAwaNIiSkhIASkpKyM3NjQYdgGHDhmGz2Vi2bFnCa7bcwF8C8HPHR9R5PCz5Ws/cERERabZhp7S0FIC8vLyY9Xl5edFtpaWldOzYMWa7w+Ggbdu20TaH4/V6cbvdMUtS+MGlkJVHOyr4se1znvtki9UViYiIWK7Zhp14mjVrFi6XK7p06dLF6pKahj0Ffng9AL9wLGHF1v2s3KY3oYuISOvWbMNOfn4+AGVlZTHry8rKotvy8/MpL4+9VBMIBNi3b1+0zeHMmDGDysrK6LJjx44mrt5CPxwHho3zbF9xqrGTOR99a3VFIiIilmq2YadHjx7k5+ezZMmS6Dq3282yZcsoKioCoKioiIqKClauXBlt88EHHxAKhRg0aNARj+10OsnJyYlZkkZuF+hZDMBExzu8/3UZm8uqLC5KRETEOpaGnerqatasWcOaNWuA8KTkNWvWsH37dgzDYOrUqfzud7/j7bffZu3atVx//fUUFBRE79jq3bs3I0aM4MYbb2T58uV88sknTJ48mWuuuabRd2IlpSG3APBT+1JONXby9Mca3RERkdbL0rDz+eef079/f/r37w/AtGnT6N+/PzNnzgTgN7/5DVOmTGHixImcc845VFdX8+6775KWlhY9xssvv0yvXr0YOnQol156Keeffz7z5s2zpD/NRrciOGMEdkJMcyzgb2u+Z1dlndVViYiIWKLZPGfHSknznJ2GStfB3PMBk8u9v6PvuRfxwJV9ra5KRESkybT45+zISco/E/pdDcB0x6v8dfl21n1faXFRIiIiiaewk8x+9P/AlsJ/2NcyxFjLzL+tIxRq9QN5IiLSyijsJLM23eGcCQDMSnmWjdt38abemSUiIq2Mwk6y+9Ed4OpKF6Ocuxz/w6xFG6jy+K2uSkREJGEUdpJdWg5cORcTg2scH9G/9hN+/87XVlclIiKSMAo7rUH3IRjnTQFgVsozLF6xjrd0OUtERFoJhZ3W4uI7oWMf2htu5qY+yr1vruSb8mqrqxIREYk7hZ3WwuGEq/6CmebiHNsmZpuPMeWlFdT5glZXJiIiElcKO61Jx14Y1/wV0+7kx/aVXLfvv5k6fxWBYMjqykREROJGYae16T4E46pnMQ0bP3d8yOBNf+D2Bav1/B0REUlaCjutUe/LMUY+AsANjvcY8dV07ntjBXpziIiIJCOFndZq4A1w1XMEban82L6SMV/eyIOvfoBfl7RERCTJKOy0ZmeOxj5+IZ7UNvS1beVXX/+CZ554gMoan9WViYiINBmFndau6yDSbvqAyjZn4jJquXn/H1j76GVs3bLZ6spERESahMKOQNtTcU1eStnA2/Dj4PzAMvKeP48vnr+VUO1+q6sTERE5KQo7EmZ3kHfZXVRd9w82pRaSbvg4a+tfqPlDXyoW3Q/Vu62uUERE5IQYpm7Bwe1243K5qKysJCcnx+pyLBcKhli68AW6rPojpxvfARAwUgj1GUPqoAnQ+RwwDIurFBGR1q6xf78VdlDYOZKt5W7eefUpztu9gP62b6Lrg7ndsZ/1MygcBR17K/iIiIglFHaOg8LO0X20sZw33n6LC91vM8K2nEzDe2Bjblf4waVw6o+g62BIz7WsThERaV0Udo6Dws6xBYIh3v5iJ89/tJ7ue5Zyhf0TzretI83wN2hlQH5f6H4+dBsC3c6DjLaW1SwiIslNYec4KOw0nmmafLRxN8/861tWfrOT823ruNi2ivPsG+hu7Dp0h3Y9oeBs6HQ2dDorvKTpdywiIidPYec4KOycmO17a3nt8x3876rv2FXpoSP7GWT7mvMcG/iP1E2cEth++B3bngb5Z0KHXtDhB9ChN7Q7LfxmdhERkUZS2DkOCjsnJxQyWbV9P++s3cW760rZVekBoC1u+tm+ZVDaDoZkfsdp/m/I9Bxm9AfAsEPbUyPhp1d44nO708PrNBIkIiKHobBzHBR2mo5pmnxTXs0/N+/hn5t389m3+6jzB6Pb2+JmYOo2zs/dw1nOMroFt5NT/W9svqojHzSjfTj0HLL00JwgEZFWTGHnOCjsxI83EGTVtgr+9c1uVm2r4MvvKqjxBQ9qZXJaWhUX5u5lQEYZZ9i+J9+3lczq7dhqj/EwwzTXgfDTpju4uoTvEMvtCq7OkJIer66JiIjFFHaOg8JO4gRD4ZGfNTv2s2ZHBWt2VPJNeRX+4OH/Z3hKup9BuW7OythLz5TddDZ30c77PenV27BVlx77hJkdIsGnC+R2AVckCOV2CYchZ46eEyQi0kIp7BwHhR1r+QIhvt1TzYZdVWworWJDqZuNpVXRuT9H0jkLBroq6ePcw+mOMgrYTbtAGdl1u0it+Q7DV3Psk6dkQnY+5BRAdifI6RT+md3pwLqsPHCkNlFvRUSkqSjsHAeFneapxhtg694atu6pZeveGrbsCS9b99Swt8Z3jL1NOqd5OTurkl7plXRz7KWA3XQIlpPrKyWjbicOb0Xji8nsEA5FmR0Ov2RFfma0h5S0k+m2iIg0ksLOcVDYaXkq6/xs3VPDd/vr+L6ilp0VHr7bX8fOijq+r6ijss5/zGOk4yHP2M/paVWcllZFl5QKCmz76WDup21oLzn+3WR6d2MzA8dXnDMHMttDZsfIzw7hn+ltwxOq09uEP6e3iSy5YLOf2C9CRKQVU9g5Dgo7yafaG2BXRR3fVdRRVumhvMpLeZWHMreX8iovu90edld7jzhXqJ5BiDZUk2/so6NRQTvc5DuqOCWlmo42N+0NN22oxBWqJCu4H8fxBqN6aa7YAJTRMAy1Dd9+78wJt2v42ZkDdseJnVNEpIVr7N9v/SspSSnL6aBnXjY987KP2CYUMqmo81Ne5WFPlY99tT721/jYV+Njf62PvTX1313sqenA5lpfOBz5CC+HMMmhhvaGm3a4aW9U0s6I/MRNrlGNixra2mpoY1TjoposasO7eirDy/4tx91XMyUT0lwYRwpEMeEoG1IzITUr8jnrwHeb7bjPLSLSEijsSKtlsxm0zUylbWYq5B+7vWmaVHsD7K/xs6/WR5XHj7suEP4Z8zmAu87PHo+fLZHPbk+Aau+hoz4OArioIdeoJpfqyM8aco0qco0acqmmjVFNNrVkG7VkU0eOUUM2dWREXshq+GvAXwNVO0/q9xGwpxNIySLkyCCUkkUoNRNSMjGdWRjObAxnFjZnFra0bBxpOdjTs7E5syLBKetAcErJCC8Op+50E5FmQWFHpJEMwyA7LYXstBS6tss47v2DIZNqTwC3x0+tL0iNL0CNN0CNN0itL0CNL0itN/yzxhtgpy/A5vptkZ/V3kB4X28An89LeqiGbKOObGrJMWrJiYaihp/rA1ItWYaHTDxkGB6yqCMTDw4jBIAjWIcjWNdkv68QBj7DiddIw29Lw29z4relE7CnEbCnEbRnEHSkEbKnE3SkE3KkYzoyMFPSwZGOmRoOTUZKBqRmYKtfnJnYUjOwOzNJSUklxWEnxWEjxWaQYreR4rDhsBmk2m3YbApbIqKwI5IwdpuBKyMFV0ZKkx3THwzh8Qep8wfx+kPU+YPh774gnkCIOl8QbyBIpS9ImT9InT/cvn4fjy+A3+cBXzWGrxrDW40jWIsjUENKsJaUQC2poRqcoTrSQrU4Q3UHAhMesoxwYMqMhKd0fDiN8ORwGyZppoc00wOhJutyjJBp4CEVLyl4SaHSDH8+sC4VP6n4jRR8Nid+I5WA4SRgS8VvcxK0OQnaUgnanARsToL28LqQ/cAStKeB3UnInobpcIIjDdOeit3uwGEPByuH3cBhM7DbbKTYDew2I7LeFvM53MaItAkHNHt0f1vM5wNtbQ32iWyLnM/QyJlIoyjsiLRgKXYbKXYb2WlNF6COxjRN/EETXzCE1x+M/AxRGwxREQjhDQTx+nwEvbUEvLWEvDUEvbWYvhpMXy2mrxb8tRiBOvDXYgvUYQ/UYQ/W4Qh6sAfrSAl6cIQ8pIbqSAl5STU9pIY8OE0vTtNLGh7skfRkM0wy8JJB+JIeR/vbb0YWgIMf4n0CAqYNHyn4cODHgZcUfKYjus4X+e6PfPbiwHNQm+i2w+znIyVy3Nh1B9o5CJBCyJ5K0EglZEshZDiwR8KR3QiHo/qwZTtoXXQ53LqjtbUfx3FO9nw2A5thRINfY45tsxnYDKL71v+0GSgctmIKOyLSaIZhkOowSHXYyHJa9M+HaULQD/5aCHghUBf56SHoqyPoqyPgrSXo8xDy1RH01xHyezB9dZgBD6Y/vET383swgh6MgBdb0IMtWP/Thz3kxRb0Yg95cQS92BqkJIcRwtEwaMHRw1YChEwDf8CBHzt+HASwh0OVGf7s56Bth1nvNxu2cRzYZjY4XmRdDQ4C5qHH9eM46Njh7YGD1vsi7YPYEvLLsxmEg0+DsGREglFMUIp+rg9LNAhNkXWHtD1cwDKw24ic58A568PX4Y4Te+7weqNBsDMibQ93HHvknDZbeN+Yeo/Y9tD+hs9JTP9tDY7R8HdYHyLr2zX8XH/++vNaGTYVdkSkZTGM8BOtD/NUa3tkidvzroMBCHgg6AsHpaAXAr4GP30HrfM2aOs/zLoGPw+3LvLTrP8c8GIGfRjRfbwY5oFrhDbDxIkfJwc9Z6oFDGj4cRDEHl4MeyQE2fFHfgZMGwHsBxbTFg5Qph1fdLuDALYD+5qxx/BHglUAB4GQjUAo3P6QNgcdK/a8Bz77GhzTj4OgGfmJ7UDd2AlhI4ANk9Z9x+P70y7k9I5ZlpxbYUdEpLHsDrAn/h9r4wifAQgFY4NXyB8JQv7I4oNQIHbdCbfxH32fQ9o0PE59Wx+Yh15HTCFACpE7Fhvz9DfjoJ8tRMhwEDLsmNgIGfbocuC7jVAk8JnYCBrhsBSKhKqQEQ5Roci2oGmLhEQbIcMWCWqR0IgRE7bC22wEzEjoi363hQOaaYuEOSO8zTzQxm+G9/ebNvymEd3PH4psi4TGALbI+eyRdZHFtGM/0eeQNQGFHRGRlsxmh9QM4PjvELRMKNQgFEVCUygQCUeBg74Hw22P+j3QYF3gJL4HG9TQ4NjHW1foyH/UbWbg+J/K3lwYnFS4DDAYyG2iYo6Pwo6IiCSWzQY2Z/hZTMnINBuEn0hgMkORIBQ8EIgOXmcGG2w/eF3D/Q5aZ9ZvCx3UpsE6s+Fxj7Cf2eAcTbbfge+OlMTcSHE4CjsiIiJNyTAilzz1J7a5aN2zpURERCTpKeyIiIhIUlPYERERkaSmsCMiIiJJTWFHREREklrShJ0nn3yS7t27k5aWxqBBg1i+fLnVJYmIiEgzkBRh59VXX2XatGncfffdrFq1irPOOovi4mLKy8utLk1EREQslhRh55FHHuHGG2/khhtuoLCwkLlz55KRkcFf/vIXq0sTERERi7X4sOPz+Vi5ciXDhg2LrrPZbAwbNoySkhILKxMREZHmoMU/3nHPnj0Eg0Hy8vJi1ufl5bFhw4bD7uP1evF6vdHvbrc7rjWKiIiIdVr8yM6JmDVrFi6XK7p06dLF6pJEREQkTlp82Gnfvj12u52ysrKY9WVlZeTn5x92nxkzZlBZWRldduzYkYhSRURExAItPuykpqYyYMAAlixZEl0XCoVYsmQJRUVFh93H6XSSk5MTs4iIiEhyavFzdgCmTZvGuHHjGDhwIOeeey6PPfYYNTU13HDDDVaXJiIiIhZLirDzs5/9jN27dzNz5kxKS0s5++yzeffddw+ZtHwkpmkCmqgsIiLSktT/3a7/O34khnmsFq3Ad999p0nKIiIiLdSOHTvo3LnzEbcr7BCe47Nz506ys7MxDKPJjut2u+nSpQs7duxoNfOCWlufW1t/ofX1ubX1F1pfn1tbfyF5+myaJlVVVRQUFGCzHXkaclJcxjpZNpvtqInwZLXGSdCtrc+trb/Q+vrc2voLra/Pra2/kBx9drlcx2zT4u/GEhERETkahR0RERFJago7ceR0Orn77rtxOp1Wl5Iwra3Pra2/0Pr63Nr6C62vz62tv9D6+qwJyiIiIpLUNLIjIiIiSU1hR0RERJKawo6IiIgkNYUdERERSWoKO3H05JNP0r17d9LS0hg0aBDLly+3uqQmMWvWLM455xyys7Pp2LEjo0aNYuPGjTFtPB4PkyZNol27dmRlZTFmzBjKysosqrhpPfjggxiGwdSpU6PrkrG/33//Pb/4xS9o164d6enp9O3bl88//zy63TRNZs6cSadOnUhPT2fYsGFs3rzZwopPXDAY5K677qJHjx6kp6dz2mmncf/998e8b6el9/fjjz/m8ssvp6CgAMMweOutt2K2N6Z/+/btY+zYseTk5JCbm8uECROorq5OYC+Oz9H67Pf7uf322+nbty+ZmZkUFBRw/fXXs3PnzphjtKQ+H+u/cUM33XQThmHw2GOPxaxvSf09Hgo7cfLqq68ybdo07r77blatWsVZZ51FcXEx5eXlVpd20pYuXcqkSZP47LPPWLx4MX6/n+HDh1NTUxNtc+utt/L3v/+dBQsWsHTpUnbu3Mno0aMtrLpprFixgqeffpp+/frFrE+2/u7fv58hQ4aQkpLCokWLWL9+PQ8//DBt2rSJtpk9ezaPP/44c+fOZdmyZWRmZlJcXIzH47Gw8hPz0EMPMWfOHJ544gm+/vprHnroIWbPns2f/vSnaJuW3t+amhrOOussnnzyycNub0z/xo4dy1dffcXixYtZuHAhH3/8MRMnTkxUF47b0fpcW1vLqlWruOuuu1i1ahVvvPEGGzdu5Iorrohp15L6fKz/xvXefPNNPvvsMwoKCg7Z1pL6e1xMiYtzzz3XnDRpUvR7MBg0CwoKzFmzZllYVXyUl5ebgLl06VLTNE2zoqLCTElJMRcsWBBt8/XXX5uAWVJSYlWZJ62qqsrs2bOnuXjxYvPCCy80b7nlFtM0k7O/t99+u3n++ecfcXsoFDLz8/PNP/zhD9F1FRUVptPpNP/6178mosQmNXLkSPOXv/xlzLrRo0ebY8eONU0z+foLmG+++Wb0e2P6t379ehMwV6xYEW2zaNEi0zAM8/vvv09Y7Sfq4D4fzvLly03A3LZtm2maLbvPR+rvd999Z55yyinmunXrzG7dupmPPvpodFtL7u+xaGQnDnw+HytXrmTYsGHRdTabjWHDhlFSUmJhZfFRWVkJQNu2bQFYuXIlfr8/pv+9evWia9euLbr/kyZNYuTIkTH9guTs79tvv83AgQP56U9/SseOHenfvz9//vOfo9u3bNlCaWlpTJ9dLheDBg1qkX0+77zzWLJkCZs2bQLgiy++4F//+heXXHIJkHz9PVhj+ldSUkJubi4DBw6Mthk2bBg2m41ly5YlvOZ4qKysxDAMcnNzgeTrcygU4rrrrmP69On06dPnkO3J1t+G9CLQONizZw/BYJC8vLyY9Xl5eWzYsMGiquIjFAoxdepUhgwZwplnnglAaWkpqamp0X8w6uXl5VFaWmpBlSdv/vz5rFq1ihUrVhyyLRn7++233zJnzhymTZvG//t//48VK1bw61//mtTUVMaNGxft1+H+N94S+/zb3/4Wt9tNr169sNvtBINBfv/73zN27FiApOvvwRrTv9LSUjp27Biz3eFw0LZt26T4HXg8Hm6//Xauvfba6Isxk63PDz30EA6Hg1//+teH3Z5s/W1IYUdOyqRJk1i3bh3/+te/rC4lbnbs2MEtt9zC4sWLSUtLs7qchAiFQgwcOJAHHngAgP79+7Nu3Trmzp3LuHHjLK6u6b322mu8/PLLvPLKK/Tp04c1a9YwdepUCgoKkrK/Esvv93P11VdjmiZz5syxupy4WLlyJf/93//NqlWrMAzD6nISTpex4qB9+/bY7fZD7sYpKysjPz/foqqa3uTJk1m4cCEffvghnTt3jq7Pz8/H5/NRUVER076l9n/lypWUl5fzwx/+EIfDgcPhYOnSpTz++OM4HA7y8vKSqr8AnTp1orCwMGZd79692b59O0C0X8nyv/Hp06fz29/+lmuuuYa+ffty3XXXceuttzJr1iwg+fp7sMb0Lz8//5AbLAKBAPv27WvRv4P6oLNt2zYWL14cHdWB5OrzP//5T8rLy+natWv037Ft27bxX//1X3Tv3h1Irv4eTGEnDlJTUxkwYABLliyJrguFQixZsoSioiILK2sapmkyefJk3nzzTT744AN69OgRs33AgAGkpKTE9H/jxo1s3769RfZ/6NChrF27ljVr1kSXgQMHMnbs2OjnZOovwJAhQw55nMCmTZvo1q0bAD169CA/Pz+mz263m2XLlrXIPtfW1mKzxf5zaLfbCYVCQPL192CN6V9RUREVFRWsXLky2uaDDz4gFAoxaNCghNfcFOqDzubNm3n//fdp165dzPZk6vN1113Hl19+GfPvWEFBAdOnT+e9994Dkqu/h7B6hnSymj9/vul0Os3nn3/eXL9+vTlx4kQzNzfXLC0ttbq0k3bzzTebLpfL/Oijj8xdu3ZFl9ra2mibm266yezatav5wQcfmJ9//rlZVFRkFhUVWVh102p4N5ZpJl9/ly9fbjocDvP3v/+9uXnzZvPll182MzIyzJdeeina5sEHHzRzc3PNv/3tb+aXX35p/uQnPzF79Ohh1tXVWVj5iRk3bpx5yimnmAsXLjS3bNlivvHGG2b79u3N3/zmN9E2Lb2/VVVV5urVq83Vq1ebgPnII4+Yq1evjt551Jj+jRgxwuzfv7+5bNky81//+pfZs2dP89prr7WqS8d0tD77fD7ziiuuMDt37myuWbMm5t8yr9cbPUZL6vOx/hsf7OC7sUyzZfX3eCjsxNGf/vQns2vXrmZqaqp57rnnmp999pnVJTUJ4LDLc889F21TV1dn/upXvzLbtGljZmRkmFdeeaW5a9cu64puYgeHnWTs79///nfzzDPPNJ1Op9mrVy9z3rx5MdtDoZB51113mXl5eabT6TSHDh1qbty40aJqT47b7TZvueUWs2vXrmZaWpp56qmnmnfccUfMH72W3t8PP/zwsP93O27cONM0G9e/vXv3mtdee62ZlZVl5uTkmDfccINZVVVlQW8a52h93rJlyxH/Lfvwww+jx2hJfT7Wf+ODHS7stKT+Hg/DNBs8IlREREQkyWjOjoiIiCQ1hR0RERFJago7IiIiktQUdkRERCSpKeyIiIhIUlPYERERkaSmsCMiIiJJTWFHRAQwDIO33nrL6jJEJA4UdkTEcuPHj8cwjEOWESNGWF2aiCQBh9UFiIgAjBgxgueeey5mndPptKgaEUkmGtkRkWbB6XSSn58fs7Rp0wYIX2KaM2cOl1xyCenp6Zx66qm8/vrrMfuvXbuWiy++mPT0dNq1a8fEiROprq6OafOXv/yFPn364HQ66dSpE5MnT47ZvmfPHq688koyMjLo2bMnb7/9dnTb/v37GTt2LB06dCA9PZ2ePXseEs5EpHlS2BGRFuGuu+5izJgxfPHFF4wdO5ZrrrmGr7/+GoCamhqKi4tp06YNK1asYMGCBbz//vsxYWbOnDlMmjSJiRMnsnbtWt5++21OP/30mHPce++9XH311Xz55ZdceumljB07ln379kXPv379ehYtWsTXX3/NnDlzaN++feJ+ASJy4qx+E6mIyLhx40y73W5mZmbGLL///e9N0zRNwLzpppti9hk0aJB58803m6ZpmvPmzTPbtGljVldXR7e/8847ps1mM0tLS03TNM2CggLzjjvuOGINgHnnnXdGv1dXV5uAuWjRItM0TfPyyy83b7jhhqbpsIgklObsiEiz8KMf/Yg5c+bErGvbtm30c1FRUcy2oqIi1qxZA8DXX3/NWWedRWZmZnT7kCFDCIVCbNy4EcMw2LlzJ0OHDj1qDf369Yt+zszMJCcnh/LycgBuvvlmxowZw6pVqxg+fDijRo3ivPPOO6G+ikhiKeyISLOQmZl5yGWlppKent6odikpKTHfDcMgFAoBcMkll7Bt2zb+7//+j8WLFzN06FAmTZrEH//4xyavV0SalubsiEiL8Nlnnx3yvXfv3gD07t2bL774gpqamuj2Tz75BJvNxg9+8AOys7Pp3r07S5YsOakaOnTowLhx43jppZd47LHHmDdv3kkdT0QSQyM7ItIseL1eSktLY9Y5HI7oJOAFCxYwcOBAzj//fF5++WWWL1/Os88+C8DYsWO5++67GTduHPfccw+7d+9mypQpXHfddeTl5QFwzz33cNNNN9GxY0cuueQSqqqq+OSTT5gyZUqj6ps5cyYDBgygT58+eL1eFi5cGA1bItK8KeyISLPw7rvv0qlTp5h1P/jBD9iwYQMQvlNq/vz5/OpXv6JTp0789a9/pbCwEICMjAzee+89brnlFs455xwyMjIYM2YMjzzySPRY48aNw+Px8Oijj3LbbbfRvn17rrrqqkbXl5qayowZM9i6dSvp6elccMEFzJ8/vwl6LiLxZpimaVpdhIjI0RiGwZtvvsmoUaOsLkVEWiDN2REREZGkprAjIiIiSU1zdkSk2dPVdhE5GRrZERERkaSmsCMiIiJJTWFHREREkprCjoiIiCQ1hR0RERFJago7IiIiktQUdkRERCSpKeyIiIhIUlPYERERkaT2/wF9iO3xBh5eKwAAAABJRU5ErkJggg==\n"},"metadata":{}}]},{"cell_type":"markdown","source":["# Sauvegarder le Modèle"],"metadata":{"id":"vLIwr8Zud1lM"}},{"cell_type":"code","source":["sigmoid = Sigmoid()\n","model = Model([ Dense(neurons=13, activation=sigmoid),\n"," Dense(neurons=1),\n","\n"," ])"],"metadata":{"id":"M2QYLPdkcGQK","executionInfo":{"status":"ok","timestamp":1687393520456,"user_tz":-60,"elapsed":540,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":455,"outputs":[]},{"cell_type":"code","source":["mse = Loss()\n","model.compile(loss=mse, learning_rate=0.0001)\n","h = model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"uv2ip9IWfUZG","executionInfo":{"status":"ok","timestamp":1687393533114,"user_tz":-60,"elapsed":488,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"2926dae9-42c0-4b00-cc5e-f626038a35c7"},"execution_count":456,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1 .............. loss : 609.4535263872165 ....val_loss : 594.285047596059\n","Epoch 2 .............. loss : 494.7172454598782 ....val_loss : 479.0339597155269\n","Epoch 3 .............. loss : 403.8643944989146 ....val_loss : 388.125852443045\n","Epoch 4 .............. loss : 331.0559254119759 ....val_loss : 315.67394558965\n","Epoch 5 .............. loss : 272.44802631944543 ....val_loss : 257.80096535791387\n","Epoch 6 .............. loss : 225.32104126553727 ....val_loss : 211.7461595039089\n","Epoch 7 .............. loss : 187.60578616146617 ....val_loss : 175.37471756759948\n","Epoch 8 .............. loss : 157.62037539699094 ....val_loss : 146.91491099254424\n","Epoch 9 .............. loss : 133.9379615740088 ....val_loss : 124.84238208175846\n","Epoch 10 .............. loss : 115.33306807953525 ....val_loss : 107.84460906755527\n"]}]},{"cell_type":"code","source":["model.save_model('model.file')"],"metadata":{"id":"68XkQSFpffij","executionInfo":{"status":"ok","timestamp":1687393555708,"user_tz":-60,"elapsed":476,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":457,"outputs":[]},{"cell_type":"code","source":["import pickle\n","\n","def load_model(file):\n"," with open(file, 'rb') as f:\n"," model_load = pickle.load(f)\n"," return model_load"],"metadata":{"id":"xaBhDm2NflDU","executionInfo":{"status":"ok","timestamp":1687393620341,"user_tz":-60,"elapsed":403,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}}},"execution_count":458,"outputs":[]},{"cell_type":"code","source":["model_charge = load_model(\"model.file\")\n","model_charge"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"S1lP91iLf0zc","executionInfo":{"status":"ok","timestamp":1687393660273,"user_tz":-60,"elapsed":666,"user":{"displayName":"Kevin Degila","userId":"02447322191644424226"}},"outputId":"68ad3a2b-96c1-4ee9-c61d-8535050eb74e"},"execution_count":460,"outputs":[{"output_type":"execute_result","data":{"text/plain":["Layers ................. \n"," DenseLayer(neurons=13) avec Sigmoid \n"," DenseLayer(neurons=1)"]},"metadata":{},"execution_count":460}]},{"cell_type":"code","source":[],"metadata":{"id":"gi_nfVmvf4fy"},"execution_count":null,"outputs":[]}]} \ No newline at end of file +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "id": "tobNauEUQjeV", + "outputId": "36b2ead5-a0fd-494f-b2c5-a0b3d2c29140" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[-1.33807731, 0.42478951, 1.05111298],\n", + " [-0.54916645, 0.57783537, -0.39757769],\n", + " [ 0.33873115, -2.19224612, -2.60699134],\n", + " [ 0.59517254, -0.51274205, 0.55131178]])" + ] + }, + "metadata": {}, + "execution_count": 1 + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import pdb\n", + "\n", + "d_out = np.random.randn(4, 3)\n", + "d_out" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tLPI8pzB-7_T", + "outputId": "56abefb9-387c-4b12-d3b1-477f48dee8d2" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[0.22872563, 0.71123973, 0.9419253 ]])" + ] + }, + "metadata": {}, + "execution_count": 2 + } + ], + "source": [ + "B = np.random.rand(1, 3)\n", + "B" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "X7T587B_AIHQ", + "outputId": "62b3aef9-ae12-4150-c7f4-a19342d07536" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[3.66192269, 5.42478951, 6.05111298],\n", + " [4.45083355, 5.57783537, 4.60242231],\n", + " [5.33873115, 2.80775388, 2.39300866],\n", + " [5.59517254, 4.48725795, 5.55131178]])" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ], + "source": [ + "d_out + 5" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4njUNrX7fKxM", + "outputId": "529960cb-51ea-4444-f93b-bc390b1ead0e" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[-1.10935168, 1.13602924, 1.99303827],\n", + " [-0.32044082, 1.28907509, 0.54434761],\n", + " [ 0.56745678, -1.48100639, -1.66506605],\n", + " [ 0.82389817, 0.19849768, 1.49323707]])" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ], + "source": [ + "d_out + B" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tPdvHzwt-wx9", + "outputId": "9fb6e316-223a-4fd3-fca6-aabb15ab67f0" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[-1.33807731, 0.42478951, 1.05111298],\n", + " [-0.54916645, 0.57783537, -0.39757769],\n", + " [ 0.33873115, -2.19224612, -2.60699134],\n", + " [ 0.59517254, -0.51274205, 0.55131178]])" + ] + }, + "metadata": {}, + "execution_count": 5 + } + ], + "source": [ + "r = np.ones_like(B) * d_out\n", + "r" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2npfwgVJ_d9Z", + "outputId": "377d78db-e82d-4556-b1fd-8203b45af3f5" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[-0.95334007, -1.70236329, -1.40214427]])" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ], + "source": [ + "r.sum(axis=0).reshape(1, B.shape[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "kqzsTGI2FNcm" + }, + "outputs": [], + "source": [ + "weight = np.random.randn(5, 4)\n", + "biais = np.random.randn(1, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RjCC5erOFb7W", + "outputId": "567e8b5c-407e-43ae-9bdc-c447030135c2" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[array([[ 0.10928022, 0.52732969, 1.115538 , 0.68919923],\n", + " [ 0.10017813, 0.79238695, 1.68524817, -0.46508893],\n", + " [-0.1690714 , -0.3026148 , -1.05637299, -1.77589906],\n", + " [ 0.09543905, 0.93302939, 0.39115095, 0.23622747],\n", + " [-0.52695245, 0.1505414 , -0.98125058, -0.5927175 ]]),\n", + " array([[-0.13215517, -0.55939219, 0.98538867, -0.32360929]])]" + ] + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "params = []\n", + "params.append(weight)\n", + "params.append(biais)\n", + "params" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "y6UJMvXtRlwA" + }, + "outputs": [], + "source": [ + "class Boite():\n", + "\n", + " def __init__(self):\n", + " pass\n", + "\n", + " def forward(self, inputs):\n", + " self.inputs = inputs\n", + " self.output = self.operation()\n", + " return self.output\n", + "\n", + " def backward(self, derivee_output, output = None, parametre_donnee= None, input_couche = None ):\n", + " self.output = output\n", + " self.params = parametre_donnee\n", + " self.inputs = input_couche\n", + "\n", + " assert derivee_output.shape == self.output.shape, f\"La derivee_output reçue a un shape {derivee_output.shape} et different du shape de output : {self.output.shape}\"\n", + "\n", + " self.derivee_inputs = self.gradient(derivee_output)\n", + " assert self.derivee_inputs.shape == self.inputs.shape, f\"La derivee_input calculée a un shape {self.derivee_inputs.shape } et different du shape de inputs : {self.inputs.shape}\"\n", + "\n", + " return self.derivee_inputs\n", + "\n", + "\n", + " def operation(self):\n", + " pass\n", + "\n", + " def gradient(self, derivee_output):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "tfHThGpPR4Wl" + }, + "outputs": [], + "source": [ + "class BoiteParam():\n", + "\n", + " def __init__(self, param):\n", + " self.param = param\n", + "\n", + " def forward(self, inputs):\n", + " self.inputs = inputs\n", + " self.output = self.operation()\n", + " return self.output\n", + "\n", + " def backward(self, derivee_output, output = None, parametre_donnee= None, input_couche = None):\n", + " self.output = output\n", + " self.param = parametre_donnee\n", + " self.inputs = input_couche\n", + "\n", + " assert derivee_output.shape == self.output.shape, f\"La derivee_output reçue a un shape {derivee_output.shape} et different du shape de output : {self.output}\"\n", + "\n", + " self.derivee_inputs = self.gradient(derivee_output)\n", + " assert self.derivee_inputs.shape == self.inputs.shape, f\"La derivee_input calculée a un shape {self.derivee_inputs.shape } et different du shape de inputs : {self.inputs.shape}\"\n", + "\n", + " self.derivee_param = self.gradient_param(derivee_output)\n", + " assert self.derivee_param.shape == self.param.shape, f\"La derivee de param a un shape {self.derivee_param.shape} et different du shape de param : {self.param.shape}\"\n", + "\n", + " return self.derivee_inputs\n", + "\n", + "\n", + " def operation(self):\n", + " pass\n", + "\n", + " def gradient(self, derivee_output):\n", + " pass\n", + "\n", + "\n", + " def gradient_param(self, derivee_output):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "aDVl8zq7R8VP" + }, + "outputs": [], + "source": [ + "class Dot(BoiteParam):\n", + "\n", + " def __init__(self, weights):\n", + " super().__init__(weights)\n", + "\n", + " def operation(self):\n", + " return np.dot(self.inputs, self.param)\n", + "\n", + " def gradient(self, derivee_output):\n", + " return np.dot( derivee_output, self.param.T)\n", + "\n", + " def gradient_param(self, derivee_output):\n", + " return np.dot(self.inputs.T, derivee_output)\n", + "\n", + " def __repr__(self):\n", + " return \"DotProduct\"" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "qO2JkuQBSAbO" + }, + "outputs": [], + "source": [ + "class Add(BoiteParam):\n", + "\n", + " def __init__(self, biais):\n", + " super().__init__(biais)\n", + "\n", + " def operation(self):\n", + " return self.inputs + self.param\n", + "\n", + " def gradient(self, derivee_output):\n", + " return np.ones_like(self.inputs) * derivee_output\n", + "\n", + " def gradient_param(self, derivee_output):\n", + " r = np.ones_like(self.param) * derivee_output\n", + " return r.sum(axis=0).reshape(1, self.param.shape[1])\n", + "\n", + " def __repr__(self):\n", + " return \"AddBiais\"" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "X6p7wiDQSDmD" + }, + "outputs": [], + "source": [ + "class Sigmoid(Boite):\n", + "\n", + " def __init__(self):\n", + " super().__init__()\n", + "\n", + " def operation(self):\n", + " return 1 / (1 + np.exp(-1 * self.inputs))\n", + "\n", + " def gradient(self, derivee_output):\n", + " return self.output * (1 - self.output) * derivee_output\n", + "\n", + " def __repr__(self):\n", + " return \"sigmoid\"" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "Ku0FhTnFSG_Z" + }, + "outputs": [], + "source": [ + "class Loss():\n", + "\n", + " def __init__(self):\n", + " pass\n", + "\n", + " def forward(self, prediction, target):\n", + " assert prediction.shape == target.shape, f\"Prediction shape {prediction.shape} Target shape {target.shape}\"\n", + " self.prediction = prediction\n", + " self.target = target\n", + " loss = np.mean((self.target - self.prediction) ** 2)\n", + " return loss\n", + "\n", + " def backward(self, prediction, target):\n", + " self.target = target\n", + " self.prediction = prediction\n", + "\n", + " self.loss_derivee = -2 * (self.target - self.prediction)\n", + " assert self.loss_derivee.shape == self.prediction.shape, f\"La derivee du loss un shape {self.loss_derivee.shape } et different du shape de Prediction : {self.prediction.shape}\"\n", + "\n", + " return self.loss_derivee" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "C7U1gDhwSLnt" + }, + "outputs": [], + "source": [ + "class Dense():\n", + "\n", + " def __init__(self, neurons, activation=None):\n", + " self.neurons = neurons\n", + " self.activation = activation\n", + " self.params = []\n", + " self.suite = []\n", + " self.initialisation = True\n", + "\n", + "\n", + "\n", + " def build(self, inputs):\n", + " # weights initialization\n", + " np.random.seed(42)\n", + "\n", + " self.weights = np.random.randn(inputs.shape[1], self.neurons)\n", + " self.biais = np.random.randn(1, self.neurons)\n", + "\n", + " self.params.append(self.weights)\n", + " self.params.append(self.biais)\n", + " # construction de la suite d'opération\n", + " self.suite = [Dot(weights=self.params[0]), Add(biais=self.params[1])]\n", + " if self.activation:\n", + " self.suite.append(self.activation)\n", + "\n", + "\n", + " def forward(self, inputs):\n", + " if self.initialisation:\n", + " self.build(inputs)\n", + " self.initialisation = False\n", + "\n", + " for boite in self.suite:\n", + " inputs = boite.forward(inputs)\n", + "\n", + " self.output = inputs\n", + "\n", + " return self.output\n", + "\n", + "\n", + " def backward(self, derivee_output, output_dot=None, output_biais=None, output_sigmoid=None, parms_dot=None, params_biais=None, input_dot_level = None, input_biais_level= None, input_sigmoid_level= None):\n", + " input = {'output': {'DotProduct': output_dot,\n", + " 'AddBiais': output_biais,\n", + " 'sigmoid': output_sigmoid},\n", + " 'params': {'DotProduct': parms_dot,\n", + " 'AddBiais': params_biais},\n", + " 'input': {'DotProduct': input_dot_level, # input au niveau du dot\n", + " 'AddBiais': input_biais_level, #input au niveau du add\n", + " 'sigmoid': input_sigmoid_level} #input au niveau du sigma\n", + " }\n", + " for boite in reversed(self.suite):\n", + " output = input['output'][f\"{boite}\"]\n", + " input_layer = input['input'][f\"{boite}\"]\n", + "\n", + " assert derivee_output.shape == output.shape\n", + "\n", + " if f\"{boite}\" != \"sigmoid\": #boite egale a Dot ou Biais\n", + " params = input['params'][f\"{boite}\"]\n", + " else:\n", + " params = None\n", + "\n", + " assert derivee_output.shape == output.shape\n", + " derivee_output = boite.backward(derivee_output, output, parametre_donnee=params, input_couche = input_layer )\n", + "\n", + "\n", + " derivee_inputs = derivee_output\n", + "\n", + " #comme executer avant on peut la recuperer\n", + " self.get_layer_gradients()\n", + "\n", + " return derivee_inputs\n", + "\n", + " def get_layer_gradients(self):\n", + "\n", + " self.derivee_params = []\n", + "\n", + " for boite in self.suite:\n", + " if issubclass(boite.__class__, BoiteParam):\n", + " self.derivee_params.append(boite.derivee_param)\n", + "\n", + "\n", + "\n", + " def __repr__(self):\n", + " r = f\"DenseLayer(neurons={self.neurons})\"\n", + " if self.activation:\n", + " r += \" avec Sigmoid\"\n", + "\n", + " return r" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "bIOOJ-dXSazm" + }, + "outputs": [], + "source": [ + "sigmoid = Sigmoid()\n", + "couche = Dense(neurons=2, activation=sigmoid)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "en1q1kgRSkOv" + }, + "outputs": [], + "source": [ + "X = np.array([[ 2, 3, -2],\n", + " [ 4, 5, -1],\n", + " [-5, 2, 3],\n", + " [ 0, 5, 4]])\n", + "Y = np.random.randn(4, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "OT5KPY43Ssms", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "f032cb90-d223-4a26-9703-bfab717c6514" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": {}, + "execution_count": 18 + } + ], + "source": [ + "couche.suite" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "u56tsspwSpha", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "14297abb-55a3-405a-dd89-c1d6465eb1cf" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[0.99320003, 0.99604286],\n", + " [0.99912347, 0.99968533],\n", + " [0.42276305, 0.97817014],\n", + " [0.97978765, 0.99941659]])" + ] + }, + "metadata": {}, + "execution_count": 19 + } + ], + "source": [ + "couche.forward(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "rbyvRZE8S0UW", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "40ee9d0f-b98b-44d0-8ee7-633406eed0ed" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[DotProduct, AddBiais, sigmoid]" + ] + }, + "metadata": {}, + "execution_count": 20 + } + ], + "source": [ + "couche.suite" + ] + }, + { + "cell_type": "code", + "source": [ + "#recuperation output apres le dot\n", + "couche.suite[0].output" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iH1OoZ0W6J6t", + "outputId": "c38dbb7d-851b-4473-ce30-36689ab764ea" + }, + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 3.40480067, 4.76083488],\n", + " [ 5.45945268, 7.29622903],\n", + " [-1.89065381, 3.03497035],\n", + " [ 2.30182919, 6.67860145]])" + ] + }, + "metadata": {}, + "execution_count": 21 + } + ] + }, + { + "cell_type": "code", + "source": [ + "#recuperation des parametres\n", + "couche.suite[0].param\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "zEx0uKZM7L6V", + "outputId": "c54330fa-66fb-4ecc-ce24-eb5ae32a896d" + }, + "execution_count": 22, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 0.49671415, -0.1382643 ],\n", + " [ 0.64768854, 1.52302986],\n", + " [-0.23415337, -0.23413696]])" + ] + }, + "metadata": {}, + "execution_count": 22 + } + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "npyNrzfhS_s8", + "outputId": "bafebfb8-d9dc-4a52-96ef-b113640058d5" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "False" + ] + }, + "metadata": {}, + "execution_count": 23 + } + ], + "source": [ + "couche.initialisation #comme on a lancer une fois initialisation doit etre a false" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Qt_MaiAzqLPJ", + "outputId": "01921241-835a-46bf-a725-4d79f8793ff9" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 2, 3, -2],\n", + " [ 4, 5, -1],\n", + " [-5, 2, 3],\n", + " [ 0, 5, 4]])" + ] + }, + "metadata": {}, + "execution_count": 24 + } + ], + "source": [ + "couche.suite[0].inputs #on peut recuperer l'input qui entre dans dot" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VF3ITX3NXK1i", + "outputId": "b5ca3ec5-de17-450e-c4d6-66406a1f2c3c" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "input biais = [[ 3.40480067 4.76083488]\n", + " [ 5.45945268 7.29622903]\n", + " [-1.89065381 3.03497035]\n", + " [ 2.30182919 6.67860145]] est egale a output de dot [[ 3.40480067 4.76083488]\n", + " [ 5.45945268 7.29622903]\n", + " [-1.89065381 3.03497035]\n", + " [ 2.30182919 6.67860145]]\n" + ] + } + ], + "source": [ + "#on peut recuperer l'input qui entre dans biais et donc l'output de dot\n", + "if np.array_equal(couche.suite[1].inputs, couche.suite[0].output):\n", + " print('input biais =', couche.suite[1].inputs, \"est egale a output de dot\", couche.suite[0].output)\n", + "else:\n", + " print('input biais =', couche.suite[1].inputs, \"n'est pas egale a output de dot\", couche.suite[0].output)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "id": "Byd0UxBYXmTo" + }, + "outputs": [], + "source": [ + "#couche.suite[0].derivee_inputs #comme pas de bakward fait precedemment alors err" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Jmgyz08oaldF", + "outputId": "d5e71772-7fed-40fa-b7e4-46175f3d3fef" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[-0.46947439, 0.54256004],\n", + " [-0.46341769, -0.46572975],\n", + " [ 0.24196227, -1.91328024],\n", + " [-1.72491783, -0.56228753]])" + ] + }, + "metadata": {}, + "execution_count": 27 + } + ], + "source": [ + "# backward -> il faut que la derivee de l'output doit etre egale à l'output : output shape : (4,2) donc je dois donner un output de la forme (4,2)\n", + "deriveproduitprecedent_output_pour_bakcward = np.random.randn(couche.forward(X).shape[0], couche.forward(X).shape[1])\n", + "deriveproduitprecedent_output_pour_bakcward" + ] + }, + { + "cell_type": "code", + "source": [ + "couche.suite[0].inputs" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9MeZ3k9S5mZg", + "outputId": "a72e86f9-2bac-4c87-ea16-64ff62f01d26" + }, + "execution_count": 28, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 2, 3, -2],\n", + " [ 4, 5, -1],\n", + " [-5, 2, 3],\n", + " [ 0, 5, 4]])" + ] + }, + "metadata": {}, + "execution_count": 28 + } + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KGGBztr4baIO", + "outputId": "119383cb-27db-4782-cf81-5affebaeddab" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[-0.00187061, 0.00120335, 0.00024173],\n", + " [-0.00018133, -0.00048599, 0.00012933],\n", + " [ 0.03497832, -0.02397904, -0.00426045],\n", + " [-0.0169224 , -0.02262434, 0.00807543]])" + ] + }, + "metadata": {}, + "execution_count": 29 + } + ], + "source": [ + "couche.backward(deriveproduitprecedent_output_pour_bakcward,\n", + " output_dot= couche.suite[0].output,\n", + " output_biais= couche.suite[1].output,\n", + " output_sigmoid= couche.suite[2].output,\n", + " parms_dot= couche.suite[0].param,\n", + " params_biais= couche.suite[1].param,\n", + " input_dot_level = X,\n", + " input_biais_level = couche.suite[1].inputs,\n", + " input_sigmoid_level = couche.suite[2].inputs)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ms063KYDbn6K", + "outputId": "963d2d7b-b2bc-4ee4-87c4-3184dd14bc10" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[-0.00187061, 0.00120335, 0.00024173],\n", + " [-0.00018133, -0.00048599, 0.00012933],\n", + " [ 0.03497832, -0.02397904, -0.00426045],\n", + " [-0.0169224 , -0.02262434, 0.00807543]])" + ] + }, + "metadata": {}, + "execution_count": 30 + } + ], + "source": [ + "couche.suite[0].derivee_inputs # la ca fonctionne on a donc la derrivée par rapport a l'input et donc ici dans notre cas par rapport a x c'est donc egale a W_transposé * le produit de ce qui c'est passé avant . a note de la meme shape que l'input" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "id": "5JgNaHcSTCmT" + }, + "outputs": [], + "source": [ + "from copy import deepcopy\n", + "import pdb\n", + "\n", + "class Model():\n", + "\n", + " def __init__(self, layers):\n", + " self.layers = layers\n", + " self.compiled = False\n", + " self.output_couche={}\n", + " self.params_couche={}\n", + " self.couche_numero = 0\n", + "\n", + " def forward(self, inputs, validation = False):\n", + "\n", + " for layer in self.layers:\n", + " # import pdb; pdb.set_trace()\n", + " #recuperation des outputs parms et input apres chaque boite\n", + " layer_key = f\"{layer}_couche numero_{self.couche_numero}\"\n", + " self.output_couche[layer_key] = {\n", + " \"output\": {},\n", + " \"params\": {},\n", + " \"input\": {}\n", + " }\n", + " if validation == False:\n", + " #insertion de l'input pr le dot\n", + " self.output_couche[layer_key][\"input\"][\"dot_level\"] = inputs\n", + "\n", + " #on fait notre forward\n", + " inputs = layer.forward(inputs)\n", + "\n", + " if validation == False:\n", + " self.output_couche[layer_key][\"input\"][\"biais_level\"] = layer.suite[0].output\n", + " self.output_couche[layer_key][\"input\"][\"sigmoid_level\"] = layer.suite[1].output\n", + "\n", + " self.output_couche[layer_key][\"output\"][\"dot\"] = layer.suite[0].output\n", + " self.output_couche[layer_key][\"output\"][\"biais\"] = layer.suite[1].output\n", + " # Recuperation output de la boite sigmoid car pas obligatoire\n", + " if len(layer.suite) == 3:\n", + " self.output_couche[layer_key][\"output\"][\"sigmoid\"] = layer.suite[2].output\n", + " self.output_couche[layer_key][\"input\"][\"biais\"] = layer.suite[1].output\n", + "\n", + " # Recuperation des parametres de chaque boite\n", + " self.output_couche[layer_key][\"params\"][\"dot\"] = layer.suite[0].param\n", + " self.output_couche[layer_key][\"params\"][\"biais\"] = layer.suite[1].param\n", + "\n", + " self.couche_numero += 1\n", + " self.output = inputs\n", + "\n", + " return self.output\n", + "\n", + "\n", + "\n", + "\n", + " def backward(self, loss_derivee):\n", + "\n", + "\n", + " self.couche_numero = (len(self.layers) - 1) #car 0 compte donc si 3 elements on a 0 1 2 et non 123 ## on commence de la derniere couche et on termine a la premiere\n", + " for layer in reversed(self.layers):\n", + "\n", + " layer_key = f\"{layer}_couche numero_{self.couche_numero}\"\n", + " nombre_boite = len(self.output_couche[layer_key][\"output\"])\n", + "\n", + " output = self.output_couche[layer_key][\"output\"]\n", + " params = self.output_couche[layer_key][\"params\"]\n", + " input = self.output_couche[layer_key][\"input\"]\n", + "\n", + " if nombre_boite == 3:\n", + " assert loss_derivee.shape == output[\"sigmoid\"].shape\n", + " loss_derivee = layer.backward(loss_derivee, output_dot=output[\"dot\"], output_biais = output[\"biais\"], output_sigmoid = output[\"sigmoid\"], params_biais = params[\"biais\"], parms_dot = params[\"dot\"], input_dot_level = input[\"dot_level\"], input_biais_level= input[\"biais_level\"], input_sigmoid_level= input[\"sigmoid_level\"] )\n", + " elif nombre_boite == 2:\n", + " assert loss_derivee.shape == output[\"biais\"].shape\n", + " loss_derivee = layer.backward(loss_derivee, output_dot=output[\"dot\"], output_biais = output[\"biais\"], params_biais = params[\"biais\"], parms_dot = params[\"dot\"], input_dot_level = input[\"dot_level\"], input_biais_level= input[\"biais_level\"], input_sigmoid_level= input[\"sigmoid_level\"] )\n", + "\n", + " self.couche_numero -= 1\n", + "\n", + "\n", + "\n", + "\n", + " return None\n", + "\n", + " def get_params(self):\n", + " for layer in self.layers:\n", + " yield from layer.params\n", + "\n", + "\n", + " def get_derivee_params(self):\n", + " for layer in self.layers:\n", + " yield from layer.derivee_params\n", + "\n", + "\n", + " def update(self):\n", + "\n", + " for (param, derivee_param) in zip(self.get_params(), self.get_derivee_params()):\n", + " assert param.shape == derivee_param.shape\n", + " param -= self.learning_rate * derivee_param\n", + "\n", + "\n", + " def compile(self, loss, learning_rate):\n", + " self.loss = loss\n", + " self.learning_rate = learning_rate\n", + " self.compiled = True\n", + "\n", + "\n", + " def fit(self, X, Y, epochs, validation_data=None):\n", + "\n", + " if validation_data:\n", + " assert len(validation_data) == 2\n", + " assert validation_data[0].shape[1] == X.shape[1]\n", + " assert validation_data[1].shape[1] == Y.shape[1]\n", + "\n", + " self.history = {\"loss\":[]}\n", + " if validation_data:\n", + " self.history['val_loss'] = []\n", + "\n", + "\n", + " if not self.compiled:\n", + " raise NotImplementedError(\"Pas de loss et de learning_rate: Compilez\")\n", + "\n", + " for epoch in range(epochs):\n", + "\n", + " # forward pass\n", + " predictions = model.forward(X)\n", + " loss = self.loss\n", + " err_prediction = loss.forward(predictions, Y)\n", + " self.history['loss'].append(err_prediction)\n", + "\n", + "\n", + " # val loss\n", + " if validation_data:\n", + " val_preds = model.forward(validation_data[0], validation = True)\n", + " val_loss = self.loss\n", + " val_err_prediction = val_loss.forward(val_preds, validation_data[1])\n", + " self.history['val_loss'].append(val_err_prediction)\n", + "\n", + " log = f'Epoch {epoch+1} .............. loss : {err_prediction}'\n", + " if validation_data:\n", + " log += f\" ....val_loss : {val_err_prediction}\"\n", + " print(log)\n", + "\n", + "\n", + "\n", + " # backward pass\n", + " loss_derivee = loss.backward(target = Y, prediction = predictions)\n", + " self.backward(loss_derivee)\n", + "\n", + " # update\n", + " self.update()\n", + "\n", + " return self.history\n", + "\n", + " def save_model(self, file):\n", + " model_save = deepcopy(self)\n", + "\n", + " import pickle\n", + " with open(file, \"wb\") as f:\n", + " pickle.dump(model_save, f)\n", + "\n", + "\n", + " def __repr__(self):\n", + "\n", + " r = \"Layers .................\"\n", + " for layer in self.layers:\n", + " r += f\" \\n {str(layer)}\"\n", + "\n", + " return r" + ] + }, + { + "cell_type": "markdown", + "source": [ + "#forward" + ], + "metadata": { + "id": "NqzXxnYb15rO" + } + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5_1qq_dcVDaK", + "outputId": "cddfd3fc-a0f6-4465-a157-107fdd0c3e35" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(4, 3)" + ] + }, + "metadata": {}, + "execution_count": 32 + } + ], + "source": [ + "X.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "id": "35iPtR4JUgn_" + }, + "outputs": [], + "source": [ + "layers = [ Dense(neurons=3, activation=sigmoid),\n", + " Dense(neurons=5, activation=sigmoid),\n", + " Dense(neurons=1)]" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "94k3amHIbtNI", + "outputId": "9b37b48a-a4e2-4606-c323-65a9d24fe5ad" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Layers ................. \n", + " DenseLayer(neurons=3) avec Sigmoid \n", + " DenseLayer(neurons=5) avec Sigmoid \n", + " DenseLayer(neurons=1)" + ] + }, + "metadata": {}, + "execution_count": 34 + } + ], + "source": [ + "model = Model(layers)\n", + "model" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rLINNeKF5F2H", + "outputId": "85a906e1-f6f9-4fda-bd77-042e2a2fafcd" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[0.84993545],\n", + " [0.84362513],\n", + " [1.22210677],\n", + " [1.22425779]])" + ] + }, + "metadata": {}, + "execution_count": 35 + } + ], + "source": [ + "model.forward(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "X8HYsmJj6LG7", + "outputId": "bbd37a97-5190-41e0-ea1c-de3aa9500262" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "False" + ] + }, + "metadata": {}, + "execution_count": 36 + } + ], + "source": [ + "model.layers[0].initialisation # une premiere execution a ete faite donc initialisation doit passer a false" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SbLOwh6hr_vT", + "outputId": "61f74f8b-ce88-4579-9253-f5640e949a85" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[array([[ 0.49671415, -0.1382643 , 0.64768854],\n", + " [ 1.52302986, -0.23415337, -0.23413696],\n", + " [ 1.57921282, 0.76743473, -0.46947439]]),\n", + " array([[ 0.54256004, -0.46341769, -0.46572975]])]" + ] + }, + "metadata": {}, + "execution_count": 37 + } + ], + "source": [ + "model.layers[0].params" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CxcA3rJGsHms", + "outputId": "bc80d2c1-3eda-432a-81a9-8402c80bb57e" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[array([[ 0.49671415, -0.1382643 , 0.64768854, 1.52302986, -0.23415337],\n", + " [-0.23413696, 1.57921282, 0.76743473, -0.46947439, 0.54256004],\n", + " [-0.46341769, -0.46572975, 0.24196227, -1.91328024, -1.72491783]]),\n", + " array([[-0.56228753, -1.01283112, 0.31424733, -0.90802408, -1.4123037 ]])]" + ] + }, + "metadata": {}, + "execution_count": 38 + } + ], + "source": [ + "model.layers[1].params" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "id": "_vMe4ZOR7sL8" + }, + "outputs": [], + "source": [ + "params= model.get_params()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "LYp6cBmv7v24", + "outputId": "99b05c58-4a6d-49eb-b5a6-3e8b1cb8653a" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 0.49671415, -0.1382643 , 0.64768854],\n", + " [ 1.52302986, -0.23415337, -0.23413696],\n", + " [ 1.57921282, 0.76743473, -0.46947439]])" + ] + }, + "metadata": {}, + "execution_count": 40 + } + ], + "source": [ + "next(params)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "o5ldIz51sKS6", + "outputId": "26159c9d-9940-4fba-8b53-490f5978a10b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "parametre [[ 0.49671415 -0.1382643 0.64768854]\n", + " [ 1.52302986 -0.23415337 -0.23413696]\n", + " [ 1.57921282 0.76743473 -0.46947439]]\n", + "parametre [[ 0.54256004 -0.46341769 -0.46572975]]\n", + "parametre [[ 0.49671415 -0.1382643 0.64768854 1.52302986 -0.23415337]\n", + " [-0.23413696 1.57921282 0.76743473 -0.46947439 0.54256004]\n", + " [-0.46341769 -0.46572975 0.24196227 -1.91328024 -1.72491783]]\n", + "parametre [[-0.56228753 -1.01283112 0.31424733 -0.90802408 -1.4123037 ]]\n", + "parametre [[ 0.49671415]\n", + " [-0.1382643 ]\n", + " [ 0.64768854]\n", + " [ 1.52302986]\n", + " [-0.23415337]]\n", + "parametre [[-0.23413696]]\n" + ] + } + ], + "source": [ + "for i in model.get_params():\n", + " print('parametre', i)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "#backward" + ], + "metadata": { + "id": "ogHu9lmv11j2" + } + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5dY-AupC5QyW", + "outputId": "db8890e3-ec0d-412a-edce-909e2a6df2b2" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 1.57921282],\n", + " [ 0.76743473],\n", + " [-0.46947439],\n", + " [ 0.54256004]])" + ] + }, + "metadata": {}, + "execution_count": 42 + } + ], + "source": [ + "loss_derivee = np.random.randn(4, 1)\n", + "loss_derivee" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "id": "qZN4du-6oDHU" + }, + "outputs": [], + "source": [ + "model.backward(loss_derivee)" + ] + }, + { + "cell_type": "code", + "source": [ + "model.layers" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "o1X0f6na3G5b", + "outputId": "3da95970-3f33-495b-9bf8-5d41901752e5" + }, + "execution_count": 44, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[DenseLayer(neurons=3) avec Sigmoid,\n", + " DenseLayer(neurons=5) avec Sigmoid,\n", + " DenseLayer(neurons=1)]" + ] + }, + "metadata": {}, + "execution_count": 44 + } + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WnMVKkAfoN6u", + "outputId": "c8607053-59d0-4371-f3cd-11d32b027661" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[array([[ 0.09744344, -0.08618553, -0.64336403],\n", + " [ 0.13698274, -0.11830289, -0.93484694],\n", + " [-0.09526242, -0.01875007, 0.38958693]]),\n", + " array([[ 0.04528266, -0.02121019, -0.25762364]])]" + ] + }, + "metadata": {}, + "execution_count": 45 + } + ], + "source": [ + "model.layers[0].derivee_params" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WBsoC8E4oVBe", + "outputId": "4ecba78d-fbe0-4ed5-8fdb-e446c4890f10" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[array([[ 0.27708152, -0.05174736, 0.27472495, 0.73140384, -0.02763427],\n", + " [ 0.01624539, -0.0034003 , 0.01676576, 0.04383442, -0.00135655],\n", + " [ 0.2135732 , -0.03921063, 0.21194219, 0.56124601, -0.0207439 ]]),\n", + " array([[ 0.28624623, -0.05341832, 0.28395946, 0.7555249 , -0.02849731]])]" + ] + }, + "metadata": {}, + "execution_count": 46 + } + ], + "source": [ + "model.layers[1].derivee_params" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "t_7Azo_bp5z6", + "outputId": "4a713462-1c16-48cd-de6b-cf8bd3a9106d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "derivee de parametre [[ 0.09744344 -0.08618553 -0.64336403]\n", + " [ 0.13698274 -0.11830289 -0.93484694]\n", + " [-0.09526242 -0.01875007 0.38958693]]\n", + "derivee de parametre [[ 0.04528266 -0.02121019 -0.25762364]]\n", + "derivee de parametre [[ 0.27708152 -0.05174736 0.27472495 0.73140384 -0.02763427]\n", + " [ 0.01624539 -0.0034003 0.01676576 0.04383442 -0.00135655]\n", + " [ 0.2135732 -0.03921063 0.21194219 0.56124601 -0.0207439 ]]\n", + "derivee de parametre [[ 0.28624623 -0.05341832 0.28395946 0.7555249 -0.02849731]]\n", + "derivee de parametre [[0.94753585]\n", + " [0.47746922]\n", + " [1.84484437]\n", + " [0.70724056]\n", + " [0.12803521]]\n", + "derivee de parametre [[2.4197332]]\n" + ] + } + ], + "source": [ + "for i in model.get_derivee_params():\n", + " print('derivee de parametre', i)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# update parameter" + ], + "metadata": { + "id": "B3fGWuZC1tW8" + } + }, + { + "cell_type": "code", + "source": [ + "#rappel params\n", + "model.layers[0].params" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AvuMXOLS9Ciy", + "outputId": "3c545790-2c7b-403a-aeba-e54045063c39" + }, + "execution_count": 48, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[array([[ 0.49671415, -0.1382643 , 0.64768854],\n", + " [ 1.52302986, -0.23415337, -0.23413696],\n", + " [ 1.57921282, 0.76743473, -0.46947439]]),\n", + " array([[ 0.54256004, -0.46341769, -0.46572975]])]" + ] + }, + "metadata": {}, + "execution_count": 48 + } + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "id": "2pD5u7J5-TdG" + }, + "outputs": [], + "source": [ + "model.learning_rate = 0.5\n", + "model.update() #met a jour les parametres" + ] + }, + { + "cell_type": "markdown", + "source": [ + "on doit donc avoit une baisse de params -(+) de 0.5 * derivee params" + ], + "metadata": { + "id": "BfkGHh5K9Rmj" + } + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "kdMC5Kw7C2S_", + "outputId": "e360238a-ac1e-40f4-e9d0-153416b673ae" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "derivee_params = [array([[ 0.09744344, -0.08618553, -0.64336403],\n", + " [ 0.13698274, -0.11830289, -0.93484694],\n", + " [-0.09526242, -0.01875007, 0.38958693]]), array([[ 0.04528266, -0.02121019, -0.25762364]])]\n", + "params = [array([[ 0.44799244, -0.09517154, 0.96937056],\n", + " [ 1.45453849, -0.17500193, 0.23328652],\n", + " [ 1.62684403, 0.77680976, -0.66426785]]), array([[ 0.51991871, -0.4528126 , -0.33691794]])]\n" + ] + } + ], + "source": [ + "print(\"derivee_params = \" , model.layers[0].derivee_params)\n", + "print(\"params = \" , model.layers[0].params)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UQ6acYKbDO7m", + "outputId": "2c86e4b7-c14b-4360-a21f-0e0a46f923c2" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[-1.61385325],\n", + " [-1.61382767],\n", + " [-1.51878309],\n", + " [-1.57077394]])" + ] + }, + "metadata": {}, + "execution_count": 51 + } + ], + "source": [ + "model.forward(X) #permet de faire un forward avec les nouveau params" + ] + }, + { + "cell_type": "markdown", + "source": [ + "resutructuration" + ], + "metadata": { + "id": "lFRHtHRO92vi" + } + }, + { + "cell_type": "code", + "source": [ + "print(\"Y est egale a \", Y)\n", + "print(\"X est egale a \", X)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0ST4tWaL90UQ", + "outputId": "ca8e83db-9c12-46ed-f2ed-de0b95a10355" + }, + "execution_count": 52, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Y est egale a [[-0.55981723]\n", + " [-0.20036057]\n", + " [ 0.67554591]\n", + " [ 0.64849327]]\n", + "X est egale a [[ 2 3 -2]\n", + " [ 4 5 -1]\n", + " [-5 2 3]\n", + " [ 0 5 4]]\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "P = model.forward(X)\n", + "mse = Loss()\n", + "loss = mse.forward(P, Y)\n", + "print(loss)\n", + "#backward\n", + "loss_derivee = mse.backward(prediction=P, target=Y)\n", + "model.backward(loss_derivee)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "id": "pHedPOLh9yIW", + "outputId": "6d7caeec-8c22-46cc-f600-c48d62e3acfc" + }, + "execution_count": 53, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "3.2122769709023276\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "#TEST DE FIT\n" + ], + "metadata": { + "id": "88Y3c6az-dnI" + } + }, + { + "cell_type": "code", + "source": [ + "model = Model(layers = [Dense(neurons=3, activation=sigmoid),\n", + " Dense(neurons=5, activation=sigmoid),\n", + " Dense(neurons=1)])\n", + "\n", + "mse = Loss()\n", + "model.compile(loss=mse, learning_rate=0.01)\n", + "h = model.fit(X, Y, epochs=10)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4QjykoWSM5XB", + "outputId": "a099ecad-8114-487d-ef91-fbfc5c800454" + }, + "execution_count": 54, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1 .............. loss : 0.9268855825116059\n", + "Epoch 2 .............. loss : 0.644939902160568\n", + "Epoch 3 .............. loss : 0.46844953430865593\n", + "Epoch 4 .............. loss : 0.35651845829923123\n", + "Epoch 5 .............. loss : 0.2846819980843506\n", + "Epoch 6 .............. loss : 0.23801826317504401\n", + "Epoch 7 .............. loss : 0.2072910559091413\n", + "Epoch 8 .............. loss : 0.18671933121089634\n", + "Epoch 9 .............. loss : 0.17265381388708326\n", + "Epoch 10 .............. loss : 0.16277592569482285\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test du code final sur le boston dataset" + ], + "metadata": { + "id": "Q0PrVgvFAJFl" + } + }, + { + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "data_url = \"http://lib.stat.cmu.edu/datasets/boston\"\n", + "raw_df = pd.read_csv(data_url, sep=\"\\s+\", skiprows=22, header=None)\n", + "data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])\n", + "target = raw_df.values[1::2, 2]\n", + "data = data\n", + "target = target\n", + "\n", + "X = data\n", + "Y = target.reshape((506, 1))\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.25, random_state=0)\n", + "\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "X_train = scaler.fit_transform(X_train)\n", + "X_test = scaler.transform(X_test)\n", + "" + ], + "metadata": { + "id": "NiK9xp19AEth" + }, + "execution_count": 55, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "X_train.shape, y_train.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "i19n_NpOALlC", + "outputId": "a797ff41-7cc7-4ea4-84fc-846b44fd0bfc" + }, + "execution_count": 56, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "((379, 13), (379, 1))" + ] + }, + "metadata": {}, + "execution_count": 56 + } + ] + }, + { + "cell_type": "code", + "source": [ + "X_test.shape, y_test.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_L76nLnbARKH", + "outputId": "3845d7d9-7fbb-4d28-d311-aaa7482db970" + }, + "execution_count": 57, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "((127, 13), (127, 1))" + ] + }, + "metadata": {}, + "execution_count": 57 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "#Regression linéaire simple" + ], + "metadata": { + "id": "0jZpHMGNAeVE" + } + }, + { + "cell_type": "code", + "source": [ + "model = Model(layers = [Dense(neurons=1)])\n", + "mse = Loss()\n", + "model.compile(loss=mse, learning_rate=0.0001)\n", + "h = model.fit(X_train, y_train, epochs=30, validation_data=(X_test, y_test))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0NkwxC3yITr7", + "outputId": "ea929797-b9df-4ab1-a9fa-d0bf1fe47b4b" + }, + "execution_count": 58, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1 .............. loss : 712.1743316753176 ....val_loss : 671.7547143671588\n", + "Epoch 2 .............. loss : 576.9266828543414 ....val_loss : 562.1281647258804\n", + "Epoch 3 .............. loss : 474.8911197919163 ....val_loss : 484.124620632117\n", + "Epoch 4 .............. loss : 406.0676424880424 ....val_loss : 437.7440820858687\n", + "Epoch 5 .............. loss : 370.45625094271946 ....val_loss : 422.9865490871356\n", + "Epoch 6 .............. loss : 368.05694515594774 ....val_loss : 439.8520216359175\n", + "Epoch 7 .............. loss : 398.869725127727 ....val_loss : 488.34049973221454\n", + "Epoch 8 .............. loss : 462.89459085805737 ....val_loss : 568.4519833760269\n", + "Epoch 9 .............. loss : 560.1315423469389 ....val_loss : 680.1864725673538\n", + "Epoch 10 .............. loss : 690.5805795943714 ....val_loss : 823.5439673061961\n", + "Epoch 11 .............. loss : 854.2417026003551 ....val_loss : 998.5244675925536\n", + "Epoch 12 .............. loss : 1051.11491136489 ....val_loss : 1205.127973426426\n", + "Epoch 13 .............. loss : 1281.200205887976 ....val_loss : 1443.354484807814\n", + "Epoch 14 .............. loss : 1544.497586169613 ....val_loss : 1713.204001736717\n", + "Epoch 15 .............. loss : 1841.007052209801 ....val_loss : 2014.676524213135\n", + "Epoch 16 .............. loss : 2170.72860400854 ....val_loss : 2347.7720522370673\n", + "Epoch 17 .............. loss : 2533.6622415658308 ....val_loss : 2712.4905858085153\n", + "Epoch 18 .............. loss : 2929.807964881672 ....val_loss : 3108.832124927479\n", + "Epoch 19 .............. loss : 3359.1657739560646 ....val_loss : 3536.7966695939576\n", + "Epoch 20 .............. loss : 3821.7356687890083 ....val_loss : 3996.3842198079524\n", + "Epoch 21 .............. loss : 4317.517649380503 ....val_loss : 4487.594775569461\n", + "Epoch 22 .............. loss : 4846.511715730549 ....val_loss : 5010.428336878485\n", + "Epoch 23 .............. loss : 5408.717867839147 ....val_loss : 5564.884903735022\n", + "Epoch 24 .............. loss : 6004.136105706295 ....val_loss : 6150.964476139078\n", + "Epoch 25 .............. loss : 6632.766429331994 ....val_loss : 6768.667054090646\n", + "Epoch 26 .............. loss : 7294.608838716245 ....val_loss : 7417.99263758973\n", + "Epoch 27 .............. loss : 7989.663333859046 ....val_loss : 8098.941226636331\n", + "Epoch 28 .............. loss : 8717.929914760398 ....val_loss : 8811.512821230444\n", + "Epoch 29 .............. loss : 9479.408581420304 ....val_loss : 9555.707421372075\n", + "Epoch 30 .............. loss : 10274.099333838758 ....val_loss : 10331.52502706122\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "#\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def plot_learning_curve(history):\n", + "\n", + "\n", + " plt.plot(list(range(len(history['loss']))), history['loss'])\n", + " plt.plot(list(range(len(history['val_loss']))), history['val_loss'])\n", + " plt.xlabel('Epochs')\n", + " plt.ylabel(\"Loss\")\n", + " plt.title(\"Learning Curve\")\n", + " plt.show()\n", + "\n", + "\n", + "\n", + "\n" + ], + "metadata": { + "collapsed": true, + "id": "SLhHNNqXBO5r" + }, + "execution_count": 59, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "plot_learning_curve(h)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 492 + }, + "id": "pNjIKhVjI72C", + "outputId": "383feaeb-376a-4885-ca86-0052d72df719" + }, + "execution_count": 269, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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19fkakRERKQgUlNTCQ8Pt/+OX4mCUyE5f3rO19dXwUlERKSIKegwGw0OFxERESkgBScRERGRAlJwEhERESkgBScRERGRAlJwEhERESkgBScRERGRAlJwEhERESkgBScRERGRAlJwEhERESkgBScRERGRAlJwEhERESkgBScRERGRAlJwEhEREcdmGLB7ke1Pkyk4iYiIiGPbMhO+ucf2MDk8KTiJiIiI48pMxfj1eQDywqPBYjG1HAUnERERcVzL3sCSnsB+awi9d9yCoR4nERERkctI3ImxejIAL+b2oXXNcljU4yQiIiLyN4YBC57BYs1lUV4DDgc25cHoCLOrwsXsAkREREQusf1H2L+MLMOVl3If4JVONXB1Nr+/x/wKRERERC6WnQG/PAfA5LxOVK1WixZVg0wuykY9TiIiIuJY/ngHUo9w2BrE/4y7+aljlNkV2Zna47R8+XI6depEWFgYFouFOXPm5NtuGAajR4+mdOnSeHp60qZNG3bv3p2vTVJSEr169cLX1xd/f3/69+9Penp6vjabN2+mWbNmeHh4EB4ezvjx4y+pZebMmURGRuLh4UGtWrX4+eefC/3zioiIyBWc2ouxcgIAL+c+QK+m1ahQytvkoi4wNThlZGRQp04dPvroo8tuHz9+PBMmTGDy5MmsXr0ab29vYmJiyMzMtLfp1asX27ZtY9GiRcybN4/ly5czcOBA+/bU1FTatm1LREQE69ev580332Ts2LFMmTLF3mblypX07NmT/v3789dff9G5c2c6d+7M1q1br9+HFxERkfwMAxY+iyUvm2V5tdng2ZQht1c2u6r8DAcBGLNnz7YvW61WIzQ01HjzzTft65KTkw13d3fj22+/NQzDMLZv324Axtq1a+1tFixYYFgsFuPo0aOGYRjGxIkTjYCAACMrK8veZuTIkUa1atXsy/fdd5/RoUOHfPU0btzYeOSRRwpcf0pKigEYKSkpBX6NiIiIXGTnz4YxxtfIHh1gtHp2ijF97aHr/pZX+/vtsIPD9+/fT3x8PG3atLGv8/Pzo3HjxsTGxgIQGxuLv78/DRs2tLdp06YNTk5OrF692t6mefPmuLm52dvExMQQFxfH6dOn7W0ufp/zbc6/z+VkZWWRmpqa7yEiIiLXKCcTFowE4JO8OylRpjr31C9rclGXctjgFB8fD0BISEi+9SEhIfZt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JlXsGApy3Fq2bHnJ9+3RRx81qWLzTZo0idq1a9snuYyOjmbBggX27YX1PVNwcmDTp09nxIgRjBkzhg0bNlCnTh1iYmJITEw0uzSHVqNGDY4fP25//Pnnn2aX5HAyMjKoU6cOH3300WW3jx8/ngkTJjB58mRWr16Nt7c3MTExZGZm3uBKHcuVjhtAu3bt8n3/vv322xtYoeNZtmwZgwcPZtWqVSxatIicnBzatm1LRkaGvc3w4cP56aefmDlzJsuWLePYsWN07drVxKrNV5DjBjBgwIB837fx48ebVLH5ypYty+uvv8769etZt24dt99+O3fffTfbtm0DCvF7ZojDatSokTF48GD7cl5enhEWFmaMGzfOxKoc25gxY4w6deqYXUaRAhizZ8+2L1utViM0NNR488037euSk5MNd3d349tvvzWhQsf09+NmGIbRp08f4+677zalnqIiMTHRAIxly5YZhmH7brm6uhozZ860t9mxY4cBGLGxsWaV6XD+ftwMwzBatGhhPPHEE+YVVQQEBAQYn3zySaF+z9Tj5KCys7NZv349bdq0sa9zcnKiTZs2xMbGmliZ49u9ezdhYWFUrFiRXr16cejQIbNLKlL2799PfHx8vu+en58fjRs31nevAJYuXUpwcDDVqlVj0KBBnDp1yuySHEpKSgoAJUuWBGD9+vXk5OTk+75FRkZSrlw5fd8u8vfjdt4333xDqVKlqFmzJqNGjeLMmTNmlOdw8vLy+O6778jIyCA6OrpQv2e6ya+DOnnyJHl5eYSEhORbHxISws6dO02qyvE1btyYqVOnUq1aNY4fP86LL75Is2bN2Lp1Kz4+PmaXVyTEx8cDXPa7d36bXF67du3o2rUrFSpUYO/evfzf//0f7du3JzY2FmdnZ7PLM53VamXYsGE0bdqUmjVrArbvm5ubG/7+/vna6vt2weWOG8D9999PREQEYWFhbN68mZEjRxIXF8cPP/xgYrXm2rJlC9HR0WRmZlKiRAlmz55NVFQUGzduLLTvmYKT3FTat29vf167dm0aN25MREQEM2bMoH///iZWJsVBjx497M9r1apF7dq1qVSpEkuXLqV169YmVuYYBg8ezNatWzXu8Cr903EbOHCg/XmtWrUoXbo0rVu3Zu/evVSqVOlGl+kQqlWrxsaNG0lJSWHWrFn06dOHZcuWFep76FSdgypVqhTOzs6XjPhPSEggNDTUpKqKHn9/f6pWrcqePXvMLqXIOP/90nfvv6tYsSKlSpXS9w8YMmQI8+bN4/fff6ds2bL29aGhoWRnZ5OcnJyvvb5vNv903C6ncePGAMX6++bm5kblypVp0KAB48aNo06dOrz//vuF+j1TcHJQbm5uNGjQgMWLF9vXWa1WFi9eTHR0tImVFS3p6ens3buX0qVLm11KkVGhQgVCQ0PzffdSU1NZvXq1vntX6ciRI5w6dapYf/8Mw2DIkCHMnj2bJUuWUKFChXzbGzRogKura77vW1xcHIcOHSrW37crHbfL2bhxI0Cx/r79ndVqJSsrq1C/ZzpV58BGjBhBnz59aNiwIY0aNeK9994jIyODfv36mV2aw3rqqafo1KkTERERHDt2jDFjxuDs7EzPnj3NLs2hpKen5/u/0v3797Nx40ZKlixJuXLlGDZsGK+88gpVqlShQoUKvPDCC4SFhdG5c2fzinYA/3bcSpYsyYsvvki3bt0IDQ1l7969PPPMM1SuXJmYmBgTqzbX4MGDmTZtGj/++CM+Pj728SR+fn54enri5+dH//79GTFiBCVLlsTX15ehQ4cSHR1NkyZNTK7ePFc6bnv37mXatGnceeedBAYGsnnzZoYPH07z5s2pXbu2ydWbY9SoUbRv355y5cqRlpbGtGnTWLp0Kb/88kvhfs8K98I/KWwffPCBUa5cOcPNzc1o1KiRsWrVKrNLcmjdu3c3Spcubbi5uRllypQxunfvbuzZs8fsshzO77//bgCXPPr06WMYhm1KghdeeMEICQkx3N3djdatWxtxcXHmFu0A/u24nTlzxmjbtq0RFBRkuLq6GhEREcaAAQOM+Ph4s8s21eWOF2B8/vnn9jZnz541HnvsMSMgIMDw8vIyunTpYhw/fty8oh3AlY7boUOHjObNmxslS5Y03N3djcqVKxtPP/20kZKSYm7hJnrooYeMiIgIw83NzQgKCjJat25t/Prrr/bthfU9sxiGYfzXlCciIiJSHGiMk4iIiEgBKTiJiIiIFJCCk4iIiEgBKTiJiIiIFJCCk4iIiEgBKTiJiIiIFJCCk4iIiEgBKTiJiBQii8XCnDlzzC5DRK4TBScRuWn07dsXi8VyyaNdu3ZmlyYiNwndq05Ebirt2rXj888/z7fO3d3dpGpE5GajHicRuam4u7sTGhqa7xEQEADYTqNNmjSJ9u3b4+npScWKFZk1a1a+12/ZsoXbb78dT09PAgMDGThwIOnp6fnafPbZZ9SoUQN3d3dKly7NkCFD8m0/efIkXbp0wcvLiypVqjB37lz7ttOnT9OrVy+CgoLw9PSkSpUqlwQ9EXFcCk4iUqy88MILdOvWjU2bNtGrVy969OjBjh07AMjIyCAmJoaAgADWrl3LzJkz+e233/IFo0mTJjF48GAGDhzIli1bmDt3LpUrV873Hi+++CL33Xcfmzdv5s4776RXr14kJSXZ33/79u0sWLCAHTt2MGnSJEqVKnXjDoCI/DeFd19iERFz9enTx3B2dja8vb3zPV599VXDMGx3nH/00UfzvaZx48bGoEGDDMMwjClTphgBAQFGenq6ffv8+fMNJycnIz4+3jAMwwgLCzOee+65f6wBMJ5//nn7cnp6ugEYCxYsMAzDMDp16mT069evcD6wiNxwGuMkIjeVVq1aMWnSpHzrSpYsaX8eHR2db1t0dDQbN24EYMeOHdSpUwdvb2/79qZNm2K1WomLi8NisXDs2DFat279rzXUrl3b/tzb2xtfX18SExMBGDRoEN26dWPDhg20bduWzp07c+utt17TZxWRG0/BSURuKt7e3pecOissnp6eBWrn6uqab9lisWC1WgFo3749Bw8e5Oeff2bRokW0bt2awYMH89ZbbxV6vSJS+DTGSUSKlVWrVl2yXL16dQCqV6/Opk2byMjIsG9fsWIFTk5OVKtWDR8fH8qXL8/ixYv/Uw1BQUH06dOHr7/+mvfee48pU6b8p/2JyI2jHicRualkZWURHx+fb52Li4t9APbMmTNp2LAht912G9988w1r1qzh008/BaBXr16MGTOGPn36MHbsWE6cOMHQoUPp3bs3ISEhAIwdO5ZHH32U4OBg2rdvT1paGitWrGDo0KEFqm/06NE0aNCAGjVqkJWVxbx58+zBTUQcn4KTiNxUFi5cSOnSpfOtq1atGjt37gRsV7x99913PPbYY5QuXZpvv/2WqKgoALy8vPjll1944oknuOWWW/Dy8qJbt26888479n316dOHzMxM3n33XZ566ilKlSrFPffcU+D63NzcGDVqFAcOHMDT05NmzZrx3XffFcInF5EbwWIYhmF2ESIiN4LFYmH27Nl07tzZ7FJEpIjSGCcRERGRAlJwEhERESkgjXESkWJDIxNE5L9Sj5OIiIhIASk4iYiIiBSQgpOIiIhIASk4iYiIiBSQgpOIiIhIASk4iYiIiBSQgpOIiIhIASk4iYiIiBSQgpOIiIhIAf0/9AuYBLzmOoAAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "#Réseau de neurones simple" + ], + "metadata": { + "id": "jSbN7s3hIV_N" + } + }, + { + "cell_type": "code", + "source": [ + "sigmoid = Sigmoid()\n", + "model = Model(layers = [Dense(neurons=3, activation=sigmoid),\n", + " Dense(neurons=1)])\n", + "mse = Loss()\n", + "model.compile(loss=mse, learning_rate=0.0001)" + ], + "metadata": { + "id": "F4hDxh2xAeDM" + }, + "execution_count": 60, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "h = model.fit(X_train, y_train, epochs=150, validation_data=(X_test, y_test))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Oc0Ym7mHCCO7", + "outputId": "0530f175-8266-4e0a-ef39-ac2ec8496138" + }, + "execution_count": 61, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1 .............. loss : 507.9248956497336 ....val_loss : 492.311693850643\n", + "Epoch 2 .............. loss : 385.89495140692316 ....val_loss : 373.51017069117904\n", + "Epoch 3 .............. loss : 291.17619082017 ....val_loss : 281.7732417488408\n", + "Epoch 4 .............. loss : 219.75979260483584 ....val_loss : 213.27980491645158\n", + "Epoch 5 .............. loss : 168.45961161605925 ....val_loss : 164.89930377159283\n", + "Epoch 6 .............. loss : 132.08416055931372 ....val_loss : 131.23235818984935\n", + "Epoch 7 .............. loss : 106.37686490362891 ....val_loss : 107.68580089711702\n", + "Epoch 8 .............. loss : 88.20382268012803 ....val_loss : 91.17465167251936\n", + "Epoch 9 .............. loss : 75.3310635935989 ....val_loss : 79.86033890727212\n", + "Epoch 10 .............. loss : 66.19183019020247 ....val_loss : 72.3635639728097\n", + "Epoch 11 .............. loss : 59.631502712403254 ....val_loss : 67.45066259302294\n", + "Epoch 12 .............. loss : 54.86506266243943 ....val_loss : 64.19452812522401\n", + "Epoch 13 .............. loss : 51.39897439473629 ....val_loss : 61.98289241696515\n", + "Epoch 14 .............. loss : 48.88322330037208 ....val_loss : 60.42764607620389\n", + "Epoch 15 .............. loss : 47.0472959649447 ....val_loss : 59.28493721751025\n", + "Epoch 16 .............. loss : 45.69040706710793 ....val_loss : 58.402022235197435\n", + "Epoch 17 .............. loss : 44.66973205588522 ....val_loss : 57.683877189907676\n", + "Epoch 18 .............. loss : 43.88581096426192 ....val_loss : 57.072158495214104\n", + "Epoch 19 .............. loss : 43.27086576422308 ....val_loss : 56.53145547861849\n", + "Epoch 20 .............. loss : 42.77971094185645 ....val_loss : 56.03993171508642\n", + "Epoch 21 .............. loss : 42.38216708984503 ....val_loss : 55.58298805219225\n", + "Epoch 22 .............. loss : 42.057224167449405 ....val_loss : 55.14945124492186\n", + "Epoch 23 .............. loss : 41.78926750402195 ....val_loss : 54.73005606081572\n", + "Epoch 24 .............. loss : 41.56593871803749 ....val_loss : 54.31774862648784\n", + "Epoch 25 .............. loss : 41.377079526252246 ....val_loss : 53.90884946759456\n", + "Epoch 26 .............. loss : 41.214331912649364 ....val_loss : 53.50385642437032\n", + "Epoch 27 .............. loss : 41.07102377748263 ....val_loss : 53.10704259045109\n", + "Epoch 28 .............. loss : 40.94210537519956 ....val_loss : 52.724878619059616\n", + "Epoch 29 .............. loss : 40.82404627207886 ....val_loss : 52.3640459779124\n", + "Epoch 30 .............. loss : 40.71467133748012 ....val_loss : 52.02989671814513\n", + "Epoch 31 .............. loss : 40.61293872333437 ....val_loss : 51.72576552347716\n", + "Epoch 32 .............. loss : 40.518677750331356 ....val_loss : 51.4530326199956\n", + "Epoch 33 .............. loss : 40.43231436804492 ....val_loss : 51.21158158116738\n", + "Epoch 34 .............. loss : 40.35460986711846 ....val_loss : 51.00030420932906\n", + "Epoch 35 .............. loss : 40.28642533183208 ....val_loss : 50.817461640230654\n", + "Epoch 36 .............. loss : 40.22851326738186 ....val_loss : 50.660890411935874\n", + "Epoch 37 .............. loss : 40.18134210707968 ....val_loss : 50.52814323451572\n", + "Epoch 38 .............. loss : 40.144974091487974 ....val_loss : 50.41664448887891\n", + "Epoch 39 .............. loss : 40.11902228228939 ....val_loss : 50.32386916608311\n", + "Epoch 40 .............. loss : 40.102695831778064 ....val_loss : 50.24749771218892\n", + "Epoch 41 .............. loss : 40.09491393200295 ....val_loss : 50.18549666534703\n", + "Epoch 42 .............. loss : 40.09444913770857 ....val_loss : 50.136111877693246\n", + "Epoch 43 .............. loss : 40.1000609996397 ....val_loss : 50.09780179736049\n", + "Epoch 44 .............. loss : 40.11059558042304 ....val_loss : 50.0691577787454\n", + "Epoch 45 .............. loss : 40.125043442867636 ....val_loss : 50.048852136233386\n", + "Epoch 46 .............. loss : 40.142560568292325 ....val_loss : 50.0356323041044\n", + "Epoch 47 .............. loss : 40.16246229040811 ....val_loss : 50.02835513329822\n", + "Epoch 48 .............. loss : 40.18420152303327 ....val_loss : 50.02603995191779\n", + "Epoch 49 .............. loss : 40.20734113335652 ....val_loss : 50.02791630697345\n", + "Epoch 50 .............. loss : 40.23152750995058 ....val_loss : 50.03344937185345\n", + "Epoch 51 .............. loss : 40.25646918201403 ....val_loss : 50.04233683177339\n", + "Epoch 52 .............. loss : 40.281921582282564 ....val_loss : 50.054480401571674\n", + "Epoch 53 .............. loss : 40.30767720202207 ....val_loss : 50.069940449478686\n", + "Epoch 54 .............. loss : 40.33355954114813 ....val_loss : 50.08888347772243\n", + "Epoch 55 .............. loss : 40.35941918274834 ....val_loss : 50.11153074372604\n", + "Epoch 56 .............. loss : 40.38513068353332 ....val_loss : 50.13811359976403\n", + "Epoch 57 .............. loss : 40.41058948264543 ....val_loss : 50.16883832033585\n", + "Epoch 58 .............. loss : 40.435708515150004 ....val_loss : 50.20386091533177\n", + "Epoch 59 .............. loss : 40.46041459862972 ....val_loss : 50.24327092968674\n", + "Epoch 60 .............. loss : 40.48464492608602 ....val_loss : 50.28708248251587\n", + "Epoch 61 .............. loss : 40.508344150872624 ....val_loss : 50.33523064085543\n", + "Epoch 62 .............. loss : 40.53146259363607 ....val_loss : 50.38757145056466\n", + "Epoch 63 .............. loss : 40.55395603565454 ....val_loss : 50.44388436817143\n", + "Epoch 64 .............. loss : 40.57578738698816 ....val_loss : 50.50387630203238\n", + "Epoch 65 .............. loss : 40.59693024238379 ....val_loss : 50.56718687549166\n", + "Epoch 66 .............. loss : 40.61737399356962 ....val_loss : 50.6333948067215\n", + "Epoch 67 .............. loss : 40.63712980602966 ....val_loss : 50.702025433177184\n", + "Epoch 68 .............. loss : 40.65623646101746 ....val_loss : 50.77255939948401\n", + "Epoch 69 .............. loss : 40.674764884588846 ....val_loss : 50.84444241275351\n", + "Epoch 70 .............. loss : 40.69282020035226 ....val_loss : 50.91709580808478\n", + "Epoch 71 .............. loss : 40.71054038966004 ....val_loss : 50.98992752627392\n", + "Epoch 72 .............. loss : 40.72809111502473 ....val_loss : 51.062343041234314\n", + "Epoch 73 .............. loss : 40.74565689448225 ....val_loss : 51.13375581498961\n", + "Epoch 74 .............. loss : 40.76342948438542 ....val_loss : 51.20359699829011\n", + "Epoch 75 .............. loss : 40.78159487992515 ....val_loss : 51.271324300315236\n", + "Epoch 76 .............. loss : 40.800320631475635 ....val_loss : 51.33643016929486\n", + "Epoch 77 .............. loss : 40.81974511763001 ....val_loss : 51.39844960145835\n", + "Epoch 78 .............. loss : 40.83997002631903 ....val_loss : 51.456967980916\n", + "Epoch 79 .............. loss : 40.86105668299264 ....val_loss : 51.51162931558723\n", + "Epoch 80 .............. loss : 40.883026195043534 ....val_loss : 51.56214506051148\n", + "Epoch 81 .............. loss : 40.905862817066684 ....val_loss : 51.60830341704225\n", + "Epoch 82 .............. loss : 40.92951959030611 ....val_loss : 51.64997859545935\n", + "Epoch 83 .............. loss : 40.95392520217016 ....val_loss : 51.68713908776122\n", + "Epoch 84 .............. loss : 40.97899110968672 ....val_loss : 51.71985360427468\n", + "Epoch 85 .............. loss : 41.004618196814775 ....val_loss : 51.74829309356426\n", + "Epoch 86 .............. loss : 41.03070250640697 ....val_loss : 51.77272730715019\n", + "Epoch 87 .............. loss : 41.05713983817976 ....val_loss : 51.79351477885817\n", + "Epoch 88 .............. loss : 41.083829197047706 ....val_loss : 51.811085883104944\n", + "Epoch 89 .............. loss : 41.11067520042338 ....val_loss : 51.82591972846423\n", + "Epoch 90 .............. loss : 41.137589615388 ....val_loss : 51.83851682400832\n", + "Epoch 91 .............. loss : 41.16449221266044 ....val_loss : 51.84937043278117\n", + "Epoch 92 .............. loss : 41.19131111134402 ....val_loss : 51.85894000440909\n", + "Epoch 93 .............. loss : 41.21798276122142 ....val_loss : 51.86762986845069\n", + "Epoch 94 .............. loss : 41.24445167833364 ....val_loss : 51.87577547453298\n", + "Epoch 95 .............. loss : 41.270670020921045 ....val_loss : 51.883638097440034\n", + "Epoch 96 .............. loss : 41.29659706936285 ....val_loss : 51.89140744155955\n", + "Epoch 97 .............. loss : 41.32219865609669 ....val_loss : 51.8992103545786\n", + "Epoch 98 .............. loss : 41.34744657891837 ....val_loss : 51.90712316183027\n", + "Epoch 99 .............. loss : 41.372318022286294 ....val_loss : 51.91518504474608\n", + "Epoch 100 .............. loss : 41.3967950049552 ....val_loss : 51.923410315079025\n", + "Epoch 101 .............. loss : 41.42086386733959 ....val_loss : 51.931798172916814\n", + "Epoch 102 .............. loss : 41.44451480772973 ....val_loss : 51.9403393472614\n", + "Epoch 103 .............. loss : 41.46774147257094 ....val_loss : 51.949019715512335\n", + "Epoch 104 .............. loss : 41.49054060261401 ....val_loss : 51.95782147660231\n", + "Epoch 105 .............. loss : 41.51291173437511 ....val_loss : 51.96672268717468\n", + "Epoch 106 .............. loss : 41.534856955764546 ....val_loss : 51.975695995146154\n", + "Epoch 107 .............. loss : 41.55638071672738 ....val_loss : 51.98470728382701\n", + "Epoch 108 .............. loss : 41.577489700735654 ....val_loss : 51.99371474079561\n", + "Epoch 109 .............. loss : 41.59819277068812 ....val_loss : 52.00266864648595\n", + "Epoch 110 .............. loss : 41.61850101171346 ....val_loss : 52.01151197807518\n", + "Epoch 111 .............. loss : 41.63842790049806 ....val_loss : 52.02018176723622\n", + "Epoch 112 .............. loss : 41.657989631471196 ....val_loss : 52.028611043695854\n", + "Epoch 113 .............. loss : 41.67720561889585 ....val_loss : 52.036731138378336\n", + "Epoch 114 .............. loss : 41.696099165466514 ....val_loss : 52.04447410260184\n", + "Epoch 115 .............. loss : 41.7146982398958 ....val_loss : 52.05177501348753\n", + "Epoch 116 .............. loss : 41.733036241059864 ....val_loss : 52.058573970782284\n", + "Epoch 117 .............. loss : 41.75115255515565 ....val_loss : 52.06481763854988\n", + "Epoch 118 .............. loss : 41.7690926538302 ....val_loss : 52.070460240441456\n", + "Epoch 119 .............. loss : 41.78690745973005 ....val_loss : 52.07546397494246\n", + "Epoch 120 .............. loss : 41.80465174462999 ....val_loss : 52.07979887343239\n", + "Epoch 121 .............. loss : 41.82238143680117 ....val_loss : 52.083442175528454\n", + "Epoch 122 .............. loss : 41.84014989123746 ....val_loss : 52.08637733907198\n", + "Epoch 123 .............. loss : 41.85800338742055 ....val_loss : 52.08859283200189\n", + "Epoch 124 .............. loss : 41.87597631405203 ....val_loss : 52.09008086641048\n", + "Epoch 125 .............. loss : 41.89408662365801 ....val_loss : 52.09083622902622\n", + "Epoch 126 .............. loss : 41.912332152035326 ....val_loss : 52.09085533764709\n", + "Epoch 127 .............. loss : 41.93068828866181 ....val_loss : 52.09013561330311\n", + "Epoch 128 .............. loss : 41.94910728018474 ....val_loss : 52.08867520960489\n", + "Epoch 129 .............. loss : 41.96751920175877 ....val_loss : 52.086473091727086\n", + "Epoch 130 .............. loss : 41.985834399713625 ....val_loss : 52.083529415292396\n", + "Epoch 131 .............. loss : 42.003947041409106 ....val_loss : 52.079846125525044\n", + "Epoch 132 .............. loss : 42.02173932785389 ....val_loss : 52.07542768190237\n", + "Epoch 133 .............. loss : 42.03908592970872 ....val_loss : 52.07028181259525\n", + "Epoch 134 .............. loss : 42.05585827679435 ....val_loss : 52.064420213418515\n", + "Epoch 135 .............. loss : 42.071928436048644 ....val_loss : 52.05785912381381\n", + "Epoch 136 .............. loss : 42.0871724252337 ....val_loss : 52.05061973347634\n", + "Epoch 137 .............. loss : 42.10147290908293 ....val_loss : 52.042728394215956\n", + "Epoch 138 .............. loss : 42.11472129965697 ....val_loss : 52.03421663017993\n", + "Epoch 139 .............. loss : 42.1268193302131 ....val_loss : 52.02512095439936\n", + "Epoch 140 .............. loss : 42.13768019427946 ....val_loss : 52.015482510401306\n", + "Epoch 141 .............. loss : 42.147229344262556 ....val_loss : 52.00534656459878\n", + "Epoch 142 .............. loss : 42.1554050331167 ....val_loss : 51.99476187892978\n", + "Epoch 143 .............. loss : 42.1621586642662 ....val_loss : 51.98377999447271\n", + "Epoch 144 .............. loss : 42.167454993911726 ....val_loss : 51.97245445621539\n", + "Epoch 145 .............. loss : 42.171272209625734 ....val_loss : 51.960840007390054\n", + "Epoch 146 .............. loss : 42.17360189210402 ....val_loss : 51.94899177926926\n", + "Epoch 147 .............. loss : 42.17444885444739 ....val_loss : 51.93696449937967\n", + "Epoch 148 .............. loss : 42.173830845959635 ....val_loss : 51.92481173795804\n", + "Epoch 149 .............. loss : 42.17177810510979 ....val_loss : 51.91258520927922\n", + "Epoch 150 .............. loss : 42.168332748505534 ....val_loss : 51.900334141313245\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "plot_learning_curve(h)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 492 + }, + "id": "J9bNex4jJDVA", + "outputId": "432e5226-5c88-447f-e952-571c38b770ae" + }, + "execution_count": 67, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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Krp37w7AF198QWxsLLt37+bDDz/ktddeq9QCRURESuj+CAARu2bRKfgo6bkF/LZFdy/VRRUKMllZWQQHBwPw008/MWTIEKxWKxdffDG7d++u1AJFRERKiG8HLfphMZw8HvIjAN/r7qU6qUJBplmzZnz99dfs3buX2bNn07t3bwCSk5N1e7SIiFSPy1xXZdofm019y2F1L9VRFQoyTz75JI888giNGjWic+fOdO3aFXBdnenQoUOlFigiIlKq+p2gyRVYjQLG+H+v7qU6qkJB5rrrrmPPnj2sWLGC2bNnu7f37NmTV155pdKKExEROaPLxgEwyPiZWI4xa90BkwuS6laheWQA4uLiiIuLcz8Fu379+poMT0REqlejbtDgEux7FjHK/h0vbYwmO68Qf1+b2ZVJNanQFRmn08m//vUvQkNDadiwIQ0bNiQsLIxnn30Wp9NZ2TWKiIicXg/XVZlh9nn45x1j7p+HTC5IqlOFrsg8/vjjvPfeezz//PN069YNgIULF/L000+Tk5PDc889V6lFioiInFaTK6BeR/z2r+Qu+/fMXNuCAe0TzK5KqonFMAyjvB9KSEjgrbfecj/1utg333zDvffey/79+yutwHOVlpZGaGgoqampuqNKRKS22jIbPrmBLMPBlQWvMvvx6wkN8DG7KjkHZf37XaGupWPHjtGyZcsS21u2bMmxY8cqckoREZGKa94b6nUkwJLLnZZv+fEPzSlTV1QoyLRv35433nijxPY33niDdu3anXNRIiIi5WKxwBX/AOA22xwWrFxvckFSXSo0RuaFF16gf//+zJ071z2HzOLFi9m7dy/ff/99pRYoIiJSJk17kht/EX4Hl9N53xSS03oSE+JndlVSxSp0RaZHjx5s2bKFwYMHk5KSQkpKCkOGDOGPP/7go48+quwaRUREzs5iwXHVEwDcbJvHz8tWm1yQVIcKDfY9nbVr13LhhRdSWFhzpojWYF8Rkbrl4P/1JP74Cn7wu5p+j35qdjlSQVU62FdERKSm8u/9JAA9s2ezb+cmk6uRqqYgIyIitUrY+T1Y77gQX0shqT/+x+xypIopyIiISK2T3OlhAFoe+hbj6HaTq5GqVK67loYMGXLG/SkpKedSi4iISKW4qHsffvmtA5dbV5Py438IG/ae2SVJFSlXkAkNDT3r/ttvv/2cChIRETlXIX4+LEoc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IC0tjdDQUFJTUwkJCTG7HBERkVpl++EMmkYHVfp5y/r3W1dkREREpMKqIsSUh4KMiIiIeC0FGREREfFaCjIiIiLitRRkRERExGspyIiIiIjXUpARERERr6UgIyIiIl5LQUZERES8loKMiIiIeC0FGREREfFaCjIiIiLitRRkRERExGspyIiIiIjXsptdQFUzDANwPQ5cREREvEPx3+3iv+OnU+uDTHp6OgCJiYkmVyIiIiLllZ6eTmho6Gn3W4yzRR0v53Q6OXDgAMHBwVgslko7b1paGomJiezdu5eQkJBKO29NVtfaXNfaC2pzXWhzXWsv1L0215b2GoZBeno6CQkJWK2nHwlT66/IWK1W6tevX2XnDwkJ8er/oVREXWtzXWsvqM11QV1rL9S9NteG9p7pSkwxDfYVERERr6UgIyIiIl5LQaaCHA4HTz31FA6Hw+xSqk1da3Nday+ozXVBXWsv1L0217X21vrBviIiIlJ76YqMiIiIeC0FGREREfFaCjIiIiLitRRkRERExGspyFTQ//73Pxo1aoSfnx9dunRh2bJlZpdUKcaPH89FF11EcHAwMTExDBo0iM2bN3sck5OTw+jRo4mMjCQoKIihQ4dy6NAhkyquXM8//zwWi4UxY8a4t9XG9u7fv59bb72VyMhI/P39adu2LStWrHDvNwyDJ598kvj4ePz9/enVqxdbt241seJzU1hYyBNPPEHjxo3x9/enadOmPPvssx7PcPHmNv/6668MGDCAhIQELBYLX3/9tcf+srTt2LFjDBs2jJCQEMLCwrjzzjvJyMioxlaUz5nanJ+fz9///nfatm1LYGAgCQkJ3H777Rw4cMDjHN7U5rP9G5/s7rvvxmKx8Oqrr3ps96b2loeCTAV8/vnnPPTQQzz11FOsWrWK9u3b06dPH5KTk80u7ZwtWLCA0aNHs2TJEubMmUN+fj69e/cmMzPTfczYsWP59ttvmT59OgsWLODAgQMMGTLExKorx/Lly3n77bdp166dx/ba1t7jx4/TrVs3fHx8+OGHH9i4cSMvvfQS4eHh7mNeeOEFXnvtNd566y2WLl1KYGAgffr0IScnx8TKK27ChAlMnDiRN954gz///JMJEybwwgsv8Prrr7uP8eY2Z2Zm0r59e/73v/+Vur8sbRs2bBh//PEHc+bMYdasWfz666+MGjWquppQbmdq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EfFaCjIiIiLitRRkRERExGspyIiIiIjXUpARERERr6UgIyK1nsVi4euvvza7DBGpAgoyIlKlRowYgcViKbH07dvX7NJEpBawm12AiNR+ffv2ZfLkyR7bHA6HSdWISG2iKzIiUuUcDgdxcXEeS3h4OODq9pk4cSL9+vXD39+fJk2a8MUXX3h8fv369Vx55ZX4+/sTGRnJqFGjyMjI8Djm/fffp3Xr1jgcDuLj47nvvvs89h85coTBgwcTEBBA8+bNmTlzpnvf8ePHGTZsGNHR0fj7+9O8efMSwUtEaiYFGREx3RNPPMHQoUNZu3Ytw4YN46abbuLPP/8EIDMzkz59+hAeHs7y5cuZPn06c+fO9QgqEydOZPTo0YwaNYr169czc+ZMmjVr5vEdzzzzDDfccAPr1q3j6quvZtiwYRw7dsz9/Rs3buSHH37gzz//ZOLEiURFRVXfD0BEKs7sp1aKSO02fPhww2azGYGBgR7Lc889ZxiG64nrd999t8dnunTpYtxzzz2GYRjGpEmTjPDwcCMjI8O9/7vvvjOsVquRlJRkGIZhJCQkGI8//vhpawCMf/7zn+73GRkZBmD88MMPhmEYxoABA4w77rijchosItVKY2REpMpdccUVTJw40WNbRESEe71r164e+7p27cqaNWsA+PPPP2nfvj2BgYHu/d26dcPpdLJ582YsFgsHDhygZ8+eZ6yhXbt27vXAwEBCQkJITk4G4J577mHo0KGsWrWK3r17M2jQIC655JIKtVVEqpeCjIhUucDAwBJdPZXF39+/TMf5+Ph4vLdYLDidTgD69evH7t27+f7775kzZw49e/Zk9OjRvPjii5Ver4hULo2RERHTLVmypMT7888/H4Dzzz+ftWvXkpmZ6d7/+++/Y7VaOe+88wgODqZRo0bMmzfvnGqIjo5m+PDhTJ06lVdffZVJkyad0/lEpHroioyIVLnc3FySkpI8ttntdveA2unTp9OpUycuvfRSPv74Y5YtW8Z7770HwLBhw3jqqacYPnw4Tz/9NIcPH+b+++/ntttuIzY2FoCnn36au+++m5iYGPr160d6ejq///47999/f5nqe/LJJ+nYsSOtW7cmNzeXWbNmuYOUiNRsCjIiUuV+/PFH4uPjPbadd955bNq0CXDdUfTZZ59x7733Eh8fz6effkqrVq0ACAgIYPbs2Tz44INcdNFFBAQEMHToUF5++WX3uYYPH05OTg6vvPIKjzzyCFFRUVx33XVlrs/X15fHHnuMXbt24e/vT/fu3fnss88qoeUiUtUshmEYZhchInWXxWLhq6++YtCgQWaXIiJeSGNkRERExGspyIiIiIjX0hgZETGVerdF5FzoioyIiIh4LQUZERER8VoKMiIiIuK1FGRERETEaynIiIiIiNdSkBERERGvpSAjIiIiXktBRkRERLyWgoyIiIh4rf8HUuR+uJ/En8AAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Deep Neural Network" + ], + "metadata": { + "id": "AWmjux3iJFXw" + } + }, + { + "cell_type": "code", + "source": [ + "sigmoid = Sigmoid()\n", + "model = Model([ Dense(neurons=13, activation=sigmoid),\n", + " Dense(neurons=10, activation=sigmoid),\n", + " Dense(neurons=5, activation=sigmoid),\n", + " Dense(neurons=1),\n", + "\n", + " ])" + ], + "metadata": { + "id": "VUwk80ujJHyw" + }, + "execution_count": 63, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "model" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8m_9nBx_JKb_", + "outputId": "297bfac4-c230-44cb-d9f3-de1edd819076" + }, + "execution_count": 64, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Layers ................. \n", + " DenseLayer(neurons=13) avec Sigmoid \n", + " DenseLayer(neurons=10) avec Sigmoid \n", + " DenseLayer(neurons=5) avec Sigmoid \n", + " DenseLayer(neurons=1)" + ] + }, + "metadata": {}, + "execution_count": 64 + } + ] + }, + { + "cell_type": "code", + "source": [ + "mse = Loss()\n", + "model.compile(loss=mse, learning_rate=0.0001)\n", + "h = model.fit(X_train, y_train, epochs=150, validation_data=(X_test, y_test))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1N7Zo6i4JPbz", + "outputId": "f1fd2bf4-fec2-4cd6-ee63-3cde2cb5d024" + }, + "execution_count": 66, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":7: RuntimeWarning: overflow encountered in exp\n", + " return 1 / (1 + np.exp(-1 * self.inputs))\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1 .............. loss : 85.80773718977571 ....val_loss : 81.87937780946658\n", + "Epoch 2 .............. loss : 85.77955529545885 ....val_loss : 81.85913799596521\n", + "Epoch 3 .............. loss : 85.75204145868435 ....val_loss : 81.83934911142985\n", + "Epoch 4 .............. loss : 85.7252012247303 ....val_loss : 81.82001417282846\n", + "Epoch 5 .............. loss : 85.69903943490804 ....val_loss : 81.80113534581632\n", + "Epoch 6 .............. loss : 85.67356000398715 ....val_loss : 81.78271738789957\n", + "Epoch 7 .............. loss : 85.64876549689971 ....val_loss : 81.76476512500399\n", + "Epoch 8 .............. loss : 85.62465689142424 ....val_loss : 81.74727451739477\n", + "Epoch 9 .............. loss : 85.60123765659418 ....val_loss : 81.73024605074885\n", + "Epoch 10 .............. loss : 85.57849312502017 ....val_loss : 81.71367848923887\n", + "Epoch 11 .............. loss : 85.55637965863309 ....val_loss : 81.69756910610937\n", + "Epoch 12 .............. loss : 85.53495942274186 ....val_loss : 81.68191444243354\n", + "Epoch 13 .............. loss : 85.51422838565357 ....val_loss : 81.6667113622723\n", + "Epoch 14 .............. loss : 85.49416411227644 ....val_loss : 81.65195520033608\n", + "Epoch 15 .............. loss : 85.4747547597611 ....val_loss : 81.63763957056189\n", + "Epoch 16 .............. loss : 85.45598800623873 ....val_loss : 81.62375670735729\n", + "Epoch 17 .............. loss : 85.43784942229857 ....val_loss : 81.61029748458613\n", + "Epoch 18 .............. loss : 85.42032232890742 ....val_loss : 81.59725139844943\n", + "Epoch 19 .............. loss : 85.40338778842309 ....val_loss : 81.58460656194484\n", + "Epoch 20 .............. loss : 85.38702462103936 ....val_loss : 81.57234971467132\n", + "Epoch 21 .............. loss : 85.37120944391025 ....val_loss : 81.56046624794574\n", + "Epoch 22 .............. loss : 85.35591673379177 ....val_loss : 81.54894024482849\n", + "Epoch 23 .............. loss : 85.34111891270658 ....val_loss : 81.5377545343786\n", + "Epoch 24 .............. loss : 85.32678645533625 ....val_loss : 81.52689075915909\n", + "Epoch 25 .............. loss : 85.31288801637906 ....val_loss : 81.51632945472225\n", + "Epoch 26 .............. loss : 85.29939057601298 ....val_loss : 81.50605013956113\n", + "Epoch 27 .............. loss : 85.28625960261492 ....val_loss : 81.49603141382366\n", + "Epoch 28 .............. loss : 85.27345923731518 ....val_loss : 81.48625106501501\n", + "Epoch 29 .............. loss : 85.26095252853118 ....val_loss : 81.47668617911795\n", + "Epoch 30 .............. loss : 85.24870183054448 ....val_loss : 81.46731325675634\n", + "Epoch 31 .............. loss : 85.2366695364256 ....val_loss : 81.45810833857549\n", + "Epoch 32 .............. loss : 85.22481734907869 ....val_loss : 81.44904714967241\n", + "Epoch 33 .............. loss : 85.2131025536866 ....val_loss : 81.44010519356227\n", + "Epoch 34 .............. loss : 85.20148324690498 ....val_loss : 81.43125768143392\n", + "Epoch 35 .............. loss : 85.18992025247385 ....val_loss : 81.42247972110783\n", + "Epoch 36 .............. loss : 85.1783741990531 ....val_loss : 81.41374654736187\n", + "Epoch 37 .............. loss : 85.16680552359793 ....val_loss : 81.405033575577\n", + "Epoch 38 .............. loss : 85.15517490717467 ....val_loss : 81.39631645109385\n", + "Epoch 39 .............. loss : 85.14344350756227 ....val_loss : 81.3875711114501\n", + "Epoch 40 .............. loss : 85.13157309948501 ....val_loss : 81.37877384713869\n", + "Epoch 41 .............. loss : 85.1195261802303 ....val_loss : 81.36990135554394\n", + "Epoch 42 .............. loss : 85.10726605669957 ....val_loss : 81.3609307868814\n", + "Epoch 43 .............. loss : 85.094756918057 ....val_loss : 81.35183978218458\n", + "Epoch 44 .............. loss : 85.08196389537265 ....val_loss : 81.34260650375617\n", + "Epoch 45 .............. loss : 85.0688531091294 ....val_loss : 81.33320965865515\n", + "Epoch 46 .............. loss : 85.05539170541553 ....val_loss : 81.32362851619555\n", + "Epoch 47 .............. loss : 85.04154788165897 ....val_loss : 81.31384296266475\n", + "Epoch 48 .............. loss : 85.02729090277828 ....val_loss : 81.30383971056273\n", + "Epoch 49 .............. loss : 85.01259110862483 ....val_loss : 81.29372731329237\n", + "Epoch 50 .............. loss : 84.99741991356032 ....val_loss : 81.283243826103\n", + "Epoch 51 .............. loss : 84.98174979896446 ....val_loss : 81.27245970643067\n", + "Epoch 52 .............. loss : 84.9655542993962 ....val_loss : 81.26137849655854\n", + "Epoch 53 .............. loss : 84.9488079830401 ....val_loss : 81.24998357885697\n", + "Epoch 54 .............. loss : 84.93148642694597 ....val_loss : 81.23825876603529\n", + "Epoch 55 .............. loss : 84.91356618738749 ....val_loss : 81.22618843182948\n", + "Epoch 56 .............. loss : 84.89502476532554 ....val_loss : 81.21375752478782\n", + "Epoch 57 .............. loss : 84.87584056614934 ....val_loss : 81.20095162961383\n", + "Epoch 58 .............. loss : 84.85599285056114 ....val_loss : 81.18775718168627\n", + "Epoch 59 .............. loss : 84.83546166658314 ....val_loss : 81.17416215288644\n", + "Epoch 60 .............. loss : 84.81422773574717 ....val_loss : 81.16015795721447\n", + "Epoch 61 .............. loss : 84.79227226982185 ....val_loss : 81.1457423972542\n", + "Epoch 62 .............. loss : 84.76957701993247 ....val_loss : 81.13091264555021\n", + "Epoch 63 .............. loss : 84.74612534155825 ....val_loss : 81.11563798155767\n", + "Epoch 64 .............. loss : 84.72190190255195 ....val_loss : 81.09987957820421\n", + "Epoch 65 .............. loss : 84.69689037918553 ....val_loss : 81.08362894882434\n", + "Epoch 66 .............. loss : 84.67107412041655 ....val_loss : 81.06689288568242\n", + "Epoch 67 .............. loss : 84.64443691035589 ....val_loss : 81.04977305495903\n", + "Epoch 68 .............. loss : 84.6169627273055 ....val_loss : 81.03246779945371\n", + "Epoch 69 .............. loss : 84.58863540620605 ....val_loss : 81.01434221826261\n", + "Epoch 70 .............. loss : 84.55943834536245 ....val_loss : 80.99558899863115\n", + "Epoch 71 .............. loss : 84.52935419838052 ....val_loss : 80.97628868632007\n", + "Epoch 72 .............. loss : 84.49836451066858 ....val_loss : 80.9564346346408\n", + "Epoch 73 .............. loss : 84.46644927512638 ....val_loss : 80.93601318673835\n", + "Epoch 74 .............. loss : 84.43358638415566 ....val_loss : 80.91500883230086\n", + "Epoch 75 .............. loss : 84.39975095213191 ....val_loss : 80.89340399598012\n", + "Epoch 76 .............. loss : 84.36491447699714 ....val_loss : 80.87117843848687\n", + "Epoch 77 .............. loss : 84.32904380242239 ....val_loss : 80.8483085031229\n", + "Epoch 78 .............. loss : 84.29209983298196 ....val_loss : 80.82476618598194\n", + "Epoch 79 .............. loss : 84.2540359436615 ....val_loss : 80.80051798866961\n", + "Epoch 80 .............. loss : 84.21479601134764 ....val_loss : 80.77552350206386\n", + "Epoch 81 .............. loss : 84.17431197919535 ....val_loss : 80.74973365755052\n", + "Epoch 82 .............. loss : 84.13250084435987 ....val_loss : 80.7230885674765\n", + "Epoch 83 .............. loss : 84.08926093488576 ....val_loss : 80.69551485881206\n", + "Epoch 84 .............. loss : 84.04446759225007 ....val_loss : 80.66692238276644\n", + "Epoch 85 .............. loss : 83.99803672102446 ....val_loss : 80.63720016205603\n", + "Epoch 86 .............. loss : 83.94963872856455 ....val_loss : 80.60621241001415\n", + "Epoch 87 .............. loss : 83.89910843473425 ....val_loss : 80.57378913873764\n", + "Epoch 88 .............. loss : 83.84615666338097 ....val_loss : 80.5397221389864\n", + "Epoch 89 .............. loss : 83.79042631001927 ....val_loss : 80.50375453583705\n", + "Epoch 90 .............. loss : 83.7314770085891 ....val_loss : 80.46556964670113\n", + "Epoch 91 .............. loss : 83.6687705041019 ....val_loss : 80.42477754722809\n", + "Epoch 92 .............. loss : 83.60164475690163 ....val_loss : 80.38089909789213\n", + "Epoch 93 .............. loss : 83.5292603664373 ....val_loss : 80.33334699490996\n", + "Epoch 94 .............. loss : 83.45067840960908 ....val_loss : 80.28140315950682\n", + "Epoch 95 .............. loss : 83.3654276894443 ....val_loss : 80.22419592943807\n", + "Epoch 96 .............. loss : 83.27070004038477 ....val_loss : 80.16069412030107\n", + "Epoch 97 .............. loss : 83.16499452186406 ....val_loss : 80.0896088899841\n", + "Epoch 98 .............. loss : 83.04641448709381 ....val_loss : 80.00942273969866\n", + "Epoch 99 .............. loss : 82.91248618963817 ....val_loss : 79.91836178313862\n", + "Epoch 100 .............. loss : 82.76032218616928 ....val_loss : 79.8143726925323\n", + "Epoch 101 .............. loss : 82.58663635437557 ....val_loss : 79.69512424023627\n", + "Epoch 102 .............. loss : 82.38778168968412 ....val_loss : 79.55803648117869\n", + "Epoch 103 .............. loss : 82.15984079804873 ....val_loss : 79.40034871844313\n", + "Epoch 104 .............. loss : 81.89878649314875 ....val_loss : 79.21923804811576\n", + "Epoch 105 .............. loss : 81.60072519877279 ....val_loss : 79.0119970505991\n", + "Epoch 106 .............. loss : 81.26222471984592 ....val_loss : 78.77627084931349\n", + "Epoch 107 .............. loss : 80.88070833036346 ....val_loss : 78.51033934906947\n", + "Epoch 108 .............. loss : 80.45487047507828 ....val_loss : 78.21341126709713\n", + "Epoch 109 .............. loss : 79.9846528751696 ....val_loss : 77.88587751313491\n", + "Epoch 110 .............. loss : 79.47274941825049 ....val_loss : 77.52939438384634\n", + "Epoch 111 .............. loss : 78.92311078033802 ....val_loss : 77.14705425217733\n", + "Epoch 112 .............. loss : 78.34141222916637 ....val_loss : 76.74304423426324\n", + "Epoch 113 .............. loss : 77.73301473006664 ....val_loss : 76.32233133961114\n", + "Epoch 114 .............. loss : 77.1062101747801 ....val_loss : 75.88909865197171\n", + "Epoch 115 .............. loss : 76.46896265510468 ....val_loss : 75.44978055488829\n", + "Epoch 116 .............. loss : 75.82788056950962 ....val_loss : 75.00911179694992\n", + "Epoch 117 .............. loss : 75.1885748030063 ....val_loss : 74.57113731934541\n", + "Epoch 118 .............. loss : 74.55548199115756 ....val_loss : 74.13912054657955\n", + "Epoch 119 .............. loss : 73.931799847253 ....val_loss : 73.6987600150539\n", + "Epoch 120 .............. loss : 73.31946734761429 ....val_loss : 73.28340863301383\n", + "Epoch 121 .............. loss : 72.71936443020158 ....val_loss : 72.8676803610481\n", + "Epoch 122 .............. loss : 72.13246628383408 ....val_loss : 72.47534820002492\n", + "Epoch 123 .............. loss : 71.56129957965383 ....val_loss : 72.0955668808647\n", + "Epoch 124 .............. loss : 71.00778629509894 ....val_loss : 71.7278229147218\n", + "Epoch 125 .............. loss : 70.47341524504259 ....val_loss : 71.36975837630463\n", + "Epoch 126 .............. loss : 69.95501610543629 ....val_loss : 71.03359632905007\n", + "Epoch 127 .............. loss : 69.45470629263271 ....val_loss : 70.71167948106061\n", + "Epoch 128 .............. loss : 68.96796593822863 ....val_loss : 70.39853044284875\n", + "Epoch 129 .............. loss : 68.50373797251686 ....val_loss : 70.10526784272243\n", + "Epoch 130 .............. loss : 68.05716989489999 ....val_loss : 69.82792581793204\n", + "Epoch 131 .............. loss : 67.62233053568569 ....val_loss : 69.5651900740343\n", + "Epoch 132 .............. loss : 67.20563291554855 ....val_loss : 69.31272606070038\n", + "Epoch 133 .............. loss : 66.81091184834129 ....val_loss : 69.07689704352184\n", + "Epoch 134 .............. loss : 66.43093051592795 ....val_loss : 68.7976721706445\n", + "Epoch 135 .............. loss : 66.07093888392023 ....val_loss : 68.5873023648592\n", + "Epoch 136 .............. loss : 65.72812386299735 ....val_loss : 68.39054231508227\n", + "Epoch 137 .............. loss : 65.40097235559912 ....val_loss : 68.20657684044058\n", + "Epoch 138 .............. loss : 65.08983569785043 ....val_loss : 67.94228420659768\n", + "Epoch 139 .............. loss : 64.79245648390162 ....val_loss : 67.78258406230702\n", + "Epoch 140 .............. loss : 64.49873642063372 ....val_loss : 67.63420173962793\n", + "Epoch 141 .............. loss : 64.22406863427958 ....val_loss : 67.49539498258784\n", + "Epoch 142 .............. loss : 63.964881873292526 ....val_loss : 67.36687519282887\n", + "Epoch 143 .............. loss : 63.70396249789373 ....val_loss : 67.24865382142737\n", + "Epoch 144 .............. loss : 63.46518846859955 ....val_loss : 67.13775495703534\n", + "Epoch 145 .............. loss : 63.241147135018565 ....val_loss : 67.03714451920355\n", + "Epoch 146 .............. loss : 63.0285726713775 ....val_loss : 66.94534610082604\n", + "Epoch 147 .............. loss : 62.82634790742648 ....val_loss : 66.85987599848048\n", + "Epoch 148 .............. loss : 62.628279647448394 ....val_loss : 66.7777226217446\n", + "Epoch 149 .............. loss : 62.44443820850438 ....val_loss : 66.70670335306032\n", + "Epoch 150 .............. loss : 62.280320521603 ....val_loss : 66.6442050068155\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "plot_learning_curve(h)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 492 + }, + "id": "1d-N2yqLBX1z", + "outputId": "7ecd17be-19fb-45a8-d8e6-ee5b812af112" + }, + "execution_count": 68, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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Krp37w7AF198QWxsLLt37+bDDz/ktddeq9QCRURESuj+CAARu2bRKfgo6bkF/LZFdy/VRRUKMllZWQQHBwPw008/MWTIEKxWKxdffDG7d++u1AJFRERKiG8HLfphMZw8HvIjAN/r7qU6qUJBplmzZnz99dfs3buX2bNn07t3bwCSk5N1e7SIiFSPy1xXZdofm019y2F1L9VRFQoyTz75JI888giNGjWic+fOdO3aFXBdnenQoUOlFigiIlKq+p2gyRVYjQLG+H+v7qU6qkJB5rrrrmPPnj2sWLGC2bNnu7f37NmTV155pdKKExEROaPLxgEwyPiZWI4xa90BkwuS6laheWQA4uLiiIuLcz8Fu379+poMT0REqlejbtDgEux7FjHK/h0vbYwmO68Qf1+b2ZVJNanQFRmn08m//vUvQkNDadiwIQ0bNiQsLIxnn30Wp9NZ2TWKiIicXg/XVZlh9nn45x1j7p+HTC5IqlOFrsg8/vjjvPfeezz//PN069YNgIULF/L000+Tk5PDc889V6lFioiInFaTK6BeR/z2r+Qu+/fMXNuCAe0TzK5KqonFMAyjvB9KSEjgrbfecj/1utg333zDvffey/79+yutwHOVlpZGaGgoqampuqNKRKS22jIbPrmBLMPBlQWvMvvx6wkN8DG7KjkHZf37XaGupWPHjtGyZcsS21u2bMmxY8cqckoREZGKa94b6nUkwJLLnZZv+fEPzSlTV1QoyLRv35433nijxPY33niDdu3anXNRIiIi5WKxwBX/AOA22xwWrFxvckFSXSo0RuaFF16gf//+zJ071z2HzOLFi9m7dy/ff/99pRYoIiJSJk17kht/EX4Hl9N53xSS03oSE+JndlVSxSp0RaZHjx5s2bKFwYMHk5KSQkpKCkOGDOGPP/7go48+quwaRUREzs5iwXHVEwDcbJvHz8tWm1yQVIcKDfY9nbVr13LhhRdSWFhzpojWYF8Rkbrl4P/1JP74Cn7wu5p+j35qdjlSQVU62FdERKSm8u/9JAA9s2ezb+cmk6uRqqYgIyIitUrY+T1Y77gQX0shqT/+x+xypIopyIiISK2T3OlhAFoe+hbj6HaTq5GqVK67loYMGXLG/SkpKedSi4iISKW4qHsffvmtA5dbV5Py438IG/ae2SVJFSlXkAkNDT3r/ttvv/2cChIRETlXIX4+LEoc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IC0tjdDQUFJTUwkJCTG7HBERkVpl++EMmkYHVfp5y/r3W1dkREREpMKqIsSUh4KMiIiIeC0FGREREfFaCjIiIiLitRRkRERExGspyIiIiIjXUpARERERr6UgIyIiIl5LQUZERES8loKMiIiIeC0FGREREfFaCjIiIiLitRRkRERExGspyIiIiIjXsptdQFUzDANwPQ5cREREvEPx3+3iv+OnU+uDTHp6OgCJiYkmVyIiIiLllZ6eTmho6Gn3W4yzRR0v53Q6OXDgAMHBwVgslko7b1paGomJiezdu5eQkJBKO29NVtfaXNfaC2pzXWhzXWsv1L0215b2GoZBeno6CQkJWK2nHwlT66/IWK1W6tevX2XnDwkJ8er/oVREXWtzXWsvqM11QV1rL9S9NteG9p7pSkwxDfYVERERr6UgIyIiIl5LQaaCHA4HTz31FA6Hw+xSqk1da3Nday+ozXVBXWsv1L0217X21vrBviIiIlJ76YqMiIiIeC0FGREREfFaCjIiIiLitRRkRERExGspyFTQ//73Pxo1aoSfnx9dunRh2bJlZpdUKcaPH89FF11EcHAwMTExDBo0iM2bN3sck5OTw+jRo4mMjCQoKIihQ4dy6NAhkyquXM8//zwWi4UxY8a4t9XG9u7fv59bb72VyMhI/P39adu2LStWrHDvNwyDJ598kvj4ePz9/enVqxdbt241seJzU1hYyBNPPEHjxo3x9/enadOmPPvssx7PcPHmNv/6668MGDCAhIQELBYLX3/9tcf+srTt2LFjDBs2jJCQEMLCwrjzzjvJyMioxlaUz5nanJ+fz9///nfatm1LYGAgCQkJ3H777Rw4cMDjHN7U5rP9G5/s7rvvxmKx8Oqrr3ps96b2loeCTAV8/vnnPPTQQzz11FOsWrWK9u3b06dPH5KTk80u7ZwtWLCA0aNHs2TJEubMmUN+fj69e/cmMzPTfczYsWP59ttvmT59OgsWLODAgQMMGTLExKorx/Lly3n77bdp166dx/ba1t7jx4/TrVs3fHx8+OGHH9i4cSMvvfQS4eHh7mNeeOEFXnvtNd566y2WLl1KYGAgffr0IScnx8TKK27ChAlMnDiRN954gz///JMJEybwwgsv8Prrr7uP8eY2Z2Zm0r59e/73v/+Vur8sbRs2bBh//PEHc+bMYdasWfz666+MGjWquppQbmdqc1ZWFqtWreKJJ55g1apVzJgxg82bNzNw4ECP47ypzWf7Ny721VdfsWTJEhISEkrs86b2losh5da5c2dj9OjR7veFhYVGQkKCMX78eBOrqhrJyckGYCxYsMAwDMNISUkxfHx8jOnTp7uP+fPPPw3AWLx4sVllnrP09HSjefPmxpw5c4wePXoYDz74oGEYtbO9f//7341LL730tPudTqcRFxdn/Pe//3VvS0lJMRwOh/Hpp59WR4mVrn///sbIkSM9tg0ZMsQYNmyYYRi1q82A8dVXX7nfl6VtGzduNABj+fLl7mN++OEHw2KxGPv376+22ivq1DaXZtmyZQZg7N692zAM727z6dq7b98+o169esaGDRuMhg0bGq+88op7nze392x0Raac8vLyWLlyJb169XJvs1qt9OrVi8WLF5tYWdVITU0FICIiAoCVK1eSn5/v0f6WLVvSoEEDr27/6NGj6d+/v0e7oHa2d+bMmXTq1Inrr7+emJgYOnTowDvvvOPev3PnTpKSkjzaHBoaSpcuXby2zZdccgnz5s1jy5YtAKxdu5aFCxfSr18/oHa2uVhZ2rZ48WLCwsLo1KmT+5hevXphtVpZunRptddcFVJTU7FYLISFhQG1r81Op5PbbruNcePG0bp16xL7a1t7T1brHxpZ2Y4cOUJhYSGxsbEe22NjY9m0aZNJVVUNp9PJmDFj6NatG23atAEgKSkJX19f9y+DYrGxsSQlJZlQ5bn77LPPWLVqFcuXLy+xrza2d8eOHUycOJGHHnqIf/zjHyxfvpwHHngAX19fhg8f7m5Xaf8b99Y2P/roo6SlpdGyZUtsNhuFhYU899xzDBs2DKBWtrlYWdqWlJRETEyMx3673U5ERITXtx9c49z+/ve/c/PNN7sfoljb2jxhwgTsdjsPPPBAqftrW3tPpiAjpzV69Gg2bNjAwoULzS6lyuzdu5cHH3yQOXPm4OfnZ3Y51cLpdNKpUyf+85//ANChQwc2bNjAW2+9xfDhw02urmpMmzaNjz/+mE8++YTWrVuzZs0axowZQ0JCQq1ts7jk5+dzww03YBgGEydONLucKrFy5Ur+7//+j1WrVmGxWMwup9qpa6mcoqKisNlsJe5aOXToEHFxcSZVVfnuu+8+Zs2axfz586lfv757e1xcHHl5eaSkpHgc763tX7lyJcnJyVx44YXY7XbsdjsLFizgtddew263ExsbW6vaCxAfH0+rVq08tp1//vns2bMHwN2u2vS/8XHjxvHoo49y00030bZtW2677TbGjh3L+PHjgdrZ5mJlaVtcXFyJmxUKCgo4duyYV7e/OMTs3r2bOXPmuK/GQO1q82+//UZycjINGjRw/x7bvXs3Dz/8MI0aNQJqV3tPpSBTTr6+vnTs2JF58+a5tzmdTubNm0fXrl1NrKxyGIbBfffdx1dffcXPP/9M48aNPfZ37NgRHx8fj/Zv3ryZPXv2eGX7e/bsyfr161mzZo176dSpE8OGDXOv16b2AnTr1q3ELfVbtmyhYcOGADRu3Ji4uDiPNqelpbF06VKvbXNWVhZWq+evO5vNhtPpBGpnm4uVpW1du3YlJSWFlStXuo/5+eefcTqddOnSpdprrgzFIWbr1q3MnTuXyMhIj/21qc233XYb69at8/g9lpCQwLhx45g9ezZQu9pbgtmjjb3RZ599ZjgcDuODDz4wNm7caIwaNcoICwszkpKSzC7tnN1zzz1GaGio8csvvxgHDx50L1lZWe5j7r77bqNBgwbGzz//bKxYscLo2rWr0bVrVxOrrlwn37VkGLWvvcuWLTPsdrvx3HPPGVu3bjU+/vhjIyAgwJg6dar7mOeff94ICwszvvnmG2PdunXGtddeazRu3NjIzs42sfKKGz58uFGvXj1j1qxZxs6dO40ZM2YYUVFRxt/+9jf3Md7c5vT0dGP16tXG6tWrDcB4+eWXjdWrV7vv0ClL2/r27Wt06NDBWLp0qbFw4UKjefPmxs0332xWk87qTG3Oy8szBg4caNSvX99Ys2aNx++y3Nxc9zm8qc1n+zc+1al3LRmGd7W3PBRkKuj11183GjRoYPj6+hqdO3c2lixZYnZJlQIodZk8ebL7mOzsbOPee+81wsPDjYCAAGPw4MHGwYMHzSu6kp0aZGpje7/99lujTZs2hsPhMFq2bGlMmjTJY7/T6TSeeOIJIzY21nA4HEbPnj2NzZs3m1TtuUtLSzMefPBBo0GDBoafn5/RpEkT4/HHH/f4o+bNbZ4/f36p/78dPny4YRhla9vRo0eNm2++2QgKCjJCQkKMO+64w0hPTzehNWVzpjbv3LnztL/L5s+f7z6HN7X5bP/GpyotyHhTe8vDYhgnTW0pIiIi4kU0RkZERES8loKMiIiIeC0FGREREfFaCjIiIiLitRRkRERExGspyIiIiIjXUpARERERr6UgIyK1nsVi4euvvza7DBGpAgoyIlKlRowYgcViKbH07dvX7NJEpBawm12AiNR+ffv2ZfLkyR7bHA6HSdWISG2iKzIiUuUcDgdxcXEeS3h4OODq9pk4cSL9+vXD39+fJk2a8MUXX3h8fv369Vx55ZX4+/sTGRnJqFGjyMjI8Djm/fffp3Xr1jgcDuLj47nvvvs89h85coTBgwcTEBBA8+bNmTlzpnvf8ePHGTZsGNHR0fj7+9O8efMSwUtEaiYFGREx3RNPPMHQoUNZu3Ytw4YN46abbuLPP/8EIDMzkz59+hAeHs7y5cuZPn06c+fO9QgqEydOZPTo0YwaNYr169czc+ZMmjVr5vEdzzzzDDfccAPr1q3j6quvZtiwYRw7dsz9/Rs3buSHH37gzz//ZOLEiURFRVXfD0BEKs7sp1aKSO02fPhww2azGYGBgR7Lc889ZxiG64nrd999t8dnunTpYtxzzz2GYRjGpEmTjPDwcCMjI8O9/7vvvjOsVquRlJRkGIZhJCQkGI8//vhpawCMf/7zn+73GRkZBmD88MMPhmEYxoABA4w77rijchosItVKY2REpMpdccUVTJw40WNbRESEe71r164e+7p27cqaNWsA+PPPP2nfvj2BgYHu/d26dcPpdLJ582YsFgsHDhygZ8+eZ6yhXbt27vXAwEBCQkJITk4G4J577mHo0KGsWrWK3r17M2jQIC655JIKtVVEqpeCjIhUucDAwBJdPZXF39+/TMf5+Ph4vLdYLDidTgD69evH7t27+f7775kzZw49e/Zk9OjRvPjii5Ver4hULo2RERHTLVmypMT7888/H4Dzzz+ftWvXkpmZ6d7/+++/Y7VaOe+88wgODqZRo0bMmzfvnGqIjo5m+PDhTJ06lVdffZVJkyad0/lEpHroioyIVLnc3FySkpI8ttntdveA2unTp9OpUycuvfRSPv74Y5YtW8Z7770HwLBhw3jqqacYPnw4Tz/9NIcPH+b+++/ntttuIzY2FoCnn36au+++m5iYGPr160d6ejq///47999/f5nqe/LJJ+nYsSOtW7cmNzeXWbNmuYOUiNRsCjIiUuV+/PFH4uPjPbadd955bNq0CXDdUfTZZ59x7733Eh8fz6effkqrVq0ACAgIYPbs2Tz44INcdNFFBAQEMHToUF5++WX3uYYPH05OTg6vvPIKjzzyCFFRUVx33XVlrs/X15fHHnuMXbt24e/vT/fu3fnss88qoeUiUtUshmEYZhchInWXxWLhq6++YtCgQWaXIiJeSGNkRERExGspyIiIiIjX0hgZETGVerdF5FzoioyIiIh4LQUZERER8VoKMiIiIuK1FGRERETEaynIiIiIiNdSkBERERGvpSAjIiIiXktBRkRERLyWgoyIiIh4rf8HUuR+uJ/En8AAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Comparaison Tensorflow" + ], + "metadata": { + "id": "7_qbWLax_NMb" + } + }, + { + "cell_type": "code", + "source": [ + "import tensorflow as tf\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Dense\n", + "from tensorflow.keras.optimizers import SGD\n", + "\n", + "model = Sequential([Dense(units=3, activation='sigmoid'),\n", + " Dense(units=5, activation='sigmoid'),\n", + " Dense(units=1)])\n", + "model.compile(optimizer=SGD(learning_rate=0.01), loss='mse')\n", + "history = model.fit(X, Y, epochs=10)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "id": "2OWmCKz3_MSb", + "outputId": "75265c47-eab8-46b8-a823-7ead743bc8d5" + }, + "execution_count": 371, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 589ms/step - loss: 0.7390\n", + "Epoch 2/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 54ms/step - loss: 0.7382\n", + "Epoch 3/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 56ms/step - loss: 0.7375\n", + "Epoch 4/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step - loss: 0.7368\n", + "Epoch 5/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 33ms/step - loss: 0.7361\n", + "Epoch 6/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step - loss: 0.7355\n", + "Epoch 7/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step - loss: 0.7350\n", + "Epoch 8/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 32ms/step - loss: 0.7344\n", + "Epoch 9/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 57ms/step - loss: 0.7339\n", + "Epoch 10/10\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 61ms/step - loss: 0.7335\n" + ] + } + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file