tutorial validation (#185)
Co-authored-by: Ben Volokh <89551265+benv123@users.noreply.github.com>
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
Tutorial 3: resolution of wave equation with hard constraint PINNs.
|
||||
===================================================================
|
||||
|
||||
The problem solution
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
The problem definition
|
||||
----------------------
|
||||
|
||||
In this tutorial we present how to solve the wave equation using hard
|
||||
constraint PINNs. For doing so we will build a costum torch model and
|
||||
@@ -10,13 +10,15 @@ pass it to the ``PINN`` solver.
|
||||
|
||||
The problem is written in the following form:
|
||||
|
||||
:raw-latex:`\begin{equation}
|
||||
\begin{cases}
|
||||
\Delta u(x,y,t) = \frac{\partial^2}{\partial t^2} u(x,y,t) \quad \text{in } D, \\\\
|
||||
u(x, y, t=0) = \sin(\pi x)\sin(\pi y), \\\\
|
||||
u(x, y, t) = 0 \quad \text{on } \Gamma_1 \cup \Gamma_2 \cup \Gamma_3 \cup \Gamma_4,
|
||||
\end{cases}
|
||||
\end{equation}`
|
||||
.. raw:: latex
|
||||
|
||||
\begin{equation}
|
||||
\begin{cases}
|
||||
\Delta u(x,y,t) = \frac{\partial^2}{\partial t^2} u(x,y,t) \quad \text{in } D, \\\\
|
||||
u(x, y, t=0) = \sin(\pi x)\sin(\pi y), \\\\
|
||||
u(x, y, t) = 0 \quad \text{on } \Gamma_1 \cup \Gamma_2 \cup \Gamma_3 \cup \Gamma_4,
|
||||
\end{cases}
|
||||
\end{equation}
|
||||
|
||||
where :math:`D` is a square domain :math:`[0,1]^2`, and
|
||||
:math:`\Gamma_i`, with :math:`i=1,...,4`, are the boundaries of the
|
||||
@@ -80,21 +82,24 @@ predicted one.
|
||||
|
||||
problem = Wave()
|
||||
|
||||
Hard Constraint Model
|
||||
---------------------
|
||||
|
||||
After the problem, a **torch** model is needed to solve the PINN.
|
||||
Usually many models are already implemented in ``PINA``, but the user
|
||||
has the possibility to build his/her own model in ``pyTorch``. The hard
|
||||
constraint we impose are on the boundary of the spatial domain.
|
||||
Specificly our solution is written as:
|
||||
Usually, many models are already implemented in ``PINA``, but the user
|
||||
has the possibility to build his/her own model in ``PyTorch``. The hard
|
||||
constraint we impose is on the boundary of the spatial domain.
|
||||
Specifically, our solution is written as:
|
||||
|
||||
.. math:: u_{\rm{pinn}} = xy(1-x)(1-y)\cdot NN(x, y, t),
|
||||
|
||||
where :math:`NN` is the neural net output. This neural network takes as
|
||||
input the coordinates (in this case :math:`x`, :math:`y` and :math:`t`)
|
||||
and provides the unkwown field of the Wave problem. By construction it
|
||||
is zero on the boundaries. The residual of the equations are evaluated
|
||||
at several sampling points (which the user can manipulate using the
|
||||
method ``discretise_domain``) and the loss minimized by the neural
|
||||
network is the sum of the residuals.
|
||||
and provides the unknown field :math:`u`. By construction, it is zero on
|
||||
the boundaries. The residuals of the equations are evaluated at several
|
||||
sampling points (which the user can manipulate using the method
|
||||
``discretise_domain``) and the loss minimized by the neural network is
|
||||
the sum of the residuals.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
@@ -114,6 +119,9 @@ network is the sum of the residuals.
|
||||
hard = x.extract(['x'])*(1-x.extract(['x']))*x.extract(['y'])*(1-x.extract(['y']))
|
||||
return hard*self.layers(x)
|
||||
|
||||
Train and Inference
|
||||
-------------------
|
||||
|
||||
In this tutorial, the neural network is trained for 3000 epochs with a
|
||||
learning rate of 0.001 (default in ``PINN``). Training takes
|
||||
approximately 1 minute.
|
||||
@@ -128,10 +136,20 @@ approximately 1 minute.
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
GPU available: False, used: False
|
||||
/u/n/ndemo/.local/lib/python3.9/site-packages/torch/cuda/__init__.py:546: UserWarning: Can't initialize NVML
|
||||
warnings.warn("Can't initialize NVML")
|
||||
GPU available: True (cuda), used: True
|
||||
TPU available: False, using: 0 TPU cores
|
||||
IPU available: False, using: 0 IPUs
|
||||
HPU available: False, using: 0 HPUs
|
||||
Missing logger folder: /u/n/ndemo/PINA/tutorials/tutorial3/lightning_logs
|
||||
2023-10-17 10:24:02.163746: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
|
||||
2023-10-17 10:24:02.218849: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
|
||||
To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
|
||||
2023-10-17 10:24:07.063047: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
|
||||
/opt/sissa/apps/intelpython/2022.0.2/intelpython/latest/lib/python3.9/site-packages/scipy/__init__.py:138: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.26.0)
|
||||
warnings.warn(f"A NumPy version >={np_minversion} and <{np_maxversion} is required for this version of "
|
||||
LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]
|
||||
|
||||
| Name | Type | Params
|
||||
----------------------------------------
|
||||
@@ -144,20 +162,17 @@ approximately 1 minute.
|
||||
0.002 Total estimated model params size (MB)
|
||||
|
||||
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
Epoch 2999: : 1it [00:00, 79.33it/s, v_num=5, mean_loss=0.00119, D_loss=0.00542, t0_loss=0.0017, gamma1_loss=0.000, gamma2_loss=0.000, gamma3_loss=0.000, gamma4_loss=0.000]
|
||||
Training: 0it [00:00, ?it/s]
|
||||
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
`Trainer.fit` stopped: `max_epochs=3000` reached.
|
||||
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
Epoch 2999: : 1it [00:00, 68.62it/s, v_num=5, mean_loss=0.00119, D_loss=0.00542, t0_loss=0.0017, gamma1_loss=0.000, gamma2_loss=0.000, gamma3_loss=0.000, gamma4_loss=0.000]
|
||||
|
||||
|
||||
Notice that the loss on the boundaries of the spatial domain is exactly
|
||||
zero, as expected! After the training is completed one can now plot some
|
||||
results using the ``Plotter`` class of **PINA**.
|
||||
@@ -177,14 +192,13 @@ results using the ``Plotter`` class of **PINA**.
|
||||
|
||||
|
||||
|
||||
|
||||
.. image:: tutorial_files/tutorial_12_0.png
|
||||
.. image:: output_14_0.png
|
||||
|
||||
|
||||
|
||||
.. image:: tutorial_files/tutorial_12_1.png
|
||||
.. image:: output_14_1.png
|
||||
|
||||
|
||||
|
||||
.. image:: tutorial_files/tutorial_12_2.png
|
||||
.. image:: output_14_2.png
|
||||
|
||||
|
||||
Reference in New Issue
Block a user