{ "cells": [ { "cell_type": "markdown", "id": "de19422d", "metadata": {}, "source": [ "# Tutorial: Two dimensional Poisson problem using Extra Features Learning\n", "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mathLab/PINA/blob/master/tutorials/tutorial2/tutorial.ipynb)\n", "\n", "This tutorial presents how to solve with Physics-Informed Neural Networks (PINNs) a 2D Poisson problem with Dirichlet boundary conditions. We will train with standard PINN's training, and with extrafeatures. For more insights on extrafeature learning please read [*An extended physics informed neural network for preliminary analysis of parametric optimal control problems*](https://www.sciencedirect.com/science/article/abs/pii/S0898122123002018).\n", "\n", "First of all, some useful imports." ] }, { "cell_type": "code", "execution_count": 4, "id": "ad0b8dd7", "metadata": {}, "outputs": [], "source": [ "## routine needed to run the notebook on Google Colab\n", "try:\n", " import google.colab\n", " IN_COLAB = True\n", "except:\n", " IN_COLAB = False\n", "if IN_COLAB:\n", " !pip install \"pina-mathlab\"\n", "\n", "import torch\n", "from torch.nn import Softplus\n", "import matplotlib.pyplot as plt\n", "import warnings\n", "\n", "from pina.problem import SpatialProblem\n", "from pina.operator import laplacian\n", "from pina.model import FeedForward\n", "from pina.solver import PINN\n", "from pina.trainer import Trainer\n", "from pina.domain import CartesianDomain\n", "from pina.equation import Equation, FixedValue\n", "from pina import Condition, LabelTensor\n", "from pina.callback import MetricTracker\n", "\n", "from lightning.pytorch.loggers import TensorBoardLogger\n", "\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "id": "492a37b4", "metadata": {}, "source": [ "## The problem definition" ] }, { "cell_type": "markdown", "id": "2c0b1777", "metadata": {}, "source": [ "The two-dimensional Poisson problem is mathematically written as:\n", "\\begin{equation}\n", "\\begin{cases}\n", "\\Delta u = \\sin{(\\pi x)} \\sin{(\\pi y)} \\text{ in } D, \\\\\n", "u = 0 \\text{ on } \\Gamma_1 \\cup \\Gamma_2 \\cup \\Gamma_3 \\cup \\Gamma_4,\n", "\\end{cases}\n", "\\end{equation}\n", "where $D$ is a square domain $[0,1]^2$, and $\\Gamma_i$, with $i=1,...,4$, are the boundaries of the square.\n", "\n", "The Poisson problem is written in **PINA** code as a class. The equations are written as *conditions* that should be satisfied in the corresponding domains. The *truth_solution*\n", "is the exact solution which will be compared with the predicted one." ] }, { "cell_type": "code", "execution_count": 5, "id": "82c24040", "metadata": {}, "outputs": [], "source": [ "class Poisson(SpatialProblem):\n", " output_variables = ['u']\n", " spatial_domain = CartesianDomain({'x': [0, 1], 'y': [0, 1]})\n", "\n", " def laplace_equation(input_, output_):\n", " force_term = (torch.sin(input_.extract(['x'])*torch.pi) *\n", " torch.sin(input_.extract(['y'])*torch.pi))\n", " laplacian_u = laplacian(output_, input_, components=['u'], d=['x', 'y'])\n", " return laplacian_u - force_term\n", "\n", " # here we write the problem conditions\n", " conditions = {\n", " 'bound_cond1': Condition(domain=CartesianDomain({'x': [0, 1], 'y': 1}), equation=FixedValue(0.)),\n", " 'bound_cond2': Condition(domain=CartesianDomain({'x': [0, 1], 'y': 0}), equation=FixedValue(0.)),\n", " 'bound_cond3': Condition(domain=CartesianDomain({'x': 1, 'y': [0, 1]}), equation=FixedValue(0.)),\n", " 'bound_cond4': Condition(domain=CartesianDomain({'x': 0, 'y': [0, 1]}), equation=FixedValue(0.)),\n", " 'phys_cond': Condition(domain=CartesianDomain({'x': [0, 1], 'y': [0, 1]}), equation=Equation(laplace_equation)),\n", " }\n", "\n", " def poisson_sol(self, pts):\n", " return -(\n", " torch.sin(pts.extract(['x'])*torch.pi)*\n", " torch.sin(pts.extract(['y'])*torch.pi)\n", " )/(2*torch.pi**2)\n", " \n", " truth_solution = poisson_sol\n", "\n", "problem = Poisson()\n", "\n", "# let's discretise the domain\n", "problem.discretise_domain(25, 'grid', domains=['phys_cond'])\n", "problem.discretise_domain(25, 'grid', domains=['bound_cond1', 'bound_cond2', 'bound_cond3', 'bound_cond4'])" ] }, { "cell_type": "markdown", "id": "7086c64d", "metadata": {}, "source": [ "## Solving the problem with standard PINNs" ] }, { "cell_type": "markdown", "id": "72ba4501", "metadata": {}, "source": [ "After the problem, the feed-forward neural network is defined, through the class `FeedForward`. This neural network takes as input the coordinates (in this case $x$ and $y$) and provides the unkwown field of the Poisson problem. The residual of the equations are evaluated at several sampling points (which the user can manipulate using the method `CartesianDomain_pts`) and the loss minimized by the neural network is the sum of the residuals.\n", "\n", "In this tutorial, the neural network is composed by two hidden layers of 10 neurons each, and it is trained for 1000 epochs with a learning rate of 0.006 and $l_2$ weight regularization set to $10^{-8}$. These parameters can be modified as desired. " ] }, { "cell_type": "code", "execution_count": 6, "id": "e7d20d6d", "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "GPU available: False, used: False\n", "TPU available: False, using: 0 TPU cores\n", "HPU available: False, using: 0 HPUs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 45.38it/s, v_num=0, bound_cond1_loss=0.000115, bound_cond2_loss=2.14e-5, bound_cond3_loss=0.000124, bound_cond4_loss=2.07e-5, phys_cond_loss=0.00174, train_loss=0.00202] " ] }, { "name": "stderr", "output_type": "stream", "text": [ "`Trainer.fit` stopped: `max_epochs=1000` reached.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 35.91it/s, v_num=0, bound_cond1_loss=0.000115, bound_cond2_loss=2.14e-5, bound_cond3_loss=0.000124, bound_cond4_loss=2.07e-5, phys_cond_loss=0.00174, train_loss=0.00202]\n" ] } ], "source": [ "# make model + solver + trainer\n", "from pina.optim import TorchOptimizer\n", "model = FeedForward(\n", " layers=[10, 10],\n", " func=Softplus,\n", " output_dimensions=len(problem.output_variables),\n", " input_dimensions=len(problem.input_variables)\n", ")\n", "pinn = PINN(problem, model, optimizer=TorchOptimizer(torch.optim.Adam, lr=0.006,weight_decay=1e-8))\n", "trainer = Trainer(pinn, max_epochs=1000, accelerator='cpu', enable_model_summary=False,\n", " train_size=1.0,\n", " val_size=0.0,\n", " test_size=0.0,\n", " logger=TensorBoardLogger(\"tutorial_logs\")\n", ") # we train on CPU and avoid model summary at beginning of training (optional)\n", "\n", "# train\n", "trainer.train()" ] }, { "cell_type": "markdown", "id": "eb83cc7a", "metadata": {}, "source": [ "Now we plot the results using `matplotlib`.\n", "The solution predicted by the neural network is plotted on the left, the exact one is represented at the center and on the right the error between the exact and the predicted solutions is showed. " ] }, { "cell_type": "code", "execution_count": 7, "id": "1ab83c03", "metadata": {}, "outputs": [], "source": [ "@torch.no_grad()\n", "def plot_solution(solver):\n", " # get the problem\n", " problem = solver.problem\n", " # get spatial points\n", " spatial_samples = problem.spatial_domain.sample(30, \"grid\")\n", " # compute pinn solution, true solution and absolute difference\n", " data = {\n", " \"PINN solution\": solver(spatial_samples),\n", " \"True solution\": problem.truth_solution(spatial_samples),\n", " \"Absolute Difference\": torch.abs(\n", " solver(spatial_samples) - problem.truth_solution(spatial_samples)\n", " )\n", " }\n", " # plot the solution\n", " for idx, (title, field) in enumerate(data.items()):\n", " plt.subplot(1, 3, idx + 1)\n", " plt.title(title)\n", " plt.tricontourf( # convert to torch tensor + flatten\n", " spatial_samples.extract(\"x\").tensor.flatten(),\n", " spatial_samples.extract(\"y\").tensor.flatten(),\n", " field.tensor.flatten(),\n", " )\n", " plt.colorbar(), plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": 8, "id": "7db10610", "metadata": {}, "outputs": [ { "data": { "image/png": "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yfn5+QYTlxv75d/Uc0bt62VmZurvqFsrMzOT5wsisqjt27fD29tbf7e7O+3atQtffvkl4uPjDcKO2oqYO/3666917mDdrVs3zJ8/H/Pnz8f58+cRFBSEFStW4LPPPjP4rrvz39cVFRW4ePFig9/5d3733smc795u3brhwIEDeOihh8z+IcUUtZOymzsipSHNPR/WHucWLVo065x6d5+AW4FcfWFcbRuNRmOx1yUyhkP8qI47A6c7y3gbsnjxYlRWVuKDDz4wqf2ff/5p8LeTkxN69uwJQRBQWVkJBwcHjBgxAl999ZXBrWxzcnKQkJCAQYMGQaPRNLgPx44dQ0VFhX7Z3r176wwLbNmyJYC6J0djRo0aherqaqxfv95g+apVq2BnZ4fHHnus0W0QESlJt27d6syXsXHjxjq/gI8fPx6pqan45ptv6mwjPz8fVVVV9b7G//73vzq/8tb+els7zK8538+1/+i+cz9KSkqwbdu2Om1btmxp0vmiX79+8Pb2Rnx8vMFQxH//+984d+4cRo8e3eg2iIhMcfPmTezatQuPP/44nnnmmTqP6OhoFBUVYc+ePQbr7d6922CuohMnTuD48eP678vS0lKUlZUZrNOtWze0atVK/70WFhYGJycnrF271uB7+pNPPkFBQUGD33WdO3eGg4NDnXPIhg0b6rSt79/r48ePR3V1Nd55550661RVVZn0fV2fhIQEfPzxxwgNDcWwYcOavJ27Ned8CADe3t549NFH8Y9//MPo9Cq5ublm92nEiBFo1aoVli1bVuc9r31fg4OD0a1bNyxfvlw/9LG5r0tkDCuoyKjaYXuZmZno1atXo+1rQy1j/6A3ZsSIEdBqtXjooYfg4+ODc+fOYf369Rg9erT+1+93330XycnJGDRoEP7yl7/A0dER//jHP1BeXt5oEDZ9+nR8/vnnGDlyJMaPH48LFy7gs88+M5i0vLbfnp6eiI+PR6tWrdCyZUuEhITUGe8NAGPGjMGQIUPwxhtv4NKlS+jbty++/fZbfPXVV3jllVfqbJuISOmmT5+Ol156CWPHjsXw4cPx008/4ZtvvkG7du0M2i1YsAB79uzB448/jmnTpiE4OBglJSX4+eef8fnnn+PSpUt11qm1bds2bNiwAU899RS6deuGoqIibNq0CRqNBqNGjQLQvO/nESNGoFOnToiKisKCBQvg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PuyiInItXsXPTryqHxERyc39uhMMI8gC3w9ERORKDPLIERhQtQFDKiIikiOGEgTwfUBE5EhyP7eSOwg4WeOQ++l8Vjjkfsh5eIhfG/F8VEREJEc87M89MZQiInIeHupH5BoMqNqBIRUREclVw8CCYZV6MZgiIiK5UMLV/EjeeIhfO/FwPyIikjueo0p9+JoSEbkWgxdpOeowP5I3dlA5ADupiIhICdhVpWwMpIiISO7k3kXV+azA5e4eUk+DmsGAykEYUhERkZIwrFIGhlJERPLBc1ERORcDKgcyHe7HoIqIiJSEYZW8MJQiIpIvhlTSCThZg4peWqmnQU7EgMoJGp6XimEVEREpibVwhKGVczGQIiJSFoZULVPCYX7l/JouSwyonIyH/hERkdI1DlAYWLUPAykiIiKiphhQuQAP/SMiIjVhYNU6hlBEROrGLqqWOauLiof5qRsDKhdiUEVERGrUWhij1gCLIRQRkXtjSKVcnc8JqadAVjCgkgAP+yMiIndia5AjpyCL4RMREVH7sIuK7MWASiINT6QOsKuKiIiIoRARESkNu6iIHMdT6gnQDbG6siahFRERERERERGRO2BAJTMMqoiIiIiIiJTDGYexqYWzussCTtY45X5JWjzET6Z4CCAREREREZEy8FA/ovZjQKUQDKyIiIiIiIhIaZx1snRSHx7ip1A8FJCIiIiIiEg+GMIQtQ87qBTOWkjF7ioiIiIiorap7KFF0DmpZ0FKxUP9XCfgZA0qemmlngY5EAMqFWqus4rBFRERERERkXMxpGqKh/mRLRhQuREGV0REREREravopeVVwogUgF1U6sKAihhcERERERERORC7qJpiFxW1hgEVNcuWk7AzxCIiIiIiNWIXFbUXQyoi+zCgonZpKcRieEVEREREREQmzuii4mF+6sGAipyGHVhEJAejOn+PHDFA6mkQEZECsYuK2otdVES2Y0BFkrIlxAIYZBERERGRNBhSUXsxpLLEc1FRcxhQkSKwG4uI2mOM/yF8XHm31NMgIiIiIifgYX7qwICKVKO1EIsBFhERERG1BbuoqL3YRUXUOgZU5DbYhUXk3thFRURERFJiSHUTT5ZO1jCgImqAVyUkIiIiImvYRUWOwJCKqHkMqIhsxPCKSPnYRUVERO3BkIrIcXiydGqMARWRA1gLrxhaERERERFRY+yich4e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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12, 6))\n", "plot_solution(solver=pinn)" ] }, { "cell_type": "markdown", "id": "20fdf23e", "metadata": {}, "source": [ "## Solving the problem with extra-features PINNs" ] }, { "cell_type": "markdown", "id": "a1e76351", "metadata": {}, "source": [ "Now, the same problem is solved in a different way.\n", "A new neural network is now defined, with an additional input variable, named extra-feature, which coincides with the forcing term in the Laplace equation. \n", "The set of input variables to the neural network is:\n", "\n", "\\begin{equation}\n", "[x, y, k(x, y)], \\text{ with } k(x, y)=\\sin{(\\pi x)}\\sin{(\\pi y)},\n", "\\end{equation}\n", "\n", "where $x$ and $y$ are the spatial coordinates and $k(x, y)$ is the added feature. \n", "\n", "This feature is initialized in the class `SinSin`, which needs to be inherited by the `torch.nn.Module` class and to have the `forward` method. After declaring such feature, we can just adjust the `FeedForward` class by creating a subclass `FeedForwardWithExtraFeatures` with an adjusted forward method and the additional attribute `extra_features`.\n", "\n", "Finally, we perform the same training as before: the problem is `Poisson`, the network is composed by the same number of neurons and optimizer parameters are equal to previous test, the only change is the new extra feature." ] }, { "cell_type": "code", "execution_count": 9, "id": "ef3ad372", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "GPU available: False, used: False\n", "TPU available: False, using: 0 TPU cores\n", "HPU available: False, using: 0 HPUs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 33.80it/s, v_num=1, bound_cond1_loss=6.31e-9, bound_cond2_loss=6.53e-9, bound_cond3_loss=4.6e-9, bound_cond4_loss=4.74e-9, phys_cond_loss=3.34e-6, train_loss=3.36e-6] " ] }, { "name": "stderr", "output_type": "stream", "text": [ "`Trainer.fit` stopped: `max_epochs=1000` reached.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 27.83it/s, v_num=1, bound_cond1_loss=6.31e-9, bound_cond2_loss=6.53e-9, bound_cond3_loss=4.6e-9, bound_cond4_loss=4.74e-9, phys_cond_loss=3.34e-6, train_loss=3.36e-6]\n" ] } ], "source": [ "class SinSin(torch.nn.Module):\n", " \"\"\"Feature: sin(x)*sin(y)\"\"\"\n", " def __init__(self):\n", " super().__init__()\n", "\n", " def forward(self, x):\n", " t = (torch.sin(x.extract(['x'])*torch.pi) *\n", " torch.sin(x.extract(['y'])*torch.pi))\n", " return LabelTensor(t, ['sin(x)sin(y)'])\n", "\n", "class FeedForwardWithExtraFeatures(FeedForward):\n", " def __init__(self, input_dimensions, output_dimensions, func, layers, extra_features):\n", "\n", " super().__init__(input_dimensions=input_dimensions, \n", " output_dimensions=output_dimensions, \n", " func=func, \n", " layers=layers) \n", " self.extra_features = extra_features\n", "\n", " def forward(self, x):\n", " \n", " extra_feature = self.extra_features[0](x)\n", " x = x.append(extra_feature)\n", " return super().forward(x)\n", " \n", "model_feat = FeedForwardWithExtraFeatures(\n", " input_dimensions=len(problem.input_variables) + 1, #we add one as also we consider the extra feature dimension\n", " output_dimensions=len(problem.output_variables),\n", " func=Softplus,\n", " layers=[10, 10],\n", " extra_features=[SinSin()])\n", "\n", "pinn_feat = PINN(problem, model_feat, optimizer=TorchOptimizer(torch.optim.Adam, lr=0.006,weight_decay=1e-8))\n", "trainer_feat = Trainer(pinn_feat, max_epochs=1000, accelerator='cpu', enable_model_summary=False,\n", " train_size=1.0,\n", " val_size=0.0,\n", " test_size=0.0,\n", " logger=TensorBoardLogger(\"tutorial_logs\")) # we train on CPU and avoid model summary at beginning of training (optional)\n", "\n", "trainer_feat.train()" ] }, { "cell_type": "markdown", "id": "9748a13e", "metadata": {}, "source": [ "The predicted and exact solutions and the error between them are represented below.\n", "We can easily note that now our network, having almost the same condition as before, is able to reach additional order of magnitudes in accuracy." ] }, { "cell_type": "code", "execution_count": 10, "id": "2be6b145", "metadata": {}, "outputs": [ { "data": { "image/png": "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99579corr/jVi+r555/XbbfdphtuuEG33367SkpK9N///lcbN27UjTfeKEnatm2b+vTpo/j4eN19992qV6+e/vKXv+jKK6/Uhx9+WOfx+Z07d9YDDzygmTNnasKECerTp48k6bLLLvNY3jAM/fKXv9QHH3ygsWPHqnv37nr33Xd111136dtvv9VTTz3lVv6jjz7SG2+8od///vdq3Lixnn76aQ0ZMkR5eXlefScAECo//PCDrrnmGg0bNkw33XSTEhMTfVr/p59+Ut++ffXtt9/q5ptvVrt27bRhwwZNnz5d3333XY2Tyx48eFADBgxQixYtNG3aNDVp0kR79+7VG2+84Srj6/nXH3PnztWtt96qRo0a6d5775WkGo/D4sWLNWbMGF166aWaM2eOCgoKNG/ePH388cfavHmz2533kydPKjMzU2lpaXr88cf1/vvv64knnlCnTp10yy231LnuAOxvyZIluv766xUTE6Phw4fr2Wef1aeffuq6mVrZK6+8oiNHjmjixIkqKSnRvHnzdPXVV+uLL75wnbeGDBmibdu26dZbb1VycrIOHjyo1atXKy8vz5WkmT17tu6//35lZGTolltu0c6dO13b/fjjj+s8muDmm2/WgQMHPA4tr3i/4lx62223ac+ePXrmmWe0efPmOm//N7/5jZ577jm999576t+/f5X3O3furL/+9a+aMmWK2rRpozvuuEOSdPHFF7vmourfv79GjhzpWsfXWPfSSy+ppKREEyZMUGxsrJo1a6Zt27bp8ssv19lnn61p06apYcOGeu2115SVlaV//OMf+tWvfuX2GbfeequaNm2qWbNmae/evZo7d64mTZqkV1991VVm8eLF+u1vf6suXbpo+vTpatKkiTZv3qzs7GxXu2rt2rW65pprlJqaqlmzZikyMlIvvfSSrr76av373/9Wz549/T7WQFAZsJ2XXnrJkGS8//77xqFDh4x9+/YZy5YtM8466yyjfv36xv79+w3DMIwPPvjAkGQsX768yrqffvqpsXv3biM6Otq47bbbXO/37dvX6NKli9v22rdvbwwaNMgwDMMYM2aMERcXZxw4cKDabXhy3XXXVfncM2VlZRkxMTHG7t27XcsOHDhgNG7c2Ljiiitcyyq2+cEHH7jVcdSoUVU+s2/fvkbfvn1d//70008NScZLL71UpeyoUaOM9u3bu/69YsUKQ5Lx0EMPuZW74YYbjIiICOOrr75yLZNkxMTEuC37z3/+Y0gy/vznP9e43wAQLBMnTjTODPV9+/Y1JBkLFy6sUl6SMWvWrCrLzzzHPvjgg0bDhg2NL7/80q3ctGnTjKioKCMvL6/aOv3zn/90xaHq+HL+PbNus2bNqrLPhnE6/u3Zs8e1rEuXLm4xosKZcaasrMxo2bKlceGFFxo///yzq9zKlSsNScbMmTNdy0aNGmVIMh544AG3z7z44ouN1NTUavcZQPj47LPPDEnG6tWrDcMwjPLycqNNmzbG7bff7lZuz549hiS363vDMIyNGzcakowpU6YYhmEYP/74oyHJeOyxx6rd5sGDB42YmBhjwIABxsmTJ13Ln3nmGUOSsWjRIteyM6+JPV17V65f5etqT3HHMAzj3//+tyHJWLJkidvy7Oxsj8vPVHFuP3TokMf3K47Br371q2r3wzDc2zWVSTImTpzotszbWFdxHOLj442DBw+6le3Xr5/RtWtXo6SkxLWsvLzcuOyyy4xzzz3XtawiRmVkZBjl5eWu5VOmTDGioqKMwsJCwzAMo7Cw0GjcuLGRlpbmFo8qPrfiv+eee66RmZnp9lk//fST0aFDB6N///5V9h+wCob42VhGRoZatGihtm3batiwYWrUqJH++c9/6uyzz/Zq/Y4dO7ruNnz33XderTNjxgydOHHC66GBFZo0aaL9+/fr008/9fj+yZMn9d577ykrK0sdO3Z0LW/VqpVuvPFGffTRRyouLvZpm3W1atUqRUVF6bbbbnNbfscdd8gwDP3rX/9yW56RkaFOnTq5/n3RRRcpPj5eX3/9dUjqCwDeio2N1ZgxY/xef/ny5erTp4+aNm2q77//3vXKyMjQyZMntX79+mrXrehptHLlSh0/ftxjGV/Pv8H22Wef6eDBg/r973/vNjfVoEGDlJKSonfeeafKOr/73e/c/t2nTx/iAQBJp3pPJSYm6qqrrpJ0ajjc0KFDtWzZMo9DgbOystyu73v27Km0tDStWrVKklS/fn3FxMRo3bp11Q6Xe//991VWVqbJkycrMvJ0E3D8+PGKj4/3eB4LpOXLlyshIUH9+/d3ixupqalq1KiRPvjggzp9fqNGjSRJR44cCUR1Jfke64YMGaIWLVq4/n348GGtXbtWv/71r3XkyBHX+j/88IMyMzO1a9euKsPEJ0yY4DbEsE+fPjp58qS++eYbSdLq1at15MgRTZs2rcpciRXrbdmyRbt27dKNN96oH374wbXdY8eOqV+/flq/fj0PhoJlkaCysfnz52v16tX64IMP9L///U9ff/21MjMzffoMXxNO/iS1JOkPf/iDGjVqpJ49e+rcc8/VxIkT3cZAHzp0SD/99JPOP//8Kut27txZ5eXl2rdvn9fbC4RvvvlGrVu3VuPGjavUp+L9ytq1a1flM5o2bVrncfUAEGhnn312nSZu3bVrl7Kzs9WiRQu3V0ZGhqRTw/iq07dvXw0ZMkT333+/mjdvruuuu67KI8J9Pf8GW8X2PMWolJSUKvWJi4tza6RIxAMAp5w8eVLLli3TVVddpT179uirr77SV199pbS0NBUUFGjNmjVV1jn33HOrLDvvvPNc80vFxsbqkUce0b/+9S8lJibqiiuu0KOPPqr8/HxX+erOYzExMerYsWPQz6u7du1SUVGRWrZsWSV2HD16tMa44Y2jR49KUpW4URe+xroOHTq4/furr76SYRi67777qnxGxYT4Z37Gme2Jpk2bSpIrflRM6XLhhRfWWG9JGjVqVJXtvvDCCyotLVVRUZFPxwIIFeagsrGePXu6nuLnr44dO+qmm27Sc889p2nTpnm1zr333qu//vWveuSRR5SVleXVOp07d9bOnTu1cuVKZWdn6x//+IcWLFigmTNn6v7776/DHpziaUJc6dRFQFRUVJ0/3xvVbceoZUJfAAi1+vXr+1T+zDv65eXl6t+/v+6++26P5c8777xqPysiIkKvv/66PvnkE7399tuuR4Q/8cQT+uSTT1x3wf1VUzwIlVDFHQD2s3btWn333XdatmyZli1bVuX9JUuWaMCAAT5/7uTJkzV48GCtWLFC7777ru677z7NmTNHa9eu1cUXX1ynOgfivFpeXq6WLVtWOxn8mUl9X1VMGn/OOefU6XMq8zXWnRlbK3op3XnnndV2IjizvoFoT1Rs97HHHlP37t09lqlrrAWChQQVNGPGDP3tb3/TI4884lX5Tp066aabbtJf/vIXnyYub9iwoYYOHaqhQ4eqrKxM119/vf74xz9q+vTpatGihRo0aKCdO3dWWW/Hjh2KjIxU27Ztq/3spk2benwCyTfffOM2ZLC6AOtJ+/bt9f777+vIkSNud2N27Njheh8AnMTTubSsrKxKj9lOnTrp6NGjrrvI/ujVq5d69eqlP/7xj1q6dKlGjBihZcuWady4cXU6/1bcbS4sLHSbuNxT7wBvY0LF9nbu3Ol6Ym6FnTt3Eg8AeG3JkiVq2bKl62l3lb3xxhv65z//qYULF7olOyp6xFT25ZdfVnn6dKdOnXTHHXfojjvu0K5du9S9e3c98cQT+tvf/uZ2Hqt8bVxWVqY9e/bUeD6vfF6tzJfzaqdOnfT+++/r8ssv9/kmiTcqJmX3dTRJTeoa6yqOc7169eoUL8+sk3QqIVddMq6iTHx8fMC2C4QKQ/zglnCq3BW4JjNmzNDx48f16KOPelX+hx9+cPt3TEyMLrjgAhmGoePHjysqKkoDBgzQm2++6fY43IKCAi1dulS9e/dWfHx8jfvwySefqKyszLVs5cqVVYYFNmzYUFLVAOvJtddeq5MnT+qZZ55xW/7UU08pIiJC11xzTa2fAQB20qlTpypzajz33HNV7pL/+te/Vk5Ojt59990qn1FYWKgTJ05Uu40ff/yxyp3giju8FcP86nL+rbgwr7wfx44d08svv1ylbMOGDb2KBz169FDLli21cOFCt6GI//rXv7R9+3YNGjSo1s8AgJ9//llvvPGGfvGLX+iGG26o8po0aZKOHDmit956y229FStWuM1VtGnTJm3cuNF1Lvzpp59UUlLitk6nTp3UuHFj1zkrIyNDMTExevrpp93OwS+++KKKiopqPI+1b99eUVFRVeLDggULqpSt7lr717/+tU6ePKkHH3ywyjonTpzw6lxcnaVLl+qFF15Qenq6+vXr5/fnnKkusU6SWrZsqSuvvFJ/+ctfPE6NcujQIZ/rNGDAADVu3Fhz5syp8p1XfK+pqanq1KmTHn/8cdfQx7puFwgVelBB0ulhezt37lSXLl1qLV+R1PJ0we/JgAEDlJSUpMsvv1yJiYnavn27nnnmGQ0aNMh1d/yhhx7S6tWr1bt3b/3+979XdHS0/vKXv6i0tLTWRNi4ceP0+uuva+DAgfr1r3+t3bt3629/+5vbpOUV9W7SpIkWLlyoxo0bq2HDhkpLS6syZlySBg8erKuuukr33nuv9u7dq27duum9997Tm2++qcmTJ1f5bACwu3Hjxul3v/udhgwZov79++s///mP3n33XTVv3tyt3F133aW33npLv/jFLzR69Gilpqbq2LFj+uKLL/T6669r7969Vdap8PLLL2vBggX61a9+pU6dOunIkSN6/vnnFR8fr2uvvVZS3c6/AwYMULt27TR27FjdddddioqK0qJFi9SiRQvl5eW5lU1NTdWzzz6rhx56SOecc45atmxZpYeUdOru9yOPPKIxY8aob9++Gj58uAoKCjRv3jwlJydrypQpvh5qAGHorbfe0pEjR/TLX/7S4/u9evVSixYttGTJEg0dOtS1/JxzzlHv3r11yy23qLS0VHPnztVZZ53lGnr25Zdfql+/fvr1r3+tCy64QNHR0frnP/+pgoICDRs2TNKpIXTTp0/X/fffr4EDB+qXv/yldu7cqQULFujSSy/VTTfdVG29ExIS9H//93/685//rIiICHXq1EkrV670OG9UamqqJOm2225TZmamoqKiNGzYMPXt21c333yz5syZoy1btmjAgAGqV6+edu3apeXLl2vevHm64YYbaj2Gr7/+uho1aqSysjJ9++23evfdd/Xxxx+rW7duWr58ea3r+6Iusa7C/Pnz1bt3b3Xt2lXjx49Xx44dVVBQoJycHO3fv1//+c9/fKpTfHy8nnrqKY0bN06XXnqpbrzxRjVt2lT/+c9/9NNPP+nll19WZGSkXnjhBV1zzTXq0qWLxowZo7PPPlvffvutPvjgA8XHx+vtt9+uy6EBgse05wfCbxWPIa3pEd2GcfqRsMuXL/dq3YpHY3fp0sVteXWPY921a5cRFRVVZRue/OUvfzGuuOIK46yzzjJiY2ONTp06GXfddZdRVFTkVu7zzz83MjMzjUaNGhkNGjQwrrrqKmPDhg0e9+vMR90+8cQTxtlnn23ExsYal19+ufHZZ58Zffv2rfII8TfffNO44IILjOjoaLdH43p6FO2RI0eMKVOmGK1btzbq1atnnHvuucZjjz3m9shWw/D8aFrDqPr4cwAIJU+P++7bt2+V83yFkydPGn/4wx+M5s2bGw0aNDAyMzONr776yuO57MiRI8b06dONc845x4iJiTGaN29uXHbZZcbjjz9ulJWVVVunzz//3Bg+fLjRrl07IzY21mjZsqXxi1/8wvjss8+qfL43519PdcvNzTXS0tKMmJgYo127dsaTTz7pin979uxxlcvPzzcGDRpkNG7c2JDkihfVxZlXX33VuPjii43Y2FijWbNmxogRI9we/W4Yp2JJw4YNq+x3xSPSAYSvwYMHG3FxccaxY8eqLTN69GijXr16xvfff2/s2bPHkGQ89thjxhNPPGG0bdvWiI2NNfr06WP85z//ca3z/fffGxMnTjRSUlKMhg0bGgkJCUZaWprx2muvVfn8Z555xkhJSTHq1atnJCYmGrfccovx448/upXxdE186NAhY8iQIUaDBg2Mpk2bGjfffLOxdetWt2tpwzCMEydOGLfeeqvRokULIyIiosp577nnnjNSU1ON+vXrG40bNza6du1q3H333caBAwdqPHYV59CKV1xcnNGmTRvjF7/4hbFo0SKjpKSkyjqe9qO6dk111/LexLrK35Mnu3fvNkaOHGkkJSUZ9erVM84++2zjF7/4hfH666+7ylTXRqsuHr311lvGZZddZtSvX9+Ij483evbsafz97393K7N582bj+uuvd7W/2rdvb/z617821qxZ47GegBVEGAYzOAMAAAAAAMA8zEEFAAAAAAAAU5GgAgAAAAAAgKlIUAEAAAAAAMBUPieo1q9fr8GDB6t169aKiIjQihUral1n3bp1uuSSSxQbG6tzzjlHixcv9qOqAGBt8+fPV3JysuLi4pSWlqZNmzbVWH758uVKSUlRXFycunbtqlWrVrm9bxiGZs6cqVatWql+/frKyMjQrl273Mp8+eWXuu6669S8eXPFx8erd+/e+uCDDwK+bzUhLgCAZ8QF4gIAVGZGXDh8+LBGjBih+Ph4NWnSRGPHjtXRo0dd769bt07XXXedWrVqpYYNG6p79+5asmRJUOpSG58TVMeOHVO3bt00f/58r8rv2bNHgwYN0lVXXaUtW7Zo8uTJGjdunN59911fNw0AlvXqq69q6tSpmjVrlj7//HN169ZNmZmZHh/BLEkbNmzQ8OHDNXbsWG3evFlZWVnKysrS1q1bXWUeffRRPf3001q4cKE2btyohg0bKjMzUyUlJa4yv/jFL3TixAmtXbtWubm56tatm37xi18oPz8/6PtcgbgAAFURF4gLAFCZWXFhxIgR2rZtm1avXq2VK1dq/fr1mjBhgtt2LrroIv3jH//Qf//7X40ZM0YjR47UypUrA16X2tTpKX4RERH65z//qaysrGrL/OEPf9A777zjVvFhw4apsLBQ2dnZHtcpLS1VaWmp69/l5eU6fPiwzjrrLEVERPhbXQAWYBiGjhw5otatWysy0vdRxiUlJSor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+fPnKzk5WXFxcUpLS9OmTZtqLL98+XKlpKQoLi5OXbt21apVq9zeNwxDM2fOVKtWrVS/fn1lZGRo165dbmVqizMlJSUaPXq0unbtqujoaGVlZVWpx7p16xQREVHllZ+fX6f9OxMJKosxK1ERzg2Qypx2HGiIWM+IESO0bds2rV69WitXrtT69es1YcKEGteZMmWK3n77bS1fvlwffvihDhw4oOuvv971/smTJzVo0CCVlZVpw4YNevnll7V48WLNnDnTVebjjz/WyJEjNXbsWG3btk3Lly/Xpk2bNH78+KDtKwLDzAS2086J/uAYVI/hsYFBXICTOT1ZZYV5qOyCXlTSq6++qqlTp2rWrFn6/PPP1a1bN2VmZurgwYMey2/YsEHDhw/X2LFjtXnzZmVlZSkrK0tbt251lXn00Uf19NNPa+HChdq4caMaNmyozMxMlZSUuMrUFmdOnjyp+vXr67bbblNGRkaN+7Bz50599913rlfLli393j9PSFD5yUkNfy6+3Zl1POhFZT3FxcVur9LSul1cbd++XdnZ2XrhhReUlpam3r17689//rOWLVumAwcOeFynqKhIL774op588kldffXVSk1N1UsvvaQNGzbok08+kSS99957+t///qe//e1v6t69u6655ho9+OCDmj9/vsrKyiRJOTk5Sk5O1m233aYOHTqod+/euvnmm32+q4HwQWw4jbiACsQFwH9OTlTBO05MUvkSF5588kmNHz9eY8aM0QUXXKCFCxeqQYMGWrRokcfy8+bN08CBA3XXXXepc+fOevDBB3XJJZfomWeekXSq99TcuXM1Y8YMXXfddbrooov0yiuv6MCBA1qxYoUk7+JMw4YN9eyzz2r8+PFKSkqqcX9btmyppKQk1ysy8nRKydf98yTa65IIOjMuRGmAeNZ4r6EjyRFmV8NSVuenqH/SDrOrIUn6oOA8RR8N3h2rE8dKJb2ntm3bui2fNWuWZs+e7ffn5uTkqEmTJurRo4drWUZGhiIjI7Vx40b96le/qrJObm6ujh8/7nY3IyUlRe3atVNOTo569eqlnJwcde3aVYmJia4ymZmZuuWWW7Rt2zZdfPHFSk9P1z333KNVq1bpmmuu0cGDB/X666/r2muv9Xt/4I4bF85GXLA24gJxAfZRkaSi91HglKW0sU3yJ2bH/pAMS1x/8BxFHwt2XJDX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OzIyUhkZGdWeu3Nycqr0aMrMzHSV37Nnj/Lz893KJCQkKC0tzVXGnzjjT1382T9Por0uCQBhxtMdkbrIz89Xy5Yt3ZZFR0erWbNmys/Pr3admJgYNWnSxG15YmJitets2LBBr776qt555x3Xsl27dmnatGn697//rehoTv0A4A/iAgCgMm/jwvfff6+TJ08qMTHRbXliYqJ27PDc8zg/P99j+YpzfcV/ayvja5zxpS7FxcX6+eef9eOPP/q8f57QgwoAqhEfH+/2qi7gTJs2TRERETW+fDkx18XWrVt13XXXadasWRowYICkU+PKb7zxRt1///0677zzQlIPAHAi4kL4cVJvGgCB521cgHe4XQIAdXTHHXdo9OjRNZbp2LGjkpKSqkwSeOLECR0+fFhJSUke10tKSlJZWZkKCwvd7pYXFBRUWed///uf+vXrpwkTJmjGjBmu5UeOHNFnn32mzZs3a9KkSZJOjQk3DEPR0dF67733dPXVV/uwxwCAmhAXAACVNW/eXFFRUW5PXJU8n7srJCUl1Vi+4r8FBQVq1aqVW5mKp7L6E2d8qUt8fLzq16+vqKgon/fPExJUAFBHLVq0UIsWtU+mnZ6ersLCQuXm5io1NVWStHbtWpWXlystLc3jOqmpqapXr57WrFmjIUOGSJJ27typvLw8paenu8pt27ZNV199tUaNGqU//vGPbp8RHx+vL774wm3ZggULtHbtWr3++uvq0KGDT/sLAKgZccEZ6D0FIFBiYmKUmpqqNWvWKCsrS9KpGwNr1qxx3Sg4U3p6utasWaPJkye7lq1evdp1ru/QoYOSkpK0Zs0aV0KquLhYGzdu1C233OL6DF/jTHV1WbVqlduyynXxZ/88IUEFACHSuXNnDRw4UOPHj9fChQt1/PhxTZo0ScOGDXM9QePbb79Vv3799Morr6hnz55KSEjQ2LFjNXXqVDVr1kzx8fG69dZblZ6e7npS09atW3X11VcrMzNTU6dOdY0nj4qKUosWLRQZGakLL7zQrS4tW7ZUXFxcleUAgNAhLlgXySk4RVGnWNs+zc9ppk6dqlGjRqlHjx7q2bOn5s6dq2PHjmnMmDGSpJEjR+rss892TbR+++23q2/fvnriiSc0aNAgLVu2TJ999pmee+45SVJERIQmT56shx56SOeee646dOig++67T61bt3YlibyJM9Kp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xRfVtWtX9ezZ0235sGHD9Mtf/lJdu3ZVVlaWVq5cqU8//VTr1q3z+rPpQeVBcptD2ru/hdnVgAWR6Asv8fHxio+Pr7XcHXfcodGjR9dYpmPHjkpKSqoyCeKJEyd0+PDhasdqJyUlqaysTIWFhW53ywsKCqqsk5SUpKSkJKWkpKhZs2bq06eP7rvvPrVq1cpVZtmyZRo3bpyWL19epcswgqO0XZli82JqLwhbIi6EF+ICYG88vQ+B5m1caN68uaKiotyeuCp5PndXSEpKqrF8xX8LCgrczusFBQXq3r27q0xtcaa67VTeRoVjx45p2bJleuCBB2rd544dO6p58+b66quv1K9fv1rLS/SgCrhAzPcQrLumXEQDwdGiRQulpKTU+IqJiVF6eroKCwuVm5vrWnft2rUqLy9XWlqax89OTU1VvXr1tGbNGteynTt3Ki8vT+np6dXWqby8XJLcxsH//e9/15gxY/T3v//d7ZGwsD7iAmAvxAUAQGUxMTFKTU11O3eXl5drzZo11Z6709PT3cpL0urVq13lO3TooKSkJLcyxcXF2rhxo6uMN3EmPT1d69ev1/Hjx922c/7551cZ3rd8+XKVlpbqpptuqnWf9+/frx9++MEteVYbelABQIh07txZAwcO1Pjx47Vw4UIdP35ckyZN0rBhw1xPavr222/Vr18/vfLKK+rZs6cSEhI0duxYTZ06Vc2aNVN8fLxuvfVWpaenq1evXpKkVatWqaCgQJdeeqkaNWqkbdu26a677tLll1+u5ORkSaeGb4waNUrz5s1TWlqaa8x5/fr1lZCQYMrxAIBwR1wAnI8J0lFh6tSpGjVqlHr06KGePXtq7ty5OnbsmOupfiNHjtTZZ5+tOXPmSJJuv/129e3bV0888YQGDRqkZcuW6bPPPtNzzz0nSYqIiNDkyZP10EMP6dxzz1WHDh103333qXXr1srKypLkXZy58cYbdf/992vs2LH6wx/+oK1bt2revHl66qmnquzDiy++qKysLJ111lluy48ePar7779fQ4YMUVJSknbv3q27775b55xzjjIzM70+RiSoAC/R0wCBsGTJEk2aNEn9+vVTZGSkhgwZoqefftr1/vHjx7Vz50799NNPrmVPPfWUq2xpaakyMzO1YMEC1/v169fX888/rylTpqi0tFRt27bV9ddf7/a42ueee04nTpzQ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DgMGDMCPP/5oCUoA+P777xEVFeX1sAFcG8Ply5frhYo5QEXEc511EzV9lkk9tJ4LgPazgbnAXFCK2j7LpA7MBeVzAdB+NjAX/qClXADU93kmD1LyCu1mWVlZotfrZePGjXLkyBGZOnWqhIeHi8lkEhGRiRMnyty5cy3t9+zZI8HBwbJs2TIpLCyUjIwMRX821tn+L168WHQ6nXzwwQdy9uxZy62srEyR/os4P4ZrKf2LHCLOj+HkyZPSunVrmTFjhhQVFcnWrVulffv2smjRIqWG4PQYMjIypHXr1vLuu+/K8ePH5bPPPpOuXbvKPffco0j/y8rKpKCgQAoKCgSALF++XAoKCuS///2viIjMnTtXJk6caGlv/snYJ554QgoLC2XlypX8yVgSEe3ngoj2s4G5wFxwB+YCuQtzQflcENF+NjAXlM8FEWYDNUwVBSoRkRUrVkhsbKzodDrp37+/7Nu3z3Lf4MGDZdKkSVbt33//fenevbvodDrp1auXfPLJJ17usTVn+t+pUycBUO+WkZHh/Y7X4ezfoC6lw8bM2THs3btXEhMTRa/XS5cuXeT555+X6upqL/famjNjqKqqkgULFkjXrl0lJCREYmJiZNq0afL77797v+Mi8sUXX9hct819njRpkgwePLjeY/r27Ss6nU66dOkiGzZs8Hq/SZ20ngsi2s8G5gJzoamYC+ROzAXlc0FE+9nAXFA2F0SYDdSwABGNHNdHREREREREREQ+SfFrUBERERERERERkX9jgYqIiIiIiIiIiBTFAhURERERERERESmKBSoiIiIiIiIiIlIUC1RERERERERERKQoFqiIiIiIiIiIiEhRLFAREREREREREZGiWKAiIiIiIiIiIiJFsUBFRERERERERESKYoGKiIiIiIiIiIgUxQIVEREREREREREp6v8DuL90bvXxXn8AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12, 6))\n", "plot_solution(solver=pinn_feat)" ] }, { "cell_type": "markdown", "id": "e7bc0577", "metadata": {}, "source": [ "## Solving the problem with learnable extra-features PINNs" ] }, { "cell_type": "markdown", "id": "86c1d7b0", "metadata": {}, "source": [ "We can still do better!\n", "\n", "Another way to exploit the extra features is the addition of learnable parameter inside them.\n", "In this way, the added parameters are learned during the training phase of the neural network. In this case, we use:\n", "\n", "\\begin{equation}\n", "k(x, \\mathbf{y}) = \\beta \\sin{(\\alpha x)} \\sin{(\\alpha y)},\n", "\\end{equation}\n", "\n", "where $\\alpha$ and $\\beta$ are the abovementioned parameters.\n", "Their implementation is quite trivial: by using the class `torch.nn.Parameter` we cam define all the learnable parameters we need, and they are managed by `autograd` module!" ] }, { "cell_type": "code", "execution_count": 11, "id": "ae8716e7", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "GPU available: False, used: False\n", "TPU available: False, using: 0 TPU cores\n", "HPU available: False, using: 0 HPUs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 33.16it/s, v_num=2, bound_cond1_loss=1.08e-7, bound_cond2_loss=1.88e-7, bound_cond3_loss=1.75e-7, bound_cond4_loss=1.64e-7, phys_cond_loss=1.2e-5, train_loss=1.26e-5] " ] }, { "name": "stderr", "output_type": "stream", "text": [ "`Trainer.fit` stopped: `max_epochs=1000` reached.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 27.80it/s, v_num=2, bound_cond1_loss=1.08e-7, bound_cond2_loss=1.88e-7, bound_cond3_loss=1.75e-7, bound_cond4_loss=1.64e-7, phys_cond_loss=1.2e-5, train_loss=1.26e-5]\n" ] } ], "source": [ "class SinSinAB(torch.nn.Module):\n", " \"\"\" \"\"\"\n", " def __init__(self):\n", " super().__init__()\n", " self.alpha = torch.nn.Parameter(torch.tensor([1.0]))\n", " self.beta = torch.nn.Parameter(torch.tensor([1.0]))\n", "\n", "\n", " def forward(self, x):\n", " t = (\n", " self.beta*torch.sin(self.alpha*x.extract(['x'])*torch.pi)*\n", " torch.sin(self.alpha*x.extract(['y'])*torch.pi)\n", " )\n", " return LabelTensor(t, ['b*sin(a*x)sin(a*y)'])\n", "\n", "\n", "# make model + solver + trainer\n", "model_learn = FeedForwardWithExtraFeatures(\n", " input_dimensions=len(problem.input_variables) + 1, #we add one as also we consider the extra feature dimension\n", " output_dimensions=len(problem.output_variables),\n", " func=Softplus,\n", " layers=[10, 10],\n", " extra_features=[SinSinAB()])\n", "\n", "pinn_learn = PINN(problem, model_learn, optimizer=TorchOptimizer(torch.optim.Adam, lr=0.006,weight_decay=1e-8))\n", "trainer_learn = Trainer(pinn_learn, max_epochs=1000, enable_model_summary=False,\n", " train_size=1.0,\n", " val_size=0.0,\n", " test_size=0.0,\n", " logger=TensorBoardLogger(\"tutorial_logs\")) # we train on CPU and avoid model summary at beginning of training (optional)\n", "\n", "# train\n", "trainer_learn.train()" ] }, { "cell_type": "markdown", "id": "0319fb3b", "metadata": {}, "source": [ "Umh, the final loss is not appreciabily better than previous model (with static extra features), despite the usage of learnable parameters. This is mainly due to the over-parametrization of the network: there are many parameter to optimize during the training, and the model in unable to understand automatically that only the parameters of the extra feature (and not the weights/bias of the FFN) should be tuned in order to fit our problem. A longer training can be helpful, but in this case the faster way to reach machine precision for solving the Poisson problem is removing all the hidden layers in the `FeedForward`, keeping only the $\\alpha$ and $\\beta$ parameters of the extra feature." ] }, { "cell_type": "code", "execution_count": 12, "id": "daa9cf17", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "GPU available: False, used: False\n", "TPU available: False, using: 0 TPU cores\n", "HPU available: False, using: 0 HPUs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 46.18it/s, v_num=3, bound_cond1_loss=1.06e-16, bound_cond2_loss=2.86e-16, bound_cond3_loss=1.44e-16, bound_cond4_loss=4e-16, phys_cond_loss=6.98e-16, train_loss=1.63e-15] " ] }, { "name": "stderr", "output_type": "stream", "text": [ "`Trainer.fit` stopped: `max_epochs=1000` reached.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 36.99it/s, v_num=3, bound_cond1_loss=1.06e-16, bound_cond2_loss=2.86e-16, bound_cond3_loss=1.44e-16, bound_cond4_loss=4e-16, phys_cond_loss=6.98e-16, train_loss=1.63e-15]\n" ] } ], "source": [ "# make model + solver + trainer\n", "model_learn= FeedForwardWithExtraFeatures(\n", " layers=[],\n", " func=Softplus,\n", " output_dimensions=len(problem.output_variables),\n", " input_dimensions=len(problem.input_variables)+1,\n", " extra_features=[SinSinAB()])\n", "pinn_learn = PINN(problem, model_learn, optimizer=TorchOptimizer(torch.optim.Adam, lr=0.006,weight_decay=1e-8))\n", "trainer_learn = Trainer(pinn_learn, max_epochs=1000, accelerator='cpu', enable_model_summary=False,\n", " train_size=1.0,\n", " val_size=0.0,\n", " test_size=0.0,\n", " logger=TensorBoardLogger(\"tutorial_logs\")) # we train on CPU and avoid model summary at beginning of training (optional)\n", "\n", "# train\n", "trainer_learn.train()" ] }, { "cell_type": "markdown", "id": "150b3e62", "metadata": {}, "source": [ "In such a way, the model is able to reach a very high accuracy!\n", "Of course, this is a toy problem for understanding the usage of extra features: similar precision could be obtained if the extra features are very similar to the true solution. The analyzed Poisson problem shows a forcing term very close to the solution, resulting in a perfect problem to address with such an approach.\n", "\n", "We conclude here by showing the graphical comparison of the unknown field and the loss trend for all the test cases presented here: the standard PINN, PINN with extra features, and PINN with learnable extra features." ] }, { "cell_type": "markdown", "id": "8c64fcb4", "metadata": {}, "source": [ "Let us compare the training losses for the various types of training" ] }, { "cell_type": "code", "execution_count": 13, "id": "2855cea1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Launching TensorBoard..." ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Load the TensorBoard extension\n", "%load_ext tensorboard\n", "%tensorboard --logdir 'tutorial_logs'" ] }, { "cell_type": "markdown", "id": "0a4c8895", "metadata": {}, "source": [ "## What's next?\n", "\n", "Congratulations on completing the two dimensional Poisson tutorial of **PINA**! There are multiple directions you can go now:\n", "\n", "1. Train the network for longer or with different layer sizes and assert the finaly accuracy\n", "\n", "2. Propose new types of extrafeatures and see how they affect the learning\n", "\n", "3. Exploit extrafeature training in more complex problems\n", "\n", "4. Many more..." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }