update DP burgers
This commit is contained in:
1 parent
4a07e18689
commit
a782dc1d54
2 files changed
+51
-381
No files matched your search
+51
-96
@@ -6,7 +6,7 @@
|
||||
"source": [
|
||||
"# Burgers Optimization with a Differentiable Physics Gradient\n",
|
||||
"\n",
|
||||
"To illustrate the process of computing gradients in a _differentiable physics_ (DP) setting, we target the same inverse problem (the reconstruction task) used for the PINN example in {doc}`physicalloss-code`. The choice of DP as a method has some immediate implications: we start with a discretized PDE, and the evolution of the system is now fully determined by the resulting numerical solver. Hence, the only real unknown is the initial state! We will still need to re-compute all the states betwwen the initial and target state many times, just now we won't need an NN for this step. Instead, we can rely on our discretized model. \n",
|
||||
"To illustrate the process of computing gradients in a _differentiable physics_ (DP) setting, we target the same inverse problem (the reconstruction task) used for the PINN example in {doc}`physicalloss-code`. The choice of DP as a method has some immediate implications: we start with a discretized PDE, and the evolution of the system is now fully determined by the resulting numerical solver. Hence, the only real unknown is the initial state. We will still need to re-compute all the states betwwen the initial and target state many times, just now we won't need an NN for this step. Instead, we can rely on our discretized model. \n",
|
||||
"\n",
|
||||
"Also, as we choose an initial discretization for the DP approach, the unknown initial state consists of the sampling points of the involved physical fields, and we can simply represent these unknowns as floating point variables. Hence, even for the initial state we do not need to set up an NN. Thus, our Burgers reconstruction problem reduces to a gradient-based opitmization without any NN when solving it with DP. Nonetheless, it's a very good starting point to illustrate the process.\n",
|
||||
"\n",
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -76,9 +76,9 @@
|
||||
"source": [
|
||||
"## Gradients\n",
|
||||
"\n",
|
||||
"Now we can use the `record_gradients` function of phiflow to trigger the generation of a gradient tape to compute gradients of a simulation.\n",
|
||||
"The `record_gradients` function of phiflow triggers the generation of a gradient tape to compute gradients of a simulation via `math.gradients(loss, values)`.\n",
|
||||
"\n",
|
||||
"For that we need a loss function: we want the solution at $t=0.5$ to respect the data in terms of an L2 norm. Thus we can simply compute an $L^2$ difference between step number 16 and our constraint array as `loss`. Afterwards, we evaluate the gradient of our initial velocity state `velocity` with respect to this loss."
|
||||
"To use it for the Burgers case we need to specify a loss function: we want the solution at $t=0.5$ to match the reference data. Thus we simply compute an $L^2$ difference between step number 16 and our constraint array as `loss`. Afterwards, we evaluate the gradient of the initial velocity state `velocity` with respect to this loss."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -119,9 +119,9 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Because we're only constraining timestep 16, we could actually omit steps 17 to 31 in this setup. They don't have any degrees of freedom and are not constrained in any way. For fairness and for direct comparison with the previous PINN case, we include them.\n",
|
||||
"Because we're only constraining timestep 16, we could actually omit steps 17 to 31 in this setup. They don't have any degrees of freedom and are not constrained in any way. However, for fairness regarding a comparison with the previous PINN case, we include them.\n",
|
||||
"\n",
|
||||
"Note that we've done a lot of calcuations here: first the 32 steps of our simulation, and then another 16 steps backwards from the loss. There were recorded by the gradient tape, and used to backpropagate the loss to the initial state of the simulation.\n",
|
||||
"Note that we've done a lot of calcuations here: first the 32 steps of our simulation, and then another 16 steps backwards from the loss. They were recorded by the gradient tape, and used to backpropagate the loss to the initial state of the simulation.\n",
|
||||
"\n",
|
||||
"Not surprisingly, because we're starting from zero, there's also a significant intial error of ca. 0.38 for the 16th simulation step.\n",
|
||||
"\n",
|
||||
@@ -136,17 +136,7 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[<matplotlib.lines.Line2D at 0x7fead6acbb80>]"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
@@ -158,30 +148,27 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import pylab as plt\n",
|
||||
"\n",
|
||||
"fig = plt.figure().gca()\n",
|
||||
"pltx = np.linspace(-1,1,N)\n",
|
||||
"\n",
|
||||
"# first gradient\n",
|
||||
"fig.plot(pltx, grad.numpy('x') , lw=2, color='green') \n",
|
||||
"\n",
|
||||
"fig.plot(pltx, velocity.values.numpy('x'), lw=2, color='mediumblue')\n",
|
||||
"fig.plot(pltx, grad.numpy('x') , lw=2, color='green', label=\"Gradient\") \n",
|
||||
"fig.plot(pltx, velocity.values.numpy('x'), lw=2, color='mediumblue', label=\"u at t=0\")\n",
|
||||
"plt.xlabel('x'); plt.ylabel('u'); plt.legend();\n",
|
||||
"\n",
|
||||
"# some (optional) other fields to plot:\n",
|
||||
"#fig.plot(pltx, (velocities[16]).values.numpy('x') , lw=2, color='cyan') \n",
|
||||
"#fig.plot(pltx, (SOLUTION_T16).values.numpy('x') , lw=2, color='red') \n",
|
||||
"#fig.plot(pltx, (velocities[16] - SOLUTION_T16).values.numpy('x') , lw=2, color='blue') \n",
|
||||
"\n"
|
||||
"#fig.plot(pltx, (velocities[16]).values.numpy('x') , lw=2, color='cyan', label=\"u at t=0.5\") \n",
|
||||
"#fig.plot(pltx, (SOLUTION_T16).values.numpy('x') , lw=2, color='red', label=\"solution at t=0.5\") \n",
|
||||
"#fig.plot(pltx, (velocities[16] - SOLUTION_T16).values.numpy('x') , lw=2, color='blue', label=\"difference at t=0.5\") \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Now we have our simulation graph in TF, we can use TF to give us a gradient for the initial state for the loss. All we need to do is run `tf.gradients(loss, [state_in.velocity.data]`, which will give us a \n",
|
||||
"\n",
|
||||
"Thus now we have \"search direction\" for each velocity variable. Based on a linear approximation, the gradient tells us how to change each of them to increase the loss function (gradients _always_ point \"upwards\"). In the following code block, we're additionally saving all these gradients in a list called `grads`, such that we can visualize them later on. (Normally, we could discard each gradient after performing an update step.)\n",
|
||||
"This gives us a \"search direction\" for each velocity variable. Based on a linear approximation, the gradient tells us how to change each of them to increase the loss function (gradients _always_ point \"upwards\"). Thus, we can use the gradient to run an optimization and find an initial state `velocity` that minimizes our loss.\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
@@ -191,7 +178,9 @@
|
||||
"source": [
|
||||
"## Optimization \n",
|
||||
"\n",
|
||||
"Based on the gradient, we can now take a step in the opposite direction to bring the loss down (instead of increasing it). Below we're using a learning rate `LR=5` for this step. Afterwards, we're re-evaluating the loss for the updated state to check how we did. "
|
||||
"Based on the gradient, we can now take a step in the opposite direction to bring the loss down (instead of increasing it). We're using a learning rate `LR=5` for this step. We're also re-evaluating the loss for the updated state to check how we did. \n",
|
||||
"\n",
|
||||
"In the following code block, we're additionally saving all these gradients in a list called `grads`, such that we can visualize them later on. (Normally, we could discard each gradient after performing an update step for `velocity`.)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -248,17 +237,7 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[<matplotlib.lines.Line2D at 0x7fead6b6ae20>]"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEWCAYAAABIVsEJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABLH0lEQVR4nO3dd3gVVfrA8e+bHnoVQTrSJYB0lGJBEbCsrqLrKq7yQ11pFhTFisqiKE1dFRVx7WVXRURBKYoUBaT3Ir2FTkjPfX9/zCReUiAJSebe5P08T57cO3Nm5s3cm/vec87MOaKqGGOMMXkV4nUAxhhjgpMlEGOMMfliCcQYY0y+WAIxxhiTL5ZAjDHG5IslEGOMMfliCcQgIheJyCYRiROR67yOp7CIyBoR6Z7Pbb8TkX4FG9HZxWSM1yyBlCAiMldEjohIZKZVI4FXVbWMqn4lIioi5xfwsbeJSIKbpOJEZOYZyncWkdkickJEjonINyLSLA/HmyIiz/kvU9Xmqjo3P/Gr6lWq+l5+ti2smM5wrOYiMlNEDovIURFZKiK93HXdRWRXQR/zbLnvz/6nWV/XfW+G5XP/fxOR7SJyUkS+EpFKpymrbrn09+vb+TlmcWcJpIQQkbpAF0CBazKtrgOsKaDjnO6f+2o3SZVR1StOs49OwEzga6AGUA9YAcwXkfoFEWcJ8A3wA3AucA4wGDjuaUQeEpHmwJvAbUA1IB749xk2a+n3fs0xsZVoqmo/JeAHeBKYD4wFpvkt3wL4gAQgDliIk2ROus/7uuX6AMuBo8ACIMZvH9uAR4CVQBIQls3xtwGX5zLWecC/s1n+HfAf93F3YBfwGHDQ3f+t7roBQAqQ7P4N32SOAXga+Bz4ADgBrAIaAY8CB4CdwBV+x54L9Hcfr3D3m/6jQHd33efAPuAY8DPQPA8xRQLjgT3uz3ggMtPf+6Ab317gHzmcvypuTBWyWVfafa19fvHXwPkyOdx9PxwCPgMqudvUdfc3wI1rL/CQ3z7bA0twEtR+YGwOcVUEpgGxwBH3cU133fNAGpDoxvRqNtvvcONIj7tTHt7/o4CP/J43cF+LsjmUV+B8r/9vA/3H8wDsp4heaNgM/BNo436QVfNbl/Eh5j4/5Z8HaO1+aHUAQoF+7jaRftsvB2oB0Tkcf5v74RKLU7tomUO5Uu4HySXZrPsHsNd93B1IxUmIkUA3nKTX2F0/BXgumxj8E0gicCUQBvwH+AMYAYQD/wf84bftXNwEkmmfA4D1QDn3+Z1AWf5MBsv9yp4pppHAIpwaQ1WcRP1spr93pBtfL5xv0RWziUmATTgf0Nf5v9Z++9qVadkQ99g13djfBD5219V13xMf4ySgFu7rmB73QuA293EZoGMOr21l4Ab3NS6Lk2y/OtM59lufHkeY37KLcb7U5PRzsVvua+CRTPuLA9rkcCzFSZb7gP8Bdb3+Hw7EH2vCKgFE5GKcZqrPVHUpzrfMv+VhFwOAN1X1V1VNU6cvIAno6FdmoqruVNWEHPZxK84HQB1gDjBDRCpkU64Szrfhvdms24vz7drfE6qapKo/Ad8CN+XybwKYp6ozVDUV58OsKjBaVVOAT4C6OcQIZJzX54BrVPU4gKpOVtUTqpqEk6Raikj5XMZzKzBSVQ+oaizwDE6TS7oUd32Kqk7H+QBsnHkn6nwCXoKTnF4G9orIzyLS8DTHvgcYoaq7/GL/a6YmyWdU9aSqrgLeBW7xi+t8EamiqnGquii7A6jqIVX9r6rGq+oJnFpHt9OfktNT1V9UtcJpfn5xi5bBqRX6O4aTyLLTDef92gQnkUzLb99LcWYJpGToB8xU1YPu84/cZblVB3jQ7Yw9KiJHcWobNfzK7DzdDlR1vqomuB8e/8L5dtglm6JHcJpXqmezrjpOc1VGWVU96fd8e6aYzmS/3+ME4KCqpvk9B+eDJwsRqYXTzNNPVTe6y0JFZLSIbBGR4zgf4JA16eWkBs7fkC7z33PITXbp4nOKz00EA1W1Ac7rdxKnlpWTOsCXfq/vOpyaYDW/Mv6vsX9sd+E0/60XkcUi0ie7A4hIKRF50+3IPo7TxFdBREJPE1dBiQPKZVpWDqf5MgtV/VlVk1X1KE7trB7QtFAjDEKWQIo5EYnG+VbeTUT2icg+4H6cb8Ytc7mbncDzmb7ZlVLVj/3K5HVYZ8Vpajl1oZMQFgI3ZrPNTcAsv+cVRaS03/PaON8W8xNPrrnn9CtgvKp+57fqb8C1wOVAeZxvsPDn33mmmPbgfJCn8/978k1VdwKvARecJo6dwFWZXuMoVd3tV6ZWdrGp6iZVvQWn6e0F4ItMr0u6B3FqTB1UtRzQ1V2e2/OTZb2IdPG7Uiq7n/QvKWuAln7b1cdpqtt4hmP6HzvL+7WkswRS/F2H802yGdDK/WmK01F9ew7b7Af8r3Z6C7hHRDqIo7SI9BaRnKr/pxCR2u69JhEiEiUiw3C+lc/PYZPhQD8RGSwiZUWkonv5ayecZh1/z7j77YLT0f95Dn9DQZoMrFfVFzMtL4vTtHcIp51/VKb1Z4rpY+BxEakqIlVwLnz4IK/BuefrGRE5X0RC3H3didPHkR5H5UxNa28Az4tIHXcfVUXk2ky7fsKtRTTH6Y/61C37dxGpqqo+nJolOLXIzMri1OyOupfQPpVp/ZnOT6y734wyqjpP/7xSKrufeW7RD4Gr3YRTGqcv6X9uU9op3EugW7k1yjI4zYC7cWplxo8lkOKvH/Cuqu5Q1X3pP8CrwK05tOs+DbznNmfcpKpLcDqVX8VpYtoM3JGHGMoCr7vb7gZ64nzbPZRdYbfd+krgepx+j+04HfkXq+omv6L73H3uwfmAuEdV17vr3gGauX/DV3mINTduBv6SzTfd/7ix7gbW8ucHdrozxfQcztVMK3GuCvvdXZZXyTi1nx9xroxajZPY7gBwz9HHwFY3lhrABGAqMFNETrixd8i0359wXvtZwEuqmn4vT09gjYjEufu5OYe+sPFANE4z5CLg+0zrJ+D0uxwRkYmZN1bVeJx+k/lu3B0zl8mJqq7B6ef5EOeCkLI4F5UAGTeKPuY+rYaTHI8DW3HOZR+3b8z4Eae/zZjgIs7d2x+oak2PQyn23HuI/gDCM/XBmBLOaiDGGGPyxRKIMcaYfLEmLGOMMfliNRBjjDH5UqLurKxSpYrWrVvX6zCMMSaoLF269KCqVs28vEQlkLp167JkyRKvwzDGmKAiItuzW25NWMYYY/LFEogxxph8sQRijDEmXzztAxGRyTjjFx1Q1QuyWS84wxukz31wh6r+7q7rBzzuFn1Oz3K6UWMMpKSksGvXLhITE70OxXggKiqKmjVrEh4enqvyXneiT8EZXymnYaavAhq6Px1wxlPq4DcQW1ucUTKXishUVT1S6BEbU4zt2rWLsmXLUrduXZzvb6akUFUOHTrErl27qFevXq628bQJS1V/Bg6fpsi1OFOYqjtJTQURqY4z0N4PqnrYTRo/4AzoZow5C4mJiVSuXNmSRwkkIlSuXDlPtc9A7wM5j1MnsdnlLstpeRYiMkBElojIktjY2EIL1JjiwpJHyZXX197rJqxCp6qTgEkAbdu2tXFbTJFKTktm6e6lrNq3ivWx60lKTeKaZtdwWYPLCAsp9v9+ppgL9Hfwbk6dBa2mu2w30D3T8rlFFpUxp3Ey+SSztszi+43f88u2XziZcvKU9d9v+p5zy5zLmF5j6Fy7s0dRBq7Q0FBatGhBamoq9erV4/3336dChQo5lo+NjaVPnz4kJyczceJEunTJbqZkUxgCPYFMBQaKyCc4nejHVHWviMwARolIRbfcFcCjXgVpjKqyeNdiPln5CTM3zSQh9c/5lBpVaUSHmh1ock4T4pPj+XDFh2w7so1PV35qCSQb0dHRLF++HIB+/frx2muvMWLEiBzLz5o1ixYtWvD222/n+hhpaWmEhhbFVOzFm9eX8X6MU5OoIiK7cK6sCgdQ1TeA6TiX8G7GuYz3H+66wyLyLLDY3dVIVT1dZ7wxhSIpNYkv137JlKVT2HToz8kSW9doTZ8mfejRoAfnlT+1e+78yufzj//+gyMJdtHgmXTq1ImVK1cCsGXLFu677z5iY2MpVaoUb731FomJiTz88MMkJCSwZMkSFi5cyLx583jqqadISkqiQYMGvPvuu5QpU4a6devSt29ffvjhBx5++GEqVaqUY7l+/frxzTffkJKSwueff06TJk2Ii4tj0KBBLFmyBBHhqaee4oYbbmDmzJnZ7qck8DSBqOotZ1ivwH05rJuMMze1MUXucPxhPlzxIe8ve59D8c7MvFVLV+XGFjdy0wU3UatCrRy3rRBdASDgE0iDlxoUyn63PLQlV+XS0tKYNWsWd911FwADBgzgjTfeoGHDhvz666/885//ZPbs2YwcOZIlS5bw6quvcvDgQZ577jl+/PFHSpcuzQsvvMDYsWN58sknAahcuTK///47Bw8e5Prrr8+xXJUqVfj999/597//zUsvvcTbb7/Ns88+S/ny5Vm1ahUAR44cOePxirtAb8IyJqDsO7GPN357g89XfU5iqnO5Y/Nqzenftj9XNbqK8NAz34BVKboSEPgJxCsJCQm0atWK3bt307RpU3r06EFcXBwLFizgxhtvzCiXlJSUZdtFixaxdu1aLrroIgCSk5Pp1KlTxvq+ffvmqtz1118PQJs2bfjf//4HwI8//sgnn3ySUaZixYpMmzbttPsp7iyBGJMLsSdjeePXN/hoxUckpyUD0K1eN/6v3f/RsVbHPF3+WDHa6boL9ASS25pCQUvvA4mPj+fKK6/ktdde44477qBChQoZfSM5UVV69OjBxx9/nO360qVL56pcZGQk4HTop6bmPA38mfZT3AX6fSDGeOpQ/CH+NfdfdH+rO1N+n0JyWjK9GvVier/pTL5hMp1qd8rztfOlwksRERpBYmoiCSkJZ96ghCpVqhQTJ07k5ZdfplSLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
@@ -273,19 +252,21 @@
|
||||
"fig = plt.figure().gca()\n",
|
||||
"\n",
|
||||
"# target constraint at t=0.5\n",
|
||||
"fig.plot(pltx, SOLUTION_T16.values.numpy('x'), lw=2, color='forestgreen') \n",
|
||||
"fig.plot(pltx, SOLUTION_T16.values.numpy('x'), lw=2, color='forestgreen', label=\"Reference\") \n",
|
||||
"\n",
|
||||
"# optimized state of our simulation after 16 steps\n",
|
||||
"fig.plot(pltx, velocities[16].values.numpy('x'), lw=2, color='mediumblue')\n"
|
||||
"fig.plot(pltx, velocities[16].values.numpy('x'), lw=2, color='mediumblue', label=\"Simulated velocity\")\n",
|
||||
"\n",
|
||||
"plt.xlabel('x'); plt.ylabel('u'); plt.legend(); plt.title(\"After 5 Optimization Steps at t=0.5\");"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This seems to be going in the right direction! It's not there yet, but we've also only computed 5 GD update steps so far. The two peaks with a positive velocity on the left side of the shock and the negative peak on the right side are starting to show.\n",
|
||||
"This seems to be going in the right direction! It's defintely not perfect, but we've only computed 5 GD update steps so far. The two peaks with a positive velocity on the left side of the shock and the negative peak on the right side are starting to show.\n",
|
||||
"\n",
|
||||
"This is a good indicator that the backpropagation of gradients through all of our 16 simulated steps is behaving correctly, and that it's driving the solution in the right direction. This hints at how powerful this setup is: the gradient that we obtain from each of the simulation steps (and each operation within them) can easily be chained together into more complex sequences. Here, we're backpropagation through all 16 steps of the simulation, and we could easily enlarge this \"look-ahead\" of the optimization with minor changes to the code.\n",
|
||||
"This is a good indicator that the backpropagation of gradients through all of our 16 simulated steps is behaving correctly, and that it's driving the solution in the right direction. This hints at how powerful this setup is: the gradient that we obtain from each of the simulation steps (and each operation within them) can easily be chained together into more complex sequences. In the example above, we're backpropagating through all 16 steps of the simulation, and we could easily enlarge this \"look-ahead\" of the optimization with minor changes to the code.\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
@@ -317,7 +298,7 @@
|
||||
"Optimization step 30, loss: 0.008259\n",
|
||||
"Optimization step 35, loss: 0.005283\n",
|
||||
"Optimization step 40, loss: 0.003360\n",
|
||||
"Runtime 20.50s\n"
|
||||
"Runtime 29.89s\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -349,7 +330,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Thinking back to the PINN version, we have a much lower error here after only 50 steps, and the oveall runtime is also much lower (ca. a factor of 4, depending on your hardware).\n",
|
||||
"Thinking back to the PINN version from {doc}`diffphys-code-burgers`, we have a much lower error here after only 50 steps (by ca. an order of magnitude), and the overall runtime is also much lower (ca. a factor of 4, depending on your hardware).\n",
|
||||
"\n",
|
||||
"Let's plot again how well our solution at $t=0.5$ (blue) matches the constraints (green) now:"
|
||||
]
|
||||
@@ -361,17 +342,7 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[<matplotlib.lines.Line2D at 0x7fead6b6a1c0>]"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
@@ -384,8 +355,9 @@
|
||||
],
|
||||
"source": [
|
||||
"fig = plt.figure().gca()\n",
|
||||
"fig.plot(pltx, SOLUTION_T16.values.numpy('x'), lw=2, color='forestgreen') \n",
|
||||
"fig.plot(pltx, velocities[16].values.numpy('x'), lw=2, color='mediumblue')\n"
|
||||
"fig.plot(pltx, SOLUTION_T16.values.numpy('x'), lw=2, color='forestgreen', label=\"Reference\") \n",
|
||||
"fig.plot(pltx, velocities[16].values.numpy('x'), lw=2, color='mediumblue', label=\"Simulated velocity\")\n",
|
||||
"plt.xlabel('x'); plt.ylabel('u'); plt.legend(); plt.title(\"After 50 Optimization Steps at t=0.5\");"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -404,17 +376,7 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[<matplotlib.lines.Line2D at 0x7fead71aadf0>]"
|
||||
]
|
||||
},
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
@@ -431,18 +393,18 @@
|
||||
"\n",
|
||||
"# ground truth state at time=0 , move down\n",
|
||||
"INITIAL_GT = np.asarray( [-np.sin(np.pi * x) * 1. for x in np.linspace(-1,1,N)] ) # 1D array\n",
|
||||
"#t0gt = np.asarray( [ [-math.sin(np.pi * x) * 1.] for x in np.linspace(-1,1,n)] )\n",
|
||||
"fig.plot(pltx, INITIAL_GT.flatten() , lw=2, color='forestgreen') # ground truth initial state of sim\n",
|
||||
"\n",
|
||||
"fig.plot(pltx, velocity.values.numpy('x'), lw=2, color='mediumblue') # manual\n",
|
||||
"\n"
|
||||
"fig.plot(pltx, INITIAL_GT.flatten() , lw=2, color='forestgreen', label=\"Ground truth initial state\") # ground truth initial state of sim\n",
|
||||
"fig.plot(pltx, velocity.values.numpy('x'), lw=2, color='mediumblue', label=\"Optimized initial state\") # manual\n",
|
||||
"plt.xlabel('x'); plt.ylabel('u'); plt.legend(); plt.title(\"Initial State After 50 Optimization Steps\");\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Naturally, this is a tougher task: the optimization receives direct feedback what the state at $t=0.5$ should look like, but due to the non-linear model equation, we typically have a large number of solution that exactly or numerically very closely satisfy the constraints. Hence, our minimizer not necessarily finds the exact state we started from. However, it's still quite close in this Burgers scenario.\n",
|
||||
"Naturally, this is a tougher task: the optimization receives direct feedback what the state at $t=0.5$ should look like, but due to the non-linear model equation, we typically have a large number of solutions that exactly or numerically very closely satisfy the constraints. Hence, our minimizer not necessarily finds the exact state we started from. However, it's still quite close in this Burgers scenario.\n",
|
||||
"\n",
|
||||
"_Note_: for the current phiflow version (2.0) the intial solution actually contains some high frequency oscillations in the peaks. These oscilllations disappear over the course of the simulation due to numerical diffusions, and hence represent a _null space_ of the solution. They could be removed by introducing regularization.\n",
|
||||
"\n",
|
||||
"Before measuring the overall error of the reconstruction, let's visualize the full evolution of our system over time as this also yields the solution in the form of a numpy array that we can compare to the other versions:"
|
||||
]
|
||||
@@ -514,7 +476,7 @@
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1152x360 with 2 Axes>"
|
||||
]
|
||||
@@ -527,9 +489,9 @@
|
||||
],
|
||||
"source": [
|
||||
"# note, this requires running the forward sim & PINN notebooks beforehand\n",
|
||||
"sol_gt=npfile=np.load(\"./temp/burgers-groundtruth-solution.npz\")[\"arr_0\"] ; #print(format(sol_gt.shape)) \n",
|
||||
"sol_pi=npfile=np.load(\"./temp/burgers-pinn-solution.npz\")[\"arr_0\"] ; #print(format(sol_pi.shape)) \n",
|
||||
"sol_dp=npfile=np.load(\"./temp/burgers-diffphys-solution.npz\")[\"arr_0\"] ; #print(format(sol_dp.shape)) \n",
|
||||
"sol_gt=npfile=np.load(\"./temp/burgers-groundtruth-solution.npz\")[\"arr_0\"] \n",
|
||||
"sol_pi=npfile=np.load(\"./temp/burgers-pinn-solution.npz\")[\"arr_0\"] \n",
|
||||
"sol_dp=npfile=np.load(\"./temp/burgers-diffphys-solution.npz\")[\"arr_0\"] \n",
|
||||
"\n",
|
||||
"divider = np.ones([10,33])*-1. # we'll sneak in a block of -1s to show a black divider in the image\n",
|
||||
"sbs = np.concatenate( [sol_gt, divider, sol_pi, divider, sol_dp], axis=0)\n",
|
||||
@@ -558,15 +520,15 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"MAE PINN: \t0.21460 \n",
|
||||
"MAE DP: \t0.05909\n",
|
||||
"MAE PINN: 0.22991 \n",
|
||||
"MAE DP: 0.05909\n",
|
||||
"\n",
|
||||
"Error GT to PINN (top) , DiffPhys (bottom):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1152x360 with 2 Axes>"
|
||||
]
|
||||
@@ -580,7 +542,7 @@
|
||||
"source": [
|
||||
"err_pi = np.sum( np.abs(sol_pi-sol_gt)) / (STEPS*N)\n",
|
||||
"err_dp = np.sum( np.abs(sol_dp-sol_gt)) / (STEPS*N)\n",
|
||||
"print(\"MAE PINN: \\t{:7.5f} \\nMAE DP: \\t{:7.5f}\".format(err_pi,err_dp))\n",
|
||||
"print(\"MAE PINN: {:7.5f} \\nMAE DP: {:7.5f}\".format(err_pi,err_dp))\n",
|
||||
"\n",
|
||||
"print(\"\\nError GT to PINN (top) , DiffPhys (bottom):\")\n",
|
||||
"show_state(np.reshape( np.concatenate([sol_pi-sol_gt, divider, sol_dp-sol_gt],axis=0) ,[N*2+10,33,1]))"
|
||||
@@ -590,30 +552,23 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"That's a pretty clear result: the PINN error is ca. 5 times higher than the Differentiable Physics (DP) reconstruction.\n",
|
||||
"That's a pretty clear result: the PINN error is almost 4 times higher than the one from the Differentiable Physics (DP) reconstruction.\n",
|
||||
"\n",
|
||||
"This difference also shows clearly in the jointly visualized image at the bottom: the magnitudes of the errors of the DP reconstruction are much closer to zero, as indicated by the purple color above.\n",
|
||||
"\n",
|
||||
"A simple direct reconstruction problem like this one is always a good initial test for a DP solver, e.g., before moving to more complex setups like coupling it with an NN. If the direct optimization does not converge, there's probably still something fundamentally wrong, and there's no point involving an NN. \n",
|
||||
"\n",
|
||||
"Now we have a first example to show similarities and differences of the two approaches. In the section, we'll present a discussion of the findings so far, before moving to more complex cases.\n",
|
||||
"Now we have a first example to show similarities and differences of the two approaches. In the next section, we'll present a discussion of the findings so far, before moving to more complex cases in the following chapter.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"## Next steps\n",
|
||||
"\n",
|
||||
"As with the PINN version, there's variety of things that can be improved and experimented with the code above:\n",
|
||||
"As with the PINN version, there's variety of things that can be improved and experimented with using the code above:\n",
|
||||
"\n",
|
||||
"* You can try to adjust the training parameters to improve the reconstruction.\n",
|
||||
"* As for the PINN case, you can activate a different optimizer, and observe the changing (not necessarily improved) behavior.\n",
|
||||
"* You can try to adjust the training parameters to further improve the reconstruction.\n",
|
||||
"* As for the PINN case, you can activate a different optimizer, and observe the changing (not necessarily improved) convergence behavior.\n",
|
||||
"* Vary the number of steps, or the resolution of the simulation and reconstruction.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
||||
@@ -1,285 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Burgers Optimization with a (Manual) Differentiable Physics Gradient\n",
|
||||
"\n",
|
||||
"To illustrate the process of compute gradients in a differentiable physics setting, we first demonstrate a process that isn't recommended for more complex real-world cases, but more clearly shows the way we can get gradient information from a physical simulation in a DL framework. We'll target tensorflow in the following.\n",
|
||||
"\n",
|
||||
"We target the same reconstruction task like for the PINN example. This has some immediate implications: the evolution of the system is now fully determined by our PDE formulatio. Hence, the only real unknown is the initial state! We will still need to re-compute all the states betwwen the initial and target state many times, just now we won't need an NN for this step, we can rely on our discretized model. Also, as we choose an initial discretization for the DP approach, the unknown initial state consists of the sampling points of the involved physical fields, and we can simply represent these unknowns as floating point variables. Hence, even for the initial state we do not need to set up an NN. Thus, our Burgers reconstruction problem reduces to a gradient-based opitmization without any NN when solving it with DP. Nonetheless, it's a very good starting point to illustrate the process.\n",
|
||||
"\n",
|
||||
"First, we'll set up our discretized simulation. Here we can employ the phiflow solver, as shown in the overview section on _Burgers forward simulations_. phiflow directly gives us a computational graph in tensorflow. So, as a first step, let's set up our grid with 128 points, and construct a tensorflow graph for 32 steps of the simulation. (As usual, you can ignore the warnings when loading TF and phiflow.)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Each velocity is a phiflow grid like this one: Grid[128(1), size=[2.], <class 'numpy.float32'>]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from phi.tf.flow import *\n",
|
||||
"\n",
|
||||
"# run with phiflow\n",
|
||||
"n = 128\n",
|
||||
"dt = 1./32.\n",
|
||||
"initial = np.zeros([n,1]) # start from 0\n",
|
||||
"\n",
|
||||
"domain = Domain([n], boundaries=PERIODIC, box=box[-1:1])\n",
|
||||
"state0 = BurgersVelocity(domain, velocity=initial, viscosity=0.01/np.pi)\n",
|
||||
"\n",
|
||||
"# start with a state0, to be modified\n",
|
||||
"state_in = state0.copied_with(velocity=placeholder)\n",
|
||||
"states = [state_in]\n",
|
||||
"\n",
|
||||
"for i in range(32):\n",
|
||||
" states.append( Burgers().step(states[-1],dt=dt) )\n",
|
||||
"\n",
|
||||
"print(\"Note: each velocity is a phiflow grid like this one \" + format(states[-1].velocity) )"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"**A lot** has happened in these first steps, but we didnt run a single calculation for our simulation. In contrast to the first example, which used numpy as phiflow backend, we now have used the tensorflow backend (the trick here was importing `phi.tf.flow` instad of `phi.flow`). This gave us a tensorflow graph, but didn't run any real simulation steps. That will only happen once we run a tensorflow session and pass some data through this graph. So, in a way _nothing_ has happened so far in terms of our simulation! \n",
|
||||
"\n",
|
||||
"Next, let's set up the loss, such that we can start the optimization. That's actually pretty simple, we want the solution at $t=0.5$, i.e. step number 16, to respect the data in terms of an L2 norm. Let's also directly initialize the TF variables, and see what loss we get from the initial zero'ed initialization:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:17: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
|
||||
"\n",
|
||||
"WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:18: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n",
|
||||
"\n",
|
||||
"WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:28: The name tf.global_variables_initializer is deprecated. Please use tf.compat.v1.global_variables_initializer instead.\n",
|
||||
"\n",
|
||||
"WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:29: The name tf.train.Saver is deprecated. Please use tf.compat.v1.train.Saver instead.\n",
|
||||
"\n",
|
||||
"Initial loss 0.3829152584075928\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"sess = Session(None) \n",
|
||||
"\n",
|
||||
"# enforce constraints at time t=0.5 (step 16)\n",
|
||||
"solution_t16 = np.asarray( [0.008612174447657694, 0.02584669669548606, 0.043136357266407785, 0.060491074685516746, 0.07793926183951633, 0.0954779141740818, 0.11311894389663882, 0.1308497114054023, 0.14867023658641343, 0.1665634396808965, 0.18452263429574314, 0.20253084411376132, 0.22057828799835133, 0.23865132431365316, 0.25673879161339097, 0.27483167307082423, 0.2929182325574904, 0.3109944766354339, 0.3290477753208284, 0.34707880794585116, 0.36507311960102307, 0.38303584302507954, 0.40094962955534186, 0.4188235294008765, 0.4366357052408043, 0.45439856841363885, 0.4720845505219581, 0.4897081943759776, 0.5072391070000235, 0.5247011051514834, 0.542067187709797, 0.5593576751669057, 0.5765465453632126, 0.5936507311857876, 0.6106452944663003, 0.6275435911624945, 0.6443221318186165, 0.6609900633731869, 0.67752574922899, 0.6939334022562877, 0.7101938106059631, 0.7263049537163667, 0.7422506131457406, 0.7580207366534812, 0.7736033721649875, 0.7889776974379873, 0.8041371279965555, 0.8190465276590387, 0.8337064887158392, 0.8480617965162781, 0.8621229412131242, 0.8758057344502199, 0.8891341984763013, 0.9019806505391214, 0.9143881632159129, 0.9261597966464793, 0.9373647624856912, 0.9476871303793314, 0.9572273019669029, 0.9654367940878237, 0.9724097482283165, 0.9767381835635638, 0.9669484658390122, 0.659083299684951, -0.659083180712816, -0.9669485121167052, -0.9767382069792288, -0.9724097635533602, -0.9654367970450167, -0.9572273263645859, -0.9476871280825523, -0.9373647681120841, -0.9261598056102645, -0.9143881718456056, -0.9019807055316369, -0.8891341634240081, -0.8758057205293912, -0.8621229450911845, -0.8480618138204272, -0.833706571569058, -0.8190466131476127, -0.8041372124868691, -0.7889777195422356, -0.7736033858767385, -0.758020740007683, -0.7422507481169578, -0.7263049162371344, -0.7101938950789042, -0.6939334061553678, -0.677525822052029, -0.6609901538934517, -0.6443222327338847, -0.6275436932970322, -0.6106454472814152, -0.5936507836778451, -0.5765466491708988, -0.5593578078967361, -0.5420672759411125, -0.5247011730988912, -0.5072391580614087, -0.4897082914472909, -0.47208460952428394, -0.4543985995006753, -0.4366355580500639, -0.41882350871539187, -0.40094955631843376, -0.38303594105786365, -0.36507302109186685, -0.3470786936847069, -0.3290476440540586, -0.31099441589505206, -0.2929180880304103, -0.27483158663081614, -0.2567388003912687, -0.2386513127155433, -0.22057831776499126, -0.20253089403524566, -0.18452269630486776, -0.1665634500729787, -0.14867027528284874, -0.13084990929476334, -0.1131191325854089, -0.09547794429803691, -0.07793928430794522, -0.06049114408297565, -0.0431364527809777, -0.025846763281087953, -0.00861212501518312] )\n",
|
||||
"target = state0.copied_with(velocity=np.reshape(solution_t16,[n,1]))\n",
|
||||
"\n",
|
||||
"loss = math.sum( (states[16].velocity.data - target.velocity.data)**2 ) / n\n",
|
||||
"sess.initialize_variables()\n",
|
||||
"\n",
|
||||
"# compute initial loss\n",
|
||||
"s,l = sess.run([states[-1],loss], feed_dict={state_in: state0})\n",
|
||||
"print(\"Initial loss \"+format(l))\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Not surprisingly, because we're starting from zero, there's a significant intial error of ca. 0.38 for the 16th simulation step.\n",
|
||||
"\n",
|
||||
"Note that because we're only constraining timestep 16, we could actually omit steps 17 to 31 in this setup. They don't have any degrees of freedom and are not constrained in any way. For fairness and for direct comparison with the previous PINN case, let's include them.\n",
|
||||
"\n",
|
||||
"Now we have our simulation graph in TF, we can use TF to give us a gradient for the initial state for the loss. All we need to do is run `tf.gradients(loss, [state_in.velocity.data]`, which will give us a direction for each velocity variable. Based on a linear approximation, this direction tells us how to change each of them to increase the loss function (gradients _always_ point \"upwards\"). In the following code snipped, we're additionally saving all these gradients in a list called `grads`, such that we can visualize them later on. (Normally, we could discard each gradient after performing an update step.)\n",
|
||||
"\n",
|
||||
"Based on the gradient, we can now take a step in the opposite direction to bring the loss down (instead of increasing it). Below we're using a learning rate `LR=5` for this step. Afterwards, we're re-evaluating the loss for the updated state to check how we did. As these updates aren't exactly fast, we're only computing five of them here:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"WARNING:tensorflow:From /usr/local/lib/python3.7/site-packages/tensorflow_core/python/ops/math_grad.py:1375: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
|
||||
"Instructions for updating:\n",
|
||||
"Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
|
||||
"Step 0, loss = 0.3829152584075928\n",
|
||||
"Step 1, loss = 0.3334265947341919\n",
|
||||
"Step 2, loss = 0.2905231714248657\n",
|
||||
"Step 3, loss = 0.25346457958221436\n",
|
||||
"Step 4, loss = 0.2215319573879242\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"LR = 5.\n",
|
||||
"stateN = state0\n",
|
||||
"grads = []\n",
|
||||
"for i in range(5):\n",
|
||||
" grads.append( tf.gradients(loss, [state_in.velocity.data] ) ) # use TF\n",
|
||||
" grads.append( gradients(loss, state_in.velocity) ) # phiflow wrapper also works\n",
|
||||
"\n",
|
||||
" state_updated = state_in.copied_with( velocity=(state_in.velocity - LR*grads[-1]) )\n",
|
||||
" stateN,l = sess.run([state_updated,loss], feed_dict={state_in: stateN})\n",
|
||||
"\n",
|
||||
" #s,l = sess.run([states[-1],loss], feed_dict={state_in: stateN})\n",
|
||||
" print( \"Step {}, loss = {}\".format(i,l) )\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"One of the reasons for the bad performance here is that we're querying states via `sess.run()` multiple times, instead of computing the update in one go. Nonetheless, this simple example already clearly shows that the loss is nicely going down: from above 0.38 to ca. 0.22. This is a good sign!\n",
|
||||
"\n",
|
||||
"Before improving on the performance, let's visualize the reconstruction.\n",
|
||||
"\n",
|
||||
"Starting from the zero state `state0` (shown in blue), the first gradient is shown as a red line here. If you compare it with the solution it points in the opposite direction, as expected. The solution is much larger in magnitude, so we omit it here (see the next graph).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[<matplotlib.lines.Line2D at 0x13fa0ae90>]"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"fig = plt.figure().gca()\n",
|
||||
"pltx = np.linspace(-1,1,n)\n",
|
||||
"\n",
|
||||
"# first gradient\n",
|
||||
"[grad0,s0] = sess.run([grads[0],state0], feed_dict={state_in: stateN}) #.velocity.data\n",
|
||||
"fig.plot(pltx, grad0[0].flatten() , lw=2, color='red') \n",
|
||||
"\n",
|
||||
"fig.plot(pltx, state0.velocity.data.flatten(), lw=2, color='mediumblue')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So the gradient looks good (feel free to plot the others from the five iterations above).\n",
|
||||
"\n",
|
||||
"How well does the 16th state of the simulation actually match the target after the 5 update steps? This is what the loss measures, after all. The next graph shows the constraints (i.e. the solution we'd like to obtain) in green, and the reconstructed state after the initial state was updated 16 times by the solver:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[<matplotlib.lines.Line2D at 0x13fbd43d0>]"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"fig = plt.figure().gca()\n",
|
||||
"\n",
|
||||
"# target constraint at t=0.5\n",
|
||||
"fig.plot(pltx, target.velocity.data.flatten(), lw=2, color='forestgreen') \n",
|
||||
"\n",
|
||||
"# constrained state of simulation\n",
|
||||
"contrained_state = sess.run(states[16], feed_dict={state_in: stateN}).velocity.data\n",
|
||||
"fig.plot(pltx, contrained_state.flatten(), lw=2, color='mediumblue')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This seems to be going in the right direction! It's not there yet, but we've also only computed 5 steps so far. The two peaks with a positive velocity on the left side of the shock and the negative peak on the right side are starting to show.\n",
|
||||
"\n",
|
||||
"This is a good indicator that the backpropagation of gradients through all of our 16 simulated steps is behaving correctly, and driving the solution in the right direction. This hints at how powerful this setup is: the gradient that we obtain from each of the simulation steps (and each operation within them) can easily be chained together into more complex sequences. Here, we're backpropagation through all 16 steps of the simulation, and we could easily enlarge this \"look-ahead\" of the optimization without any additional effort.\n",
|
||||
"\n",
|
||||
"A simple direct reconstruction problem like this one is always a good initial test for a DP solver, e.g., before moving to more complex setups like coupling it with an NN. If the direct optimization does not converge, there's probably still something fundamentally wrong, and there's no point involving an NN. \n",
|
||||
"\n",
|
||||
"Our Burgers example here looks good - before including an NN, let's address the performance issue so: here we've updated our solutoin via a gradient that is \"manually\" computed with multiple TF session run() calls. TF's own optimizers do this internally, more flexibly and more efficiently. Let's start over, and switch to a `tf.train.Optimizer()` instead."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"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.8.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
Reference in new issue
Block a user