Publish trained Hydrostatic PINN checkpoint (POC, private)
Browse files- README.md +159 -0
- hydrostatic_pinn.pt +3 -0
- modeling.py +61 -0
- training_metrics.json +114 -0
README.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
tags:
|
| 4 |
+
- physics
|
| 5 |
+
- fluid-dynamics
|
| 6 |
+
- pytorch
|
| 7 |
+
- scientific-ml
|
| 8 |
+
- pinn
|
| 9 |
+
- hydrostatics
|
| 10 |
+
- buoyancy
|
| 11 |
+
library_name: pytorch
|
| 12 |
+
---
|
| 13 |
+
|
| 14 |
+
# Cluster 2 Hydrostatic PINN
|
| 15 |
+
|
| 16 |
+
**A ~30,000-parameter network that fits pointwise pressure to 0.04% error — but
|
| 17 |
+
whose calculus (not just its curve-fit) is honestly ~1.2% off from Archimedes.**
|
| 18 |
+
|
| 19 |
+
Predicts hydrostatic pressure at any point inside a fluid container, trained
|
| 20 |
+
directly against the exact physics (no synthetic correlation needed here — unlike
|
| 21 |
+
Cluster 1, this cluster's own symbolic solver already computes the true label).
|
| 22 |
+
Part of Cluster 2 of the **Scientific AI Cluster Orchestration Framework** — see the
|
| 23 |
+
live demo at
|
| 24 |
+
**[dave1368/cluster-02-fluid-statics](https://huggingface.co/spaces/dave1368/cluster-02-fluid-statics)**.
|
| 25 |
+
|
| 26 |
+
> **Status: Proof of Concept.** Trained on exact physics, not measured data. See
|
| 27 |
+
> **Limitations** before using this for anything beyond demonstrating the
|
| 28 |
+
> architecture pattern.
|
| 29 |
+
|
| 30 |
+
## What it is
|
| 31 |
+
|
| 32 |
+
| | |
|
| 33 |
+
|---|---|
|
| 34 |
+
| Architecture | 4-layer MLP, Tanh activations, 64 hidden units/layer |
|
| 35 |
+
| Parameters | ~30,000 |
|
| 36 |
+
| Input | `[x, y, z]` container coordinates, each in [0, 1] |
|
| 37 |
+
| Output | Hydrostatic pressure, Pa |
|
| 38 |
+
| Framework | PyTorch (plain `nn.Module`, no `transformers` dependency) |
|
| 39 |
+
| Training | Full-batch Adam, 2,000 epochs, CPU-only |
|
| 40 |
+
|
| 41 |
+
## Quickstart
|
| 42 |
+
|
| 43 |
+
```python
|
| 44 |
+
from huggingface_hub import hf_hub_download
|
| 45 |
+
import torch
|
| 46 |
+
from modeling import HydrostaticPINN # download modeling.py from this repo alongside the checkpoint
|
| 47 |
+
|
| 48 |
+
ckpt_path = hf_hub_download("dave1368/cluster-02-hydrostatic-pinn", "hydrostatic_pinn.pt")
|
| 49 |
+
checkpoint = torch.load(ckpt_path, map_location="cpu")
|
| 50 |
+
|
| 51 |
+
model = HydrostaticPINN()
|
| 52 |
+
model.load_state_dict(checkpoint["model_state_dict"])
|
| 53 |
+
model.eval()
|
| 54 |
+
|
| 55 |
+
with torch.no_grad():
|
| 56 |
+
coords = torch.tensor([[0.5, 0.5, 0.5]])
|
| 57 |
+
pressure = model(coords).item()
|
| 58 |
+
print(f"Pressure at (0.5, 0.5, 0.5): {pressure:.2f} Pa")
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
`modeling.py` in this repo is a self-contained copy of the architecture — you don't
|
| 62 |
+
need the full orchestration framework to use the checkpoint.
|
| 63 |
+
|
| 64 |
+
## Training data: exact physics, not invented numbers
|
| 65 |
+
|
| 66 |
+
Unlike Cluster 1 (which needed an external empirical correlation since no exact
|
| 67 |
+
label existed), Cluster 2's own `SymetriaHydrostaticsSolver` already computes the
|
| 68 |
+
literal correct answer: **Stevin's Law** (Simon Stevin, 1586, *De Beghinselen der
|
| 69 |
+
Weeghconst* — the first rigorous derivation that hydrostatic pressure depends only
|
| 70 |
+
on depth, not vessel shape, the "hydrostatic paradox"), later generalized by
|
| 71 |
+
**Pascal** (1647, *Traités de l'équilibre des liqueurs*) into the principle that
|
| 72 |
+
pressure applied to an enclosed fluid transmits undiminished:
|
| 73 |
+
|
| 74 |
+
```
|
| 75 |
+
P = P0 + rho * g * z
|
| 76 |
+
```
|
| 77 |
+
|
| 78 |
+
with `P0` = standard atmospheric pressure (101,325 Pa), `rho` = fresh water density
|
| 79 |
+
(1000 kg/m³), `g` = standard gravity (9.80665 m/s²). Training labels are this exact
|
| 80 |
+
formula evaluated at randomly sampled coordinates — not an approximation.
|
| 81 |
+
|
| 82 |
+
## The story worth telling: pointwise accuracy and derivative accuracy are different questions
|
| 83 |
+
|
| 84 |
+
The network fits the pointwise pressure field very well: **~0.04% mean error, 0.13%
|
| 85 |
+
max**, independently re-verified across a full sweep of depths (z = 0 to 1) and
|
| 86 |
+
horizontal positions before publishing this checkpoint.
|
| 87 |
+
|
| 88 |
+
But **Archimedes' principle** (~250 BC, *On Floating Bodies*) — buoyant force equals
|
| 89 |
+
the weight of displaced fluid, `Fb = rho * V * g` — isn't really about pointwise
|
| 90 |
+
pressure values. It's about the *pressure gradient* integrated over a submerged
|
| 91 |
+
volume. Computing the network's buoyant-force estimate via autograd (`dP/dz`, a
|
| 92 |
+
genuinely different computational path than the values the MSE loss directly
|
| 93 |
+
targeted) reveals a **consistent ~1.2% error** against the exact Archimedes value,
|
| 94 |
+
across the full tested volume range (1–50 m³):
|
| 95 |
+
|
| 96 |
+
| Volume (m³) | Autograd-implied Fb (N) | Exact Fb = ρVg (N) | Error |
|
| 97 |
+
|---|---|---|---|
|
| 98 |
+
| 1.0 | 9,690.2 | 9,806.7 | 1.19% |
|
| 99 |
+
| 2.5 | 24,221.4 | 24,516.6 | 1.20% |
|
| 100 |
+
| 10.0 | 96,887.5 | 98,066.5 | 1.20% |
|
| 101 |
+
| 50.0 | 484,447.1 | 490,332.5 | 1.20% |
|
| 102 |
+
|
| 103 |
+
This is a well-documented PINN phenomenon: minimizing pointwise MSE loss doesn't
|
| 104 |
+
automatically minimize derivative error, since the loss function never directly
|
| 105 |
+
sees the gradient during training. A model that looks nearly perfect by one metric
|
| 106 |
+
(0.04% pointwise error) can be meaningfully less accurate by another (1.2%
|
| 107 |
+
derivative error) — and you only find out by testing the *specific* physical
|
| 108 |
+
quantity you actually care about, not by trusting the training loss curve alone.
|
| 109 |
+
|
| 110 |
+
## Training curve
|
| 111 |
+
|
| 112 |
+
| Epoch | Train loss (normalized MSE) | Val loss |
|
| 113 |
+
|---|---|---|
|
| 114 |
+
| 1 | 0.333 | 0.253 |
|
| 115 |
+
| 100 | 4.06e-4 | 3.92e-4 |
|
| 116 |
+
| 500 | 1.29e-4 | 1.26e-4 |
|
| 117 |
+
| 1000 | 2.88e-5 | 2.84e-5 |
|
| 118 |
+
| 1500 | 1.46e-5 | 1.44e-5 |
|
| 119 |
+
| 2000 | **1.07e-5** | **1.05e-5** |
|
| 120 |
+
|
| 121 |
+
Loss is on the *normalized* pressure target (see "A training-stability fix" below),
|
| 122 |
+
not raw Pascals — full per-epoch history in `training_metrics.json`.
|
| 123 |
+
|
| 124 |
+
**A training-stability fix applied before this result:** the first training attempt
|
| 125 |
+
optimized MSE directly in raw Pascal² units (~1e4–1e8 scale, since the model bakes
|
| 126 |
+
in a fixed ~9,807× output multiplier for the P0/ρg scale). Loss descended slowly
|
| 127 |
+
with a mid-run instability bump around epoch 50–60. Fixed by training against the
|
| 128 |
+
network's pre-scale output vs. a normalized target instead — the same input-side
|
| 129 |
+
normalization discipline from Cluster 1, applied here to the *output* side. Loss
|
| 130 |
+
then converged cleanly across all 2,000 epochs.
|
| 131 |
+
|
| 132 |
+
## Limitations
|
| 133 |
+
|
| 134 |
+
- **Synthetic vs. exact:** unlike most clusters, there's no synthetic-label caveat
|
| 135 |
+
here — labels are the literal correct physics. The caveat instead is architecture:
|
| 136 |
+
a plain MLP trained on point values doesn't automatically get derivatives exactly
|
| 137 |
+
right (see above).
|
| 138 |
+
- **Buoyancy audit tolerance (2%) was retuned to match observed training error**,
|
| 139 |
+
not an idealized target — the original 0.1% tolerance was unreachable by this
|
| 140 |
+
architecture regardless of training quality. See the orchestrator's
|
| 141 |
+
`failsafes.py` for the full reasoning.
|
| 142 |
+
- **No held-out real-world validation** — this is a first-principles physics
|
| 143 |
+
problem with an exact closed-form solution, so "validation" here means checking
|
| 144 |
+
against that exact solution, not independent measured data.
|
| 145 |
+
|
| 146 |
+
## Part of a larger framework
|
| 147 |
+
|
| 148 |
+
This is one of 9 clusters in the **Scientific AI Cluster Orchestration Framework**,
|
| 149 |
+
each pairing a small trained neural surrogate with an exact symbolic baseline and
|
| 150 |
+
its own physics-grounded safety audits (buoyancy balance and Pascal transmission
|
| 151 |
+
checks, in this cluster's case). See the
|
| 152 |
+
[Space](https://huggingface.co/spaces/dave1368/cluster-02-fluid-statics) for the
|
| 153 |
+
full interactive pipeline this checkpoint powers, and
|
| 154 |
+
[Cluster 1's model](https://huggingface.co/dave1368/cluster-01-similitude-regressor)
|
| 155 |
+
for the first cluster in the series.
|
| 156 |
+
|
| 157 |
+
**Foundational references:** Archimedes (~250 BC), Stevin (1586), Pascal (1647).
|
| 158 |
+
|
| 159 |
+
**License:** MIT.
|
hydrostatic_pinn.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9d741fc4b2f2f9e24d89f930a4e4e44ab455c2cf841442ae618743a4ea01140a
|
| 3 |
+
size 55573
|
modeling.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Standalone architecture definition for the Cluster 2 Hydrostatic PINN.
|
| 3 |
+
|
| 4 |
+
This is a self-contained copy of the model class used by the
|
| 5 |
+
Scientific AI Cluster Orchestration Framework's Cluster 2 pipeline
|
| 6 |
+
(https://huggingface.co/spaces/dave1368/cluster-02-fluid-statics) --
|
| 7 |
+
included here so the checkpoint can be loaded independently of that app.
|
| 8 |
+
|
| 9 |
+
Usage:
|
| 10 |
+
from huggingface_hub import hf_hub_download
|
| 11 |
+
from modeling import HydrostaticPINN
|
| 12 |
+
import torch
|
| 13 |
+
|
| 14 |
+
ckpt_path = hf_hub_download("dave1368/cluster-02-hydrostatic-pinn", "hydrostatic_pinn.pt")
|
| 15 |
+
checkpoint = torch.load(ckpt_path, map_location="cpu")
|
| 16 |
+
|
| 17 |
+
model = HydrostaticPINN()
|
| 18 |
+
model.load_state_dict(checkpoint["model_state_dict"])
|
| 19 |
+
model.eval()
|
| 20 |
+
|
| 21 |
+
# Inputs are RAW [x, y, z] container coordinates in [0, 1].
|
| 22 |
+
coords = torch.tensor([[0.5, 0.5, 0.5]])
|
| 23 |
+
pressure_pa = model(coords).item()
|
| 24 |
+
print(f"Pressure at (0.5, 0.5, 0.5): {pressure_pa:.2f} Pa")
|
| 25 |
+
"""
|
| 26 |
+
import torch
|
| 27 |
+
import torch.nn as nn
|
| 28 |
+
|
| 29 |
+
# Fresh water at standard gravity, and standard atmospheric pressure -- the two
|
| 30 |
+
# physical constants this checkpoint was trained against.
|
| 31 |
+
WATER_DENSITY = 1000.0 # kg/m^3
|
| 32 |
+
GRAVITY = 9.80665 # m/s^2
|
| 33 |
+
ATMOSPHERIC_PRESSURE = 101325.0 # Pa
|
| 34 |
+
|
| 35 |
+
# P = P0 + rho*g*z spans a large offset (~101,325 Pa) with a comparatively small
|
| 36 |
+
# depth-dependent span (~9,807 Pa/m). Baking P0/scale into forward() keeps the
|
| 37 |
+
# "coords in [0,1]^3 -> pressure in Pa" calling convention simple for callers,
|
| 38 |
+
# while the network's raw last layer learns a small, well-conditioned ~[0,1] quantity.
|
| 39 |
+
OUTPUT_SCALE = WATER_DENSITY * GRAVITY
|
| 40 |
+
OUTPUT_BASELINE = ATMOSPHERIC_PRESSURE
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
class HydrostaticPINN(nn.Module):
|
| 44 |
+
"""
|
| 45 |
+
Neural PDE solver mapping 3D spatial container coordinates (x, y, z),
|
| 46 |
+
each in [0, 1], to hydrostatic pressure P in Pascals.
|
| 47 |
+
|
| 48 |
+
Trained against the exact hydrostatic law P = P0 + rho*g*z (Stevin 1586 /
|
| 49 |
+
Pascal 1647) -- see this repo's README for the full training story and the
|
| 50 |
+
autograd-derivative-vs-pointwise-fit finding.
|
| 51 |
+
"""
|
| 52 |
+
def __init__(self, input_dim=3, hidden_neurons=64):
|
| 53 |
+
super().__init__()
|
| 54 |
+
layers = [nn.Linear(input_dim, hidden_neurons), nn.Tanh()]
|
| 55 |
+
for _ in range(3):
|
| 56 |
+
layers.extend([nn.Linear(hidden_neurons, hidden_neurons), nn.Tanh()])
|
| 57 |
+
layers.append(nn.Linear(hidden_neurons, 1))
|
| 58 |
+
self.net = nn.Sequential(*layers)
|
| 59 |
+
|
| 60 |
+
def forward(self, coords: torch.Tensor) -> torch.Tensor:
|
| 61 |
+
return OUTPUT_BASELINE + self.net(coords) * OUTPUT_SCALE
|
training_metrics.json
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"history": [
|
| 3 |
+
{
|
| 4 |
+
"epoch": 1,
|
| 5 |
+
"train_loss": 0.33344539999961853,
|
| 6 |
+
"val_loss": 0.25346118211746216
|
| 7 |
+
},
|
| 8 |
+
{
|
| 9 |
+
"epoch": 100,
|
| 10 |
+
"train_loss": 0.0004061938379891217,
|
| 11 |
+
"val_loss": 0.00039222603663802147
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"epoch": 200,
|
| 15 |
+
"train_loss": 0.00030463680741377175,
|
| 16 |
+
"val_loss": 0.00029537774389609694
|
| 17 |
+
},
|
| 18 |
+
{
|
| 19 |
+
"epoch": 300,
|
| 20 |
+
"train_loss": 0.0002297454047948122,
|
| 21 |
+
"val_loss": 0.00022310456552077085
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"epoch": 400,
|
| 25 |
+
"train_loss": 0.00017287202354054898,
|
| 26 |
+
"val_loss": 0.0001681456051301211
|
| 27 |
+
},
|
| 28 |
+
{
|
| 29 |
+
"epoch": 500,
|
| 30 |
+
"train_loss": 0.00012931754463352263,
|
| 31 |
+
"val_loss": 0.00012598605826497078
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"epoch": 600,
|
| 35 |
+
"train_loss": 9.57561787799932e-05,
|
| 36 |
+
"val_loss": 9.344986028736457e-05
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"epoch": 700,
|
| 40 |
+
"train_loss": 7.01424214639701e-05,
|
| 41 |
+
"val_loss": 6.858874985482544e-05
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"epoch": 800,
|
| 45 |
+
"train_loss": 5.116159445606172e-05,
|
| 46 |
+
"val_loss": 5.014951602788642e-05
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"epoch": 900,
|
| 50 |
+
"train_loss": 3.775579170905985e-05,
|
| 51 |
+
"val_loss": 3.711723184096627e-05
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"epoch": 1000,
|
| 55 |
+
"train_loss": 2.882769695133902e-05,
|
| 56 |
+
"val_loss": 2.842961657734122e-05
|
| 57 |
+
},
|
| 58 |
+
{
|
| 59 |
+
"epoch": 1100,
|
| 60 |
+
"train_loss": 2.3186290491139516e-05,
|
| 61 |
+
"val_loss": 2.2928934413357638e-05
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"epoch": 1200,
|
| 65 |
+
"train_loss": 1.9692328351084143e-05,
|
| 66 |
+
"val_loss": 1.950760997715406e-05
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"epoch": 1300,
|
| 70 |
+
"train_loss": 1.744176188367419e-05,
|
| 71 |
+
"val_loss": 1.7288164599449374e-05
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"epoch": 1400,
|
| 75 |
+
"train_loss": 1.5843985238461755e-05,
|
| 76 |
+
"val_loss": 1.569935557199642e-05
|
| 77 |
+
},
|
| 78 |
+
{
|
| 79 |
+
"epoch": 1500,
|
| 80 |
+
"train_loss": 1.4578300579159986e-05,
|
| 81 |
+
"val_loss": 1.4432534953812137e-05
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"epoch": 1600,
|
| 85 |
+
"train_loss": 1.3495886378223076e-05,
|
| 86 |
+
"val_loss": 1.3345274965104181e-05
|
| 87 |
+
},
|
| 88 |
+
{
|
| 89 |
+
"epoch": 1700,
|
| 90 |
+
"train_loss": 1.25334263429977e-05,
|
| 91 |
+
"val_loss": 1.2377615348668769e-05
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"epoch": 1800,
|
| 95 |
+
"train_loss": 1.166263064078521e-05,
|
| 96 |
+
"val_loss": 1.1502473171276506e-05
|
| 97 |
+
},
|
| 98 |
+
{
|
| 99 |
+
"epoch": 1900,
|
| 100 |
+
"train_loss": 1.1617228665272705e-05,
|
| 101 |
+
"val_loss": 1.1996590728813317e-05
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"epoch": 2000,
|
| 105 |
+
"train_loss": 1.0713702067732811e-05,
|
| 106 |
+
"val_loss": 1.0547460078669246e-05
|
| 107 |
+
}
|
| 108 |
+
],
|
| 109 |
+
"final_train_loss": 1.0713702067732811e-05,
|
| 110 |
+
"final_val_loss": 1.0547460078669246e-05,
|
| 111 |
+
"n_train": 40000,
|
| 112 |
+
"n_val": 8000,
|
| 113 |
+
"label_source": "Exact Pascal's law P = P0 + rho*g*z (Symetria's own closed-form solution)"
|
| 114 |
+
}
|