{ "cells": [ { "cell_type": "raw", "metadata": { "vscode": { "languageId": "raw" } }, "source": [ "\n", " \"Open\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Import/Export Network\n", "\n", "Listed here are all the modalitites by which you save or export (load or import) the nnodely model.\n", "There are four modalityies:\n", "1. Save/Load the model definition in a json file\n", "2. Save/Load network parameters in a pickle file\n", "3. Export/Import a standalone pytorch model\n", "4. Export the network to an ONNX format\n", "5. Make inference with a previously exported ONNX network" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.604021Z", "start_time": "2025-05-23T19:43:27.629794Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-- nnodely_v1.5.0 --<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n" ] } ], "source": [ "# uncomment the command below to install the nnodely package\n", "#!pip install nnodely\n", "\n", "from nnodely import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the following lines a network is created. When the nnodely object is created the workspace folder is defined. \n", "\n", "The workspace is used as folder to save or load all the models if no other folder is defined during a save/export operation." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.712045Z", "start_time": "2025-05-23T19:43:28.697995Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33m[check_names] The name 'x' is already in defined as NeuObj but it is overwritten.\u001b[0m\n", "\u001b[33m[check_names] The name 'y' is already in defined as NeuObj but it is overwritten.\u001b[0m\n", "\u001b[33m[check_names] The name 'z' is already in defined as NeuObj but it is overwritten.\u001b[0m\n", "\u001b[33m[check_names] The name 'k_x' is already in defined as NeuObj but it is overwritten.\u001b[0m\n", "\u001b[33m[check_names] The name 'c_v' is already in defined as NeuObj but it is overwritten.\u001b[0m\n", "\u001b[33m[check_names] The name 'out' is already in defined as NeuObj but it is overwritten.\u001b[0m\n" ] } ], "source": [ "x = Input('x')\n", "y = Input('y')\n", "z = Input('z')\n", "\n", "def myFun(K1,p1,p2):\n", " return K1*p1*p2\n", "\n", "K_x = Parameter('k_x', dimensions=1, tw=1)\n", "c_v = Constant('c_v', tw=1, values=[[1],[2]])\n", "parfun = ParamFun(myFun, parameters_and_constants = [K_x,c_v])\n", "\n", "out = Output('out', Fir(parfun(x.tw(1)))+Fir(parfun(y.tw(1)))+Fir(parfun(z.tw(1))))\n", "\n", "result_path = './results'\n", "model = Modely(workspace=result_path)\n", "model.addModel('model', out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Save/Load the model definition in a json file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If no 'name' or 'model_folder' is defined the file is saved in workspace folder with 'net' as name." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.725512Z", "start_time": "2025-05-23T19:43:28.722376Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m=============================== Save JSON Model ================================\u001b[0m\n", "\u001b[32mModel saved in: ./results\\net.json\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "model.saveModel()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.741292Z", "start_time": "2025-05-23T19:43:28.738212Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m=============================== Save JSON Model ================================\u001b[0m\n", "\u001b[32mModel saved in: ./results\\model_definition.json\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "model.saveModel(name='model_definition', model_folder=result_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Save/Load network parameters in a pickle file\n", "\n", "After the model neuralization is possible to save the parameters of the network in a pickle file" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.776015Z", "start_time": "2025-05-23T19:43:28.770726Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m================================ nnodely Model =================================\u001b[0m\n", "\u001b[32m{'Constants': {'c_v': {'dim': 1, 'tw': 1, 'values': [[1.0], [2.0]]}},\n", " 'Functions': {'FParamFun19': {'code': 'def myFun(K1,p1,p2):\\n'\n", " ' return K1*p1*p2\\n',\n", " 'in_dim': [{'dim': 1, 'tw': 1}],\n", " 'map_over_dim': False,\n", " 'n_input': 1,\n", " 'name': 'myFun',\n", " 'params_and_consts': ['k_x', 'c_v']}},\n", " 'Info': {'SampleTime': 0.5,\n", " 'nnodely_version': '1.5.0',\n", " 'ns': [2, 0],\n", " 'ntot': 2,\n", " 'num_parameters': 8},\n", " 'Inputs': {'x': {'dim': 1, 'ns': [2, 0], 'ntot': 2, 'tw': [-1, 0]},\n", " 'y': {'dim': 1, 'ns': [2, 0], 'ntot': 2, 'tw': [-1, 0]},\n", " 'z': {'dim': 1, 'ns': [2, 0], 'ntot': 2, 'tw': [-1, 0]}},\n", " 'Models': 'model',\n", " 'Outputs': {'out': 'Add27'},\n", " 'Parameters': {'PFir20W': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.10332220792770386],\n", " [0.6755136847496033]]},\n", " 'PFir22W': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.3977568745613098],\n", " [0.8827944397926331]]},\n", " 'PFir24W': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.7688933610916138],\n", " [0.8726053833961487]]},\n", " 'k_x': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.1419960856437683],\n", " [0.6352357268333435]]}},\n", " 'Relations': {'Add22': ['Add', ['Fir17', 'Fir21']],\n", " 'Add27': ['Add', ['Add22', 'Fir26']],\n", " 'Fir17': ['Fir', ['ParamFun16'], 'PFir20W', None, 0],\n", " 'Fir21': ['Fir', ['ParamFun20'], 'PFir22W', None, 0],\n", " 'Fir26': ['Fir', ['ParamFun25'], 'PFir24W', None, 0],\n", " 'ParamFun16': ['ParamFun', ['TimePart15'], 'FParamFun19'],\n", " 'ParamFun20': ['ParamFun', ['TimePart19'], 'FParamFun19'],\n", " 'ParamFun25': ['ParamFun', ['TimePart24'], 'FParamFun19'],\n", " 'TimePart15': ['TimePart', ['x'], -1, [-1, 0]],\n", " 'TimePart19': ['TimePart', ['y'], -1, [-1, 0]],\n", " 'TimePart24': ['TimePart', ['z'], -1, [-1, 0]]}}\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m=============================== Save Torch Model ===============================\u001b[0m\n", "\u001b[32mModel saved in: ./results\\model_parameters.pt\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "model.neuralizeModel(0.5)\n", "model.saveTorchModel(name='model_parameters', model_folder=result_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to load a pickle file the network parameters of the model must match." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.796262Z", "start_time": "2025-05-23T19:43:28.792376Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m=============================== Load Torch Model ===============================\u001b[0m\n", "\u001b[32mModel loaded from: ./results\\model_parameters.pt\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "model.loadTorchModel(name='model_parameters', model_folder=result_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Export/Import pytorch model\n", "\n", "Exports the neural network model as a stand-alone PyTorch Module class. With the pytorch model also the json model is saved." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.824311Z", "start_time": "2025-05-23T19:43:28.809597Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m=============================== Save JSON Model ================================\u001b[0m\n", "\u001b[32mModel saved in: ./results\\pytorch_model.json\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m========================== Export Python Torch Model ===========================\u001b[0m\n", "\u001b[32mModel exported in: ./results\\pytorch_model.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "model.exportPythonModel(name='pytorch_model', model_folder=result_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to import a python model also a json model in the same folder with the same name must be present.\n", "\n", "When the model is imported from a python model, this model has limited properties (for example cannot be exported as onnx)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.839461Z", "start_time": "2025-05-23T19:43:28.833851Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m=============================== Load JSON Model ================================\u001b[0m\n", "\u001b[32mModel loaded from: ./results\\pytorch_model.json\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m================================ nnodely Model =================================\u001b[0m\n", "\u001b[32m{'Constants': {'c_v': {'dim': 1, 'tw': 1, 'values': [[1.0], [2.0]]}},\n", " 'Functions': {'FParamFun19': {'code': 'def myFun(K1,p1,p2):\\n'\n", " ' return K1*p1*p2\\n',\n", " 'in_dim': [{'dim': 1, 'tw': 1}],\n", " 'map_over_dim': False,\n", " 'n_input': 1,\n", " 'name': 'myFun',\n", " 'params_and_consts': ['k_x', 'c_v']}},\n", " 'Info': {'SampleTime': 0.5,\n", " 'nnodely_version': '1.5.0',\n", " 'ns': [2, 0],\n", " 'ntot': 2,\n", " 'num_parameters': 8},\n", " 'Inputs': {'x': {'dim': 1, 'ns': [2, 0], 'ntot': 2, 'tw': [-1, 0]},\n", " 'y': {'dim': 1, 'ns': [2, 0], 'ntot': 2, 'tw': [-1, 0]},\n", " 'z': {'dim': 1, 'ns': [2, 0], 'ntot': 2, 'tw': [-1, 0]}},\n", " 'Models': 'model',\n", " 'Outputs': {'out': 'Add27'},\n", " 'Parameters': {'PFir20W': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.10332220792770386],\n", " [0.6755136847496033]]},\n", " 'PFir22W': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.3977568745613098],\n", " [0.8827944397926331]]},\n", " 'PFir24W': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.7688933610916138],\n", " [0.8726053833961487]]},\n", " 'k_x': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.1419960856437683],\n", " [0.6352357268333435]]}},\n", " 'Relations': {'Add22': ['Add', ['Fir17', 'Fir21']],\n", " 'Add27': ['Add', ['Add22', 'Fir26']],\n", " 'Fir17': ['Fir', ['ParamFun16'], 'PFir20W', None, 0],\n", " 'Fir21': ['Fir', ['ParamFun20'], 'PFir22W', None, 0],\n", " 'Fir26': ['Fir', ['ParamFun25'], 'PFir24W', None, 0],\n", " 'ParamFun16': ['ParamFun', ['TimePart15'], 'FParamFun19'],\n", " 'ParamFun20': ['ParamFun', ['TimePart19'], 'FParamFun19'],\n", " 'ParamFun25': ['ParamFun', ['TimePart24'], 'FParamFun19'],\n", " 'TimePart15': ['TimePart', ['x'], -1, [-1, 0]],\n", " 'TimePart19': ['TimePart', ['y'], -1, [-1, 0]],\n", " 'TimePart24': ['TimePart', ['z'], -1, [-1, 0]]}}\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m========================== Import Python Torch Model ===========================\u001b[0m\n", "\u001b[32mModel imported from: ./results\\pytorch_model.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "model.importPythonModel(name='pytorch_model', model_folder=result_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Export the network to an ONNX format\n", "\n", "A pythorch model imported can't be exported as onnx file. \n", "\n", "In order to export a onnx network the model must be created by neuralization." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.947222Z", "start_time": "2025-05-23T19:43:28.849291Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m================================ nnodely Model =================================\u001b[0m\n", "\u001b[32m{'Constants': {'c_v': {'dim': 1, 'tw': 1, 'values': [[1.0], [2.0]]}},\n", " 'Functions': {'FParamFun19': {'code': 'def myFun(K1,p1,p2):\\n'\n", " ' return K1*p1*p2\\n',\n", " 'in_dim': [{'dim': 1, 'tw': 1}],\n", " 'map_over_dim': False,\n", " 'n_input': 1,\n", " 'name': 'myFun',\n", " 'params_and_consts': ['k_x', 'c_v']}},\n", " 'Info': {'SampleTime': 0.5,\n", " 'nnodely_version': '1.5.0',\n", " 'ns': [2, 0],\n", " 'ntot': 2,\n", " 'num_parameters': 8},\n", " 'Inputs': {'x': {'dim': 1, 'ns': [2, 0], 'ntot': 2, 'tw': [-1, 0]},\n", " 'y': {'dim': 1, 'ns': [2, 0], 'ntot': 2, 'tw': [-1, 0]},\n", " 'z': {'dim': 1, 'ns': [2, 0], 'ntot': 2, 'tw': [-1, 0]}},\n", " 'Models': 'model',\n", " 'Outputs': {'out': 'Add27'},\n", " 'Parameters': {'PFir20W': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.10332220792770386],\n", " [0.6755136847496033]]},\n", " 'PFir22W': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.3977568745613098],\n", " [0.8827944397926331]]},\n", " 'PFir24W': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.7688933610916138],\n", " [0.8726053833961487]]},\n", " 'k_x': {'dim': 1,\n", " 'tw': 1,\n", " 'values': [[0.1419960856437683],\n", " [0.6352357268333435]]}},\n", " 'Relations': {'Add22': ['Add', ['Fir17', 'Fir21']],\n", " 'Add27': ['Add', ['Add22', 'Fir26']],\n", " 'Fir17': ['Fir', ['ParamFun16'], 'PFir20W', None, 0],\n", " 'Fir21': ['Fir', ['ParamFun20'], 'PFir22W', None, 0],\n", " 'Fir26': ['Fir', ['ParamFun25'], 'PFir24W', None, 0],\n", " 'ParamFun16': ['ParamFun', ['TimePart15'], 'FParamFun19'],\n", " 'ParamFun20': ['ParamFun', ['TimePart19'], 'FParamFun19'],\n", " 'ParamFun25': ['ParamFun', ['TimePart24'], 'FParamFun19'],\n", " 'TimePart15': ['TimePart', ['x'], -1, [-1, 0]],\n", " 'TimePart19': ['TimePart', ['y'], -1, [-1, 0]],\n", " 'TimePart24': ['TimePart', ['z'], -1, [-1, 0]]}}\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[34mThe inputs order for the export is not specified, the order will set equal to {'z', 'x', 'y'}.\u001b[0m\n", "\u001b[34mThe outputs order for the export is not specified, the order will set equal to {'out'}\u001b[0m\n", "\u001b[1;32m========================== Export Python Torch Model ===========================\u001b[0m\n", "\u001b[32mModel exported in: ./results\\model_onnx.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m======================== Export Python Onnx Torch Model ========================\u001b[0m\n", "\u001b[32mModel exported in: ./results\\model_onnx_onnx.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m============================== Export Onnx Model ===============================\u001b[0m\n", "\u001b[32mModel exported in: ./results\\model_onnx.onnx\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "model.neuralizeModel(0.5)\n", "model.exportONNX(name='model_onnx', model_folder=result_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also specify the input and output order inside the network" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:28.986162Z", "start_time": "2025-05-23T19:43:28.957665Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m========================== Export Python Torch Model ===========================\u001b[0m\n", "\u001b[32mModel exported in: ./results\\onnx\\net.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m======================== Export Python Onnx Torch Model ========================\u001b[0m\n", "\u001b[32mModel exported in: ./results\\onnx\\net_onnx.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m============================== Export Onnx Model ===============================\u001b[0m\n", "\u001b[32mModel exported in: ./results\\onnx\\net.onnx\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "model.exportONNX(inputs_order=['x','y','z'], outputs_order=['out'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ONNX inference\n", "\n", "You can use a previously exported onnx model to make inference. pass the inputs and the path to the model to run a prediction process.\n", "\n", "NOTE: All the states variables that are responsible for the recurrent loop must have an extra dimension (4 dimensions) at the beginning corresponding to the number of prediction samples." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:29.019378Z", "start_time": "2025-05-23T19:43:28.997755Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "model out : {'out': [0.5926666855812073]} | onnx out : [array([[[0.5926667]]], dtype=float32)]\n" ] } ], "source": [ "import numpy as np\n", "import os\n", "\n", "val = np.random.rand(1,2,1).astype(np.float32)\n", "\n", "data = {'x':val, 'y':val, 'z':val}\n", "output_onnx = Modely().onnxInference(data, name = 'net', model_folder = os.path.join(result_path, 'onnx'))\n", "output = model({'x':val.squeeze(-1).tolist()[0], 'y':val.squeeze(-1).tolist()[0], 'z':val.squeeze(-1).tolist()[0]})\n", "print(f'model out : {output} | onnx out : {output_onnx}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Export training and validation report\n", "\n", "Generates a PDF report with plots containing the results of the training and validation of the neural network." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:29.032901Z", "start_time": "2025-05-23T19:43:29.029120Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m======================== Export Training Results Report ========================\u001b[0m\n", "\u001b[32mReport exported in: ./results\\model_report.pdf\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "model.exportReport(name='model_report', model_folder=result_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example - Longitudinal dynamics of a vehicle (Non recurrent version export)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:29.360867Z", "start_time": "2025-05-23T19:43:29.047896Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m================================ nnodely Model =================================\u001b[0m\n", "\u001b[32m{'Constants': {'Constant9': {'dim': 1, 'values': [2.0]}},\n", " 'Functions': {'FFuzzify14': {'centers': [2.0, 3.0, 4.0, 5.0, 6.0, 7.0],\n", " 'dim_out': {'dim': 6},\n", " 'functions': 'Rectangular',\n", " 'names': 'Rectangular'}},\n", " 'Info': {'SampleTime': 0.05,\n", " 'nnodely_version': '1.5.0',\n", " 'ns': [25, 0],\n", " 'ntot': 25,\n", " 'num_parameters': 198},\n", " 'Inputs': {'acc': {'dim': 1, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]},\n", " 'alt': {'dim': 21, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]},\n", " 'brk': {'dim': 1, 'ns': [25, 0], 'ntot': 25, 'sw': [-25, 0]},\n", " 'gear': {'dim': 1, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]},\n", " 'trq': {'dim': 1, 'ns': [25, 0], 'ntot': 25, 'sw': [-25, 0]},\n", " 'vel': {'dim': 1, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]}},\n", " 'Minimizers': {'acc_error': {'A': 'SamplePart73',\n", " 'B': 'Add71',\n", " 'loss': 'rmse'}},\n", " 'Models': 'vehicle',\n", " 'Outputs': {'acc_hat': 'Add71'},\n", " 'Parameters': {'PFir10W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir16W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir18W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir20W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir22W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir24W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir26W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PLinear6W': {'dim': [1, 1], 'values': [[0.38101285696029663]]},\n", " 'PLinear6b': {'dim': 1, 'values': [0.6146950721740723]},\n", " 'gravity': {'dim': [21, 1],\n", " 'init_fun': {'name': 'init_constant',\n", " 'params': {'value': 0}},\n", " 'values': [[0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0]]}},\n", " 'Relations': {'Add64': ['Add', ['Mul48', 'Mul51']],\n", " 'Add65': ['Add', ['Add64', 'Mul54']],\n", " 'Add66': ['Add', ['Add65', 'Mul57']],\n", " 'Add67': ['Add', ['Add66', 'Mul60']],\n", " 'Add68': ['Add', ['Add67', 'Mul63']],\n", " 'Add69': ['Add', ['Linear32', 'Neg37']],\n", " 'Add70': ['Add', ['Add69', 'Linear40']],\n", " 'Add71': ['Add', ['Add70', 'Add68']],\n", " 'Fir35': ['Fir', ['SamplePart34'], 'PFir10W', None, 0],\n", " 'Fir46': ['Fir', ['SamplePart45'], 'PFir16W', None, 0],\n", " 'Fir49': ['Fir', ['SamplePart45'], 'PFir18W', None, 0],\n", " 'Fir52': ['Fir', ['SamplePart45'], 'PFir20W', None, 0],\n", " 'Fir55': ['Fir', ['SamplePart45'], 'PFir22W', None, 0],\n", " 'Fir58': ['Fir', ['SamplePart45'], 'PFir24W', None, 0],\n", " 'Fir61': ['Fir', ['SamplePart45'], 'PFir26W', None, 0],\n", " 'Fuzzify43': ['Fuzzify', ['SamplePart42'], 'FFuzzify14'],\n", " 'Linear32': ['Linear', ['Pow31'], 'PLinear6W', 'PLinear6b', 0],\n", " 'Linear40': ['Linear', ['SamplePart39'], 'gravity', None, 0.1],\n", " 'Mul48': ['Mul', ['Fir46', 'Select47']],\n", " 'Mul51': ['Mul', ['Fir49', 'Select50']],\n", " 'Mul54': ['Mul', ['Fir52', 'Select53']],\n", " 'Mul57': ['Mul', ['Fir55', 'Select56']],\n", " 'Mul60': ['Mul', ['Fir58', 'Select59']],\n", " 'Mul63': ['Mul', ['Fir61', 'Select62']],\n", " 'Neg37': ['Neg', ['Relu36']],\n", " 'Pow31': ['Pow', ['SamplePart29', 'Constant9']],\n", " 'Relu36': ['Relu', ['Fir35']],\n", " 'SamplePart29': ['SamplePart', ['vel'], -1, [-1, 0]],\n", " 'SamplePart34': ['SamplePart', ['brk'], -1, [-25, 0]],\n", " 'SamplePart39': ['SamplePart', ['alt'], -1, [-1, 0]],\n", " 'SamplePart42': ['SamplePart', ['gear'], -1, [-1, 0]],\n", " 'SamplePart45': ['SamplePart', ['trq'], -1, [-25, 0]],\n", " 'SamplePart73': ['SamplePart', ['acc'], -1, [-1, 0]],\n", " 'Select47': ['Select', ['Fuzzify43'], 6, 0],\n", " 'Select50': ['Select', ['Fuzzify43'], 6, 1],\n", " 'Select53': ['Select', ['Fuzzify43'], 6, 2],\n", " 'Select56': ['Select', ['Fuzzify43'], 6, 3],\n", " 'Select59': ['Select', ['Fuzzify43'], 6, 4],\n", " 'Select62': ['Select', ['Fuzzify43'], 6, 5]}}\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m========================== Export Python Torch Model ===========================\u001b[0m\n", "\u001b[32mModel exported in: results\\onnx\\net_vehicle.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m======================== Export Python Onnx Torch Model ========================\u001b[0m\n", "\u001b[32mModel exported in: results\\onnx\\net_vehicle_onnx.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m============================== Export Onnx Model ===============================\u001b[0m\n", "\u001b[32mModel exported in: results\\onnx\\net_vehicle.onnx\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "clearNames()\n", "vehicle = nnodely(visualizer=TextVisualizer(), seed=2, workspace='results')\n", "\n", "# Dimensions of the layers\n", "n = 25\n", "na = 21\n", "\n", "#Create neural model inputs\n", "velocity = Input('vel')\n", "brake = Input('brk')\n", "gear = Input('gear')\n", "torque = Input('trq')\n", "altitude = Input('alt',dimensions=na)\n", "acc = Input('acc')\n", "\n", "# Create neural network relations\n", "air_drag_force = Linear(b=True)(velocity.last()**2)\n", "breaking_force = -Relu(Fir(W_init = 'init_negexp', W_init_params={'size_index':0, 'first_value':0.002, 'lambda':3})(brake.sw(n)))\n", "gravity_force = Linear(W_init = 'init_constant', W_init_params={'value':0}, dropout=0.1, W='gravity')(altitude.last())\n", "fuzzi_gear = Fuzzify(6, range=[2,7], functions='Rectangular')(gear.last())\n", "local_model = LocalModel(input_function=lambda: Fir(W_init = 'init_negexp', W_init_params={'size_index':0, 'first_value':0.002, 'lambda':3}))\n", "engine_force = local_model(torque.sw(n), fuzzi_gear)\n", "\n", "# Create neural network output\n", "out = Output('acc_hat', air_drag_force+breaking_force+gravity_force+engine_force)\n", "\n", "# Add the neural model to the nnodely structure and neuralization of the model\n", "vehicle.addModel('vehicle',[out])\n", "vehicle.addMinimize('acc_error', acc.last(), out, loss_function='rmse')\n", "vehicle.neuralizeModel(0.05)\n", "\n", "## Export the Onnx Model\n", "vehicle.exportONNX(['vel','brk','gear','trq','alt'],['acc_hat'],models='vehicle')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example - Longitudinal dynamics of a vehicle (Recurrent version export)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:29.889816Z", "start_time": "2025-05-23T19:43:29.373459Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m================================ nnodely Model =================================\u001b[0m\n", "\u001b[32m{'Constants': {'Constant9': {'dim': 1, 'values': [2.0]},\n", " 'SampleTime': {'dim': 1, 'values': 0.05}},\n", " 'Functions': {'FFuzzify14': {'centers': [2.0, 3.0, 4.0, 5.0, 6.0, 7.0],\n", " 'dim_out': {'dim': 6},\n", " 'functions': 'Rectangular',\n", " 'names': 'Rectangular'}},\n", " 'Info': {'SampleTime': 0.05,\n", " 'nnodely_version': '1.5.0',\n", " 'ns': [25, 0],\n", " 'ntot': 25,\n", " 'num_parameters': 198},\n", " 'Inputs': {'acc': {'dim': 1, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]},\n", " 'alt': {'dim': 21, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]},\n", " 'brk': {'dim': 1, 'ns': [25, 0], 'ntot': 25, 'sw': [-25, 0]},\n", " 'gear': {'dim': 1, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]},\n", " 'trq': {'dim': 1, 'ns': [25, 0], 'ntot': 25, 'sw': [-25, 0]},\n", " 'vel': {'closedLoop': 'Add122',\n", " 'dim': 1,\n", " 'local': 1,\n", " 'ns': [1, 0],\n", " 'ntot': 1,\n", " 'sw': [-1, 0]},\n", " 'vel_init': {'closedLoop': 'Add122',\n", " 'dim': 1,\n", " 'local': 1,\n", " 'ns': [1, 0],\n", " 'ntot': 1,\n", " 'sw': [-1, 0]}},\n", " 'Minimizers': {'acc_error': {'A': 'SamplePart125',\n", " 'B': 'Add117',\n", " 'loss': 'rmse'}},\n", " 'Models': 'vehicle',\n", " 'Outputs': {'acc_hat': 'Add117', 'vel_hat': 'Add122'},\n", " 'Parameters': {'PFir10W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir16W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir18W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir20W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir22W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir24W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PFir26W': {'dim': 1,\n", " 'init_fun': {'name': 'init_negexp',\n", " 'params': {'first_value': 0.002,\n", " 'lambda': 3,\n", " 'size_index': 0}},\n", " 'sw': 25,\n", " 'values': [[9.957413567462936e-05],\n", " [0.00011283227649983019],\n", " [0.0001278557174373418],\n", " [0.00014487950829789042],\n", " [0.00016416999278590083],\n", " [0.00018602897762320936],\n", " [0.00021079844736959785],\n", " [0.00023886593407951295],\n", " [0.0002706705708988011],\n", " [0.0003067099314648658],\n", " [0.00034754787338897586],\n", " [0.0003938233421649784],\n", " [0.0004462603246793151],\n", " [0.0005056791706010699],\n", " [0.0005730096017941833],\n", " [0.0006493049440905452],\n", " [0.0007357588619925082],\n", " [0.0008337240433320403],\n", " [0.0009447330958209932],\n", " [0.0010705228196457028],\n", " [0.0012130612740293145],\n", " [0.001374578569084406],\n", " [0.0015576016157865524],\n", " [0.0017649937653914094],\n", " [0.0020000000949949026]]},\n", " 'PLinear6W': {'dim': [1, 1], 'values': [[0.38101285696029663]]},\n", " 'PLinear6b': {'dim': 1, 'values': [0.6146950721740723]},\n", " 'gravity': {'dim': [21, 1],\n", " 'init_fun': {'name': 'init_constant',\n", " 'params': {'value': 0}},\n", " 'values': [[0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0],\n", " [0.0]]}},\n", " 'Relations': {'Add110': ['Add', ['Mul94', 'Mul97']],\n", " 'Add111': ['Add', ['Add110', 'Mul100']],\n", " 'Add112': ['Add', ['Add111', 'Mul103']],\n", " 'Add113': ['Add', ['Add112', 'Mul106']],\n", " 'Add114': ['Add', ['Add113', 'Mul109']],\n", " 'Add115': ['Add', ['Linear78', 'Neg83']],\n", " 'Add116': ['Add', ['Add115', 'Linear86']],\n", " 'Add117': ['Add', ['Add116', 'Add114']],\n", " 'Add122': ['Add', ['SamplePart119', 'Mul121']],\n", " 'Fir101': ['Fir', ['SamplePart91'], 'PFir22W', None, 0],\n", " 'Fir104': ['Fir', ['SamplePart91'], 'PFir24W', None, 0],\n", " 'Fir107': ['Fir', ['SamplePart91'], 'PFir26W', None, 0],\n", " 'Fir81': ['Fir', ['SamplePart80'], 'PFir10W', None, 0],\n", " 'Fir92': ['Fir', ['SamplePart91'], 'PFir16W', None, 0],\n", " 'Fir95': ['Fir', ['SamplePart91'], 'PFir18W', None, 0],\n", " 'Fir98': ['Fir', ['SamplePart91'], 'PFir20W', None, 0],\n", " 'Fuzzify89': ['Fuzzify', ['SamplePart88'], 'FFuzzify14'],\n", " 'Linear78': ['Linear', ['Pow77'], 'PLinear6W', 'PLinear6b', 0],\n", " 'Linear86': ['Linear', ['SamplePart85'], 'gravity', None, 0.1],\n", " 'Mul100': ['Mul', ['Fir98', 'Select99']],\n", " 'Mul103': ['Mul', ['Fir101', 'Select102']],\n", " 'Mul106': ['Mul', ['Fir104', 'Select105']],\n", " 'Mul109': ['Mul', ['Fir107', 'Select108']],\n", " 'Mul121': ['Mul', ['Add117', 'SampleTime']],\n", " 'Mul94': ['Mul', ['Fir92', 'Select93']],\n", " 'Mul97': ['Mul', ['Fir95', 'Select96']],\n", " 'Neg83': ['Neg', ['Relu82']],\n", " 'Pow77': ['Pow', ['SamplePart75', 'Constant9']],\n", " 'Relu82': ['Relu', ['Fir81']],\n", " 'SamplePart119': ['SamplePart', ['vel_init'], -1, [-1, 0]],\n", " 'SamplePart125': ['SamplePart', ['acc'], -1, [-1, 0]],\n", " 'SamplePart75': ['SamplePart', ['vel'], -1, [-1, 0]],\n", " 'SamplePart80': ['SamplePart', ['brk'], -1, [-25, 0]],\n", " 'SamplePart85': ['SamplePart', ['alt'], -1, [-1, 0]],\n", " 'SamplePart88': ['SamplePart', ['gear'], -1, [-1, 0]],\n", " 'SamplePart91': ['SamplePart', ['trq'], -1, [-25, 0]],\n", " 'Select102': ['Select', ['Fuzzify89'], 6, 3],\n", " 'Select105': ['Select', ['Fuzzify89'], 6, 4],\n", " 'Select108': ['Select', ['Fuzzify89'], 6, 5],\n", " 'Select93': ['Select', ['Fuzzify89'], 6, 0],\n", " 'Select96': ['Select', ['Fuzzify89'], 6, 1],\n", " 'Select99': ['Select', ['Fuzzify89'], 6, 2]}}\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m========================== Export Python Torch Model ===========================\u001b[0m\n", "\u001b[32mModel exported in: c:\\Users\\User\\Desktop\\VSCodeProjects\\nnodely\\nnodely\\examples\\results\\onnx\\net_vehicle.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m======================== Export Python Onnx Torch Model ========================\u001b[0m\n", "\u001b[32mModel exported in: c:\\Users\\User\\Desktop\\VSCodeProjects\\nnodely\\nnodely\\examples\\results\\onnx\\net_vehicle_onnx.py\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m============================== Export Onnx Model ===============================\u001b[0m\n", "\u001b[32mModel exported in: c:\\Users\\User\\Desktop\\VSCodeProjects\\nnodely\\nnodely\\examples\\results\\onnx\\net_vehicle.onnx\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "clearNames()\n", "vehicle = nnodely(visualizer=MPLVisualizer(),seed=2, workspace=os.path.join(os.getcwd(), 'results'))\n", "# Dimensions of the layers\n", "n = 25\n", "na = 21\n", "\n", "#Create neural model inputs\n", "velocity = Input('vel')\n", "brake = Input('brk')\n", "gear = Input('gear')\n", "torque = Input('trq')\n", "altitude = Input('alt',dimensions=na)\n", "acc = Input('acc')\n", "\n", "# Create neural network relations\n", "air_drag_force = Linear(b=True)(velocity.last()**2)\n", "breaking_force = -Relu(Fir(W_init = 'init_negexp', W_init_params={'size_index':0, 'first_value':0.002, 'lambda':3})(brake.sw(n)))\n", "gravity_force = Linear(W_init = 'init_constant', W_init_params={'value':0}, dropout=0.1, W='gravity')(altitude.last())\n", "fuzzi_gear = Fuzzify(6, range=[2,7], functions='Rectangular')(gear.last())\n", "local_model = LocalModel(input_function=lambda: Fir(W_init = 'init_negexp', W_init_params={'size_index':0, 'first_value':0.002, 'lambda':3}))\n", "engine_force = local_model(torque.sw(n), fuzzi_gear)\n", "\n", "acc_hat = air_drag_force+breaking_force+gravity_force+engine_force\n", "vel_hat = acc_hat.s(-1,int_name='vel_init')\n", "\n", "# Closing the loop\n", "vel_hat.closedLoop(velocity)\n", "\n", "# Create neural network output\n", "out1 = Output('acc_hat', acc_hat)\n", "out2 = Output('vel_hat', vel_hat)\n", "\n", "# Add the neural model to the nnodely structure and neuralization of the model\n", "vehicle.addModel('vehicle',[out1,out2])\n", "vehicle.addMinimize('acc_error', acc.last(), out1, loss_function='rmse')\n", "vehicle.neuralizeModel(0.05)\n", "\n", "## Export the Onnx Model\n", "vehicle.exportONNX(['brk','gear','trq','alt','vel','vel_init'],['acc_hat','vel_hat'],models='vehicle')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2025-05-23T19:43:29.947128Z", "start_time": "2025-05-23T19:43:29.913889Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "model out : {'acc_hat': [0.617396891117096], 'vel_hat': [0.4668647348880768]} | onnx out : [array([[[[0.6173969]]]], dtype=float32), array([[[[0.46686473]]]], dtype=float32)]\n" ] } ], "source": [ "## Make inference using the onnx model\n", "data = {'vel_init':np.random.rand(1,1,1).astype(np.float32),'vel':np.random.rand(1,1,1).astype(np.float32), 'brk':np.random.rand(1,1,25,1).astype(np.float32), 'gear':np.random.rand(1,1,1,1).astype(np.float32), 'trq':np.random.rand(1,1,25,1).astype(np.float32), 'alt':np.random.rand(1,1,1,21).astype(np.float32)}\n", "output_onnx = Modely().onnxInference(data,'net_vehicle','results/onnx')\n", "\n", "output = vehicle({'vel_init':data['vel_init'].squeeze(-1).tolist()[0], 'vel':data['vel'].squeeze(-1).tolist()[0], 'brk':data['brk'].squeeze(-1).tolist()[0][0], 'gear':data['gear'].squeeze(-1).tolist()[0], 'trq':data['trq'].squeeze(-1).tolist()[0][0], 'alt':data['alt'].squeeze(1).tolist()[0]})\n", "print(f'model out : {output} | onnx out : {output_onnx}')" ] } ], "metadata": { "kernelspec": { "display_name": "venv (3.11.4)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" } }, "nbformat": 4, "nbformat_minor": 2 }