509 lines
82 KiB
Plaintext
Vendored
509 lines
82 KiB
Plaintext
Vendored
{
|
|
"cells": [
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"id": "6f71ca5c",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Tutorial: Introductory Tutorial: Physics Informed Neural Networks with PINA \n",
|
|
"[](https://colab.research.google.com/github/mathLab/PINA/blob/master/tutorials/tutorial1/tutorial.ipynb)\n",
|
|
"\n",
|
|
"> ##### ⚠️ ***Before starting:***\n",
|
|
"> We assume you are already familiar with the concepts covered in the [Getting started with PINA](https://mathlab.github.io/PINA/_tutorial.html#getting-started-with-pina) tutorials. If not, we strongly recommend reviewing them before exploring this advanced topic.\n"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"id": "ef4949c9",
|
|
"metadata": {},
|
|
"source": [
|
|
"In this tutorial, we will demonstrate a typical use case of **PINA** for Physics Informed Neural Network (PINN) training. We will cover the basics of training a PINN with PINA, if you want to go further into PINNs look at our dedicated [tutorials](https://mathlab.github.io/PINA/_tutorial.html#physics-informed-neural-networks) on the topic.\n",
|
|
"\n",
|
|
"Let's start by importing the useful modules:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "86478a84",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"## routine needed to run the notebook on Google Colab\n",
|
|
"try:\n",
|
|
" import google.colab\n",
|
|
"\n",
|
|
" IN_COLAB = True\n",
|
|
"except:\n",
|
|
" IN_COLAB = False\n",
|
|
"if IN_COLAB:\n",
|
|
" !pip install \"pina-mathlab[tutorial]\"\n",
|
|
"\n",
|
|
"import warnings\n",
|
|
"import torch\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"from pina import Trainer, Condition\n",
|
|
"from pina.problem import SpatialProblem\n",
|
|
"from pina.operator import grad\n",
|
|
"from pina.solver import PINN\n",
|
|
"from pina.model import FeedForward\n",
|
|
"from pina.optim import TorchOptimizer\n",
|
|
"from pina.domain import CartesianDomain\n",
|
|
"from pina.callback import MetricTracker\n",
|
|
"from pina.equation import Equation, FixedValue\n",
|
|
"\n",
|
|
"warnings.filterwarnings(\"ignore\")"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"id": "8a819659",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Build the problem\n",
|
|
"\n",
|
|
"We will use a simple Ordinary Differential Equation as pedagogical example:\n",
|
|
"\n",
|
|
"$$\n",
|
|
"\\begin{equation}\n",
|
|
"\\begin{cases}\n",
|
|
"\\frac{d}{dx}u(x) &= u(x) \\quad x\\in(0,1)\\\\\n",
|
|
"u(x=0) &= 1 \\\\\n",
|
|
"\\end{cases}\n",
|
|
"\\end{equation}\n",
|
|
"$$\n",
|
|
"\n",
|
|
"with the analytical solution $u(x) = e^x$. \n",
|
|
"\n",
|
|
"The PINA problem is easly written as:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "f2608e2e",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def ode_equation(input_, output_):\n",
|
|
" u_x = grad(output_, input_, components=[\"u\"], d=[\"x\"])\n",
|
|
" u = output_.extract([\"u\"])\n",
|
|
" return u_x - u\n",
|
|
"\n",
|
|
"\n",
|
|
"class SimpleODE(SpatialProblem):\n",
|
|
"\n",
|
|
" output_variables = [\"u\"]\n",
|
|
" spatial_domain = CartesianDomain({\"x\": [0, 1]})\n",
|
|
"\n",
|
|
" domains = {\n",
|
|
" \"x0\": CartesianDomain({\"x\": 0.0}),\n",
|
|
" \"D\": CartesianDomain({\"x\": [0, 1]}),\n",
|
|
" }\n",
|
|
"\n",
|
|
" conditions = {\n",
|
|
" \"bound_cond\": Condition(domain=\"x0\", equation=FixedValue(1.0)),\n",
|
|
" \"phys_cond\": Condition(domain=\"D\", equation=Equation(ode_equation)),\n",
|
|
" }\n",
|
|
"\n",
|
|
" def solution(self, pts):\n",
|
|
" return torch.exp(pts.extract([\"x\"]))\n",
|
|
"\n",
|
|
"\n",
|
|
"problem = SimpleODE()"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"id": "7cf64d01",
|
|
"metadata": {},
|
|
"source": [
|
|
"We are going to use latin hypercube points for sampling. We need to sample in all the conditions domains. In our case we sample in domain `D` and `x0`:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "622f705c",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# sampling for training\n",
|
|
"problem.discretise_domain(1, \"lh\", domains=[\"x0\"])\n",
|
|
"problem.discretise_domain(20, \"lh\", domains=[\"D\"])"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"id": "78b30f95",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Generate data \n",
|
|
"\n",
|
|
"Data for training can come in form of direct numerical simulation results, or points in the domains. In case we perform unsupervised learning, we just need the collocation points for training, i.e. points where we want to evaluate the neural network. Sampling point in **PINA** is very easy, here we show three examples using the `.discretise_domain` method of the `AbstractProblem` class."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "09ce5c3a",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# sampling 20 points in [0, 1] through discretization in all locations\n",
|
|
"problem.discretise_domain(n=20, mode=\"grid\", domains=\"all\")\n",
|
|
"\n",
|
|
"# sampling 20 points in (0, 1) through latin hypercube sampling in D, and 1 point in x0\n",
|
|
"problem.discretise_domain(n=20, mode=\"latin\", domains=[\"D\"])\n",
|
|
"problem.discretise_domain(n=1, mode=\"random\", domains=[\"x0\"])\n",
|
|
"\n",
|
|
"# sampling 20 points in (0, 1) randomly\n",
|
|
"problem.discretise_domain(n=20, mode=\"random\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "8fbb679f",
|
|
"metadata": {},
|
|
"source": [
|
|
"We are going to use latin hypercube points for sampling. We need to sample in all the conditions domains. In our case we sample in `D` and `x0`."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "329962b6",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# sampling for training\n",
|
|
"problem.discretise_domain(1, \"random\", domains=[\"x0\"])\n",
|
|
"problem.discretise_domain(20, \"lh\", domains=[\"D\"])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "669e8534",
|
|
"metadata": {},
|
|
"source": [
|
|
"To visualize the sampled points we can use `matplotlib.pyplot`:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "3802e22a",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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KoQbAABgFcINAACwCuEGAABYhXADAACsQrgBAABWIdwAAACrEG4AAIBVCDcAAMAqhBsAAGAVwg0AALAK4QYAAFglRIogx3HM19TU1EAXBQAAeMh133bdx3NTJMPNyZMnzdfo6OhAFwUAAFzGfbxMmTK5rg9yLhV/LJSRkSGHDx+W0qVLS1BQkNdTpYamAwcOSHh4uFePjf/hOvsP19p/uNb+w7UunNdaI4sGm6ioKAkOzr1nTZGsudELUrVqVZ+eQ7+B/ML4HtfZf7jW/sO19h+udeG71nnV2LjQoRgAAFiFcAMAAKxCuPGysLAwiYuLM1/hO1xn/+Fa+w/X2n+41nZf6yLZoRgAANiLmhsAAGAVwg0AALAK4QYAAFiFcAMAAKxCuMmnGTNmSI0aNaREiRISGxsrmzZtynP7RYsWSZ06dcz29evXl5UrV/qtrEXpWr/xxhtyyy23SLly5czUpk2bS35vcPk/1y4LFiwwT/nu0KGDz8tYVK/1iRMnpF+/flK5cmUz2uT666/n74iPrvWUKVPkhhtukJIlS5on6g4cOFDOnTvnt/IWVl9++aXce++95qnB+vdg6dKll9zn888/l5tuusn8TF933XUyd+5c7xZKR0vBMwsWLHBCQ0Odt99+2/n++++dxx9/3Clbtqxz5MiRHLdft26dU6xYMWfChAlOQkKCM2rUKKd48eLOzp07/V522691165dnRkzZjjbt293EhMTnV69ejllypRxDh486Pey236tXfbs2eNUqVLFueWWW5z27dv7rbxF6VqfP3/eadKkidOuXTvn66+/Ntf8888/d3bs2OH3stt+refNm+eEhYWZr3qdP/30U6dy5crOwIED/V72wmblypXOyJEjnSVLlujoa+fjjz/Oc/uff/7Zueqqq5xBgwaZe+O0adPMvTI+Pt5rZSLc5EOzZs2cfv36uecvXrzoREVFOePGjctx+wcffNC55557siyLjY11nnjiCZ+Xtahd6+zS09Od0qVLO++++64PS1l0r7Ve35YtWzpvvvmm07NnT8KNj671rFmznJo1azppaWl+LGXRvNa67e23355lmd58W7Vq5fOy2kQ8CDdDhgxxbrzxxizLOnfu7LRt29Zr5aBZykNpaWmydetW09yR+R1VOr9hw4Yc99HlmbdXbdu2zXV7XP61zu7MmTNy4cIFKV++vA9LWnSv9dixYyUyMlJ69+7tp5IWzWv9ySefSIsWLUyzVMWKFaVevXry8ssvy8WLF/1Y8qJxrVu2bGn2cTVd/fzzz6b5r127dn4rd1GxwQ/3xiL54szLcfz4cfMHRf/AZKbzP/zwQ477JCcn57i9Lod3r3V2Q4cONe2/2X+BcOXX+uuvv5a33npLduzY4adSFt1rrTfYNWvWSLdu3cyN9r///a/07dvXBHd94iu8d627du1q9rv55pvNm6fT09PlySeflBEjRvip1EVHci73Rn17+NmzZ02fpytFzQ2sM378eNPR9eOPPzYdCeE9J0+elB49epgO3BUqVAh0cayXkZFhasjmzJkjjRs3ls6dO8vIkSNl9uzZgS6adbSDq9aKzZw5U7Zt2yZLliyRFStWyAsvvBDoouEyUHPjIf1DXqxYMTly5EiW5TpfqVKlHPfR5fnZHpd/rV0mTpxows1nn30mDRo08HFJi961/umnn2Tv3r1mZETmG7AKCQmRpKQkqVWrlh9KXjR+rnWEVPHixc1+LjExMeb/fLXpJTQ01OflLirX+vnnnzfB/bHHHjPzOrr19OnT0qdPHxMotVkL3pHbvTE8PNwrtTaK75aH9I+I/p/T6tWrs/xR13ltE8+JLs+8vVq1alWu2+Pyr7WaMGGC+b+s+Ph4adKkiZ9KW7SutT7WYOfOnaZJyjXdd9998uc//9n8W4fPwns/161atTJNUa4AqX788UcTegg23r3W2k8ve4BxhUpewehdfrk3eq1rchEZWqhDBefOnWuGr/Xp08cMLUxOTjbre/To4QwbNizLUPCQkBBn4sSJZnhyXFwcQ8F9dK3Hjx9vhn0uXrzY+b//+z/3dPLkyQB+CjuvdXaMlvLdtd6/f78Z9de/f38nKSnJWb58uRMZGem8+OKLAfwUdl5r/fus1/qDDz4wQ5X/85//OLVq1TKjXpE3/Turj+HQSWPFa6+9Zv69b98+s16vs17v7EPBn3vuOXNv1Md4MBQ8wHQ8frVq1cyNVIcafvPNN+51rVu3Nn/oM/vwww+d66+/3myvQ99WrFgRgFLbf62rV69ufqmyT/oHC97/uc6McOPba71+/XrzCAm9Ueuw8JdeeskMxYd3r/WFCxecMWPGmEBTokQJJzo62unbt6/z22+/Baj0hcfatWtz/Pvrur76Va939n0aNWpkvjf6c/3OO+94tUxB+h/v1QMBAAAEFn1uAACAVQg3AADAKoQbAABgFcINAACwCuEGAABYhXADAACsQrgBAABWIdwAAACrEG4AAIBVCDcAAMAqhBsAAGAVwg0AABCb/D9XHfsZiRNToQAAAABJRU5ErkJggg==",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"for location in problem.input_pts:\n",
|
|
" coords = (\n",
|
|
" problem.input_pts[location].extract(problem.spatial_variables).flatten()\n",
|
|
" )\n",
|
|
" plt.scatter(coords, torch.zeros_like(coords), s=10, label=location)\n",
|
|
"_=plt.legend()"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"id": "22e502dd",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Easily solve a Physics Problem with three step pipeline"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"id": "075f43f5",
|
|
"metadata": {},
|
|
"source": [
|
|
"Once the problem is defined and the data is generated, we can move on to modeling. This process consists of three key steps:\n",
|
|
"\n",
|
|
"**Choosing a Model**\n",
|
|
"- Select a neural network architecture. You can use the model we provide in the `pina.model` module (see [here](https://mathlab.github.io/PINA/_rst/_code.html#models) for a full list), or define a custom PyTorch module (more on this [here](https://pytorch.org/docs/stable/notes/modules.html)).\n",
|
|
"\n",
|
|
"**Choosing a PINN Solver & Defining the Trainer**\n",
|
|
"* Use a Physics Informed solver from `pina.solver` module to solve the problem using the specified model. We have already implemented most State-Of-The-Arte solvers for you, [have a look](https://mathlab.github.io/PINA/_rst/_code.html#solvers) if interested. Today we will use the standard `PINN` solver.\n",
|
|
"\n",
|
|
"**Training**\n",
|
|
"* Train the model with the [`Trainer`](https://mathlab.github.io/PINA/_rst/trainer.html) class. The Trainer class provides powerful features to enhance model accuracy, optimize training time and memory, and simplify logging and visualization, thanks to PyTorch Lightning's excellent work, see [our dedicated tutorial](https://mathlab.github.io/PINA/tutorial11/tutorial.html) for further details. By default, training metrics (e.g., MSE error) are logged using a lightning logger (CSVLogger). If you prefer manual tracking, use `pina.callback.MetricTracker`.\n",
|
|
"\n",
|
|
"Let's cover all steps one by one!\n",
|
|
"\n",
|
|
"First we build the model, in this case a FeedForward neural network, with two layers of size 10 and hyperbolic tangent activation:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "3bb4dc9b",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# build the model\n",
|
|
"model = FeedForward(\n",
|
|
" layers=[10, 10],\n",
|
|
" func=torch.nn.Tanh,\n",
|
|
" output_dimensions=len(problem.output_variables),\n",
|
|
" input_dimensions=len(problem.input_variables),\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c3b92328",
|
|
"metadata": {},
|
|
"source": [
|
|
"Then we build the solver. The Physics-Informed Neural Network (`PINN`) solver class needs to be initialised with a `model` and a specific `problem` to be solved. They also take extra arguments, as the optimizer, scheduler, loss type and weighting for the different conditions which are all set to their defualt values.\n",
|
|
"\n",
|
|
">##### 💡***Bonus tip:***\n",
|
|
"> All physics solvers in PINA can handle both forward and inverse problems without requiring any changes to the model or solver structure! See [our tutorial](https://mathlab.github.io/PINA/tutorial7/tutorial.html) of inverse problems for more infos."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "f5127744",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# create the PINN object with RAdam Optimizer, notice that Optimizer need to\n",
|
|
"# be wrapped with the pina.optim.TorchOptimizer class\n",
|
|
"pinn = PINN(problem, model, TorchOptimizer(torch.optim.RAdam, lr=0.005))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c5d877cc",
|
|
"metadata": {},
|
|
"source": [
|
|
"Finally, we train the model using the Trainer API. The trainer offers various options to customize your training, refer to the official documentation for details. Here, we highlight the `MetricTracker` from `pina.callback`, which helps track metrics during training. In order to train just call the `.train()` method.\n",
|
|
"\n",
|
|
"> ##### ⚠️ ***Important Note:***\n",
|
|
"> In PINA you can log metrics in different ways. The simplest approach is to use the `MetricTraker` class from `pina.callbacks` as we will see today. However, expecially when we need to train multiple times to get an average of the loss across multiple runs, we suggest to use `lightning.pytorch.loggers` (see [here](https://lightning.ai/docs/pytorch/stable/extensions/logging.html) for reference).\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"id": "582a843e",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"GPU available: True (mps), used: False\n",
|
|
"TPU available: False, using: 0 TPU cores\n",
|
|
"HPU available: False, using: 0 HPUs\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "80c2ef11b8534949abcc7a01b36f1094",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"Training: | | 0/? [00:00<?, ?it/s]"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"`Trainer.fit` stopped: `max_epochs=1500` reached.\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# create the trainer\n",
|
|
"trainer = Trainer(\n",
|
|
" solver=pinn, # The PINN solver to be used for training\n",
|
|
" max_epochs=1500, # Maximum number of training epochs\n",
|
|
" logger=True, # Enables logging (default logger is CSVLogger)\n",
|
|
" callbacks=[MetricTracker()], # Tracks training metrics using MetricTracker\n",
|
|
" accelerator=\"cpu\", # Specifies the computing device (\"cpu\", \"gpu\", ...)\n",
|
|
" train_size=1.0, # Fraction of the dataset used for training (100%)\n",
|
|
" test_size=0.0, # Fraction of the dataset used for testing (0%)\n",
|
|
" val_size=0.0, # Fraction of the dataset used for validation (0%)\n",
|
|
" enable_model_summary=False, # Disables model summary printing\n",
|
|
")\n",
|
|
"\n",
|
|
"# train\n",
|
|
"trainer.train()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "f8b4f496",
|
|
"metadata": {},
|
|
"source": [
|
|
"After the training we can inspect trainer logged metrics (by default **PINA** logs mean square error residual loss). The logged metrics can be accessed online using one of the `Lightning` loggers. The final loss can be accessed by `trainer.logged_metrics`"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "f5fbf362",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{'bound_cond_loss': tensor(8.7332e-08),\n",
|
|
" 'phys_cond_loss': tensor(4.1401e-05),\n",
|
|
" 'train_loss': tensor(4.1489e-05)}"
|
|
]
|
|
},
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"# inspecting final loss\n",
|
|
"trainer.logged_metrics"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "0963d7d2",
|
|
"metadata": {},
|
|
"source": [
|
|
"By using `matplotlib` we can also do some qualitative plots of the solution. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"id": "ffbf0d5e",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"pts = pinn.problem.spatial_domain.sample(256, \"grid\", variables=\"x\")\n",
|
|
"predicted_output = pinn.forward(pts).extract(\"u\").tensor.detach()\n",
|
|
"true_output = pinn.problem.solution(pts).detach()\n",
|
|
"fig, ax = plt.subplots(nrows=1, ncols=1)\n",
|
|
"ax.plot(pts.extract([\"x\"]), predicted_output, label=\"Neural Network solution\")\n",
|
|
"ax.plot(pts.extract([\"x\"]), true_output, label=\"True solution\")\n",
|
|
"_=plt.legend()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "bf47b98a",
|
|
"metadata": {},
|
|
"source": [
|
|
"The solution is overlapped with the actual one, and they are barely indistinguishable. We can also visualize the loss during training using the `MetricTracker`:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "03398692",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# plot loss\n",
|
|
"trainer_metrics = trainer.callbacks[0].metrics\n",
|
|
"loss = trainer_metrics[\"train_loss\"]\n",
|
|
"epochs = range(len(loss))\n",
|
|
"plt.plot(epochs, loss.cpu())\n",
|
|
"# plotting\n",
|
|
"plt.xlabel(\"epoch\")\n",
|
|
"plt.ylabel(\"loss\")\n",
|
|
"plt.yscale(\"log\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "33e672da",
|
|
"metadata": {},
|
|
"source": [
|
|
"## What's Next?\n",
|
|
"\n",
|
|
"Congratulations on completing the introductory tutorial on Physics-Informed Training! Now that you have a solid foundation, here are several exciting directions you can explore:\n",
|
|
"\n",
|
|
"1. **Experiment with Training Duration & Network Architecture**: Try different training durations and tweak the network architecture to optimize performance.\n",
|
|
"\n",
|
|
"2. **Explore Other Models in `pina.model`**: Check out other models available in `pina.model` or design your own custom PyTorch module to suit your needs.\n",
|
|
"\n",
|
|
"3. **Run Training on a GPU**: Speed up your training by running on a GPU and compare the performance improvements.\n",
|
|
"\n",
|
|
"4. **Test Various Solvers**: Explore and evaluate different solvers to assess their performance on various types of problems.\n",
|
|
"\n",
|
|
"5. **... and many more!**: The possibilities are vast! Continue experimenting with advanced configurations, solvers, and other features in PINA.\n",
|
|
"\n",
|
|
"For more resources and tutorials, check out the [PINA Documentation](https://mathlab.github.io/PINA/)."
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "pina",
|
|
"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.9.21"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|