This repository is the official code implementation of the paper, "MaxwellNet: Physics-driven deep neural network training based on Maxwell’s equations" by Joowon Lim and Demetri Psaltis. You can refer to the following materials for the details of implementation,
Also, we had an interview on this work,
The novelty of this work is to train a deep neural network, MaxwellNet, which solves Maxwell's equations using physics-driven loss. In other words, we are using the residual of Maxwell's equations as a loss function to train MaxwellNet, therefore, it does not require ground truth solutions to train it. Furthermore, we utilized MaxwellNet in a novel inverse design scheme, and we encourage you to refer to the main article for details.
What's New — Extended by Rashedul Albab
This fork introduces five backward-compatible enhancements to MaxwellNet, modernizing the architecture, training pipeline, and physics-informed regularization — all without breaking existing configurations or pre-trained checkpoints.
| # | Contribution | Highlights | Reference |
|---|---|---|---|
| 1 | Enhanced UNet | Residual blocks with 1×1 projections, configurable activations (SiLU / GELU / ReLU), and spatial attention gates on skip connections | Oktay et al., 2018 |
| 2 | Fourier Neural Operator | Drop-in FNO backbone with global spectral convolutions and O(N log N) complexity — ideal for long-range wave propagation | Li et al., ICLR 2021 |
| 3 | FiLM Conditioning | Physics-aware feature modulation via refractive index — per-channel γ and β adapt predictions to material properties | Perez et al., AAAI 2018 |
| 4 | Advanced Training | AdamW optimizer, cosine annealing, mixed-precision (AMP), gradient accumulation, and early stopping with configurable patience | — |
| 5 | Auxiliary Physics Losses | Sommerfeld radiation condition enforcement (scattered field decay) and second-order total variation smoothness regularization | — |
Key highlights:
- Fully backward-compatible — omit all new keys from
specs_maxwell.jsonand the original behavior is preserved exactly. - Mix-and-match — each feature is independently togglable (e.g., use FNO backbone without FiLM, or attention gates without residual connections).
- 48/48 unit & integration tests passing — see
test_contributions.pyfor the verification suite.
See the Extensions & Contributions section below for detailed documentation, configuration reference, and usage examples.
Our code is based on Windows 10, pytorch 1.7.1, CUDA 11.0, and python 3.7. We recommend using conda for installation.
conda env create --file environment.yaml
conda activate maxwellnet
python train_maxwellnet.py --directory <YOUR_DIRECTORY>
In <YOUR_DIRECTORY>, you need to have 'train.npz' which contains the training dataset and 'specs_maxwell.json' where you specify training parameters. A brief description of the parameters can be found below. I encourage you to read the supplementary material to understand the parameters.
| NetworkSpecs | Description |
|---|---|
| depth [int] | Depth of UNet. |
| filter [int] | Channel numbers in the first layer of UNet. |
| norm [str] | Type of normalization ('weight' for weight normalization, 'batch' for batch normalization, and 'no' for no normalization). |
| up_mode [str] | Upsample mode of UNet (either 'upcov' for transpose convolution or 'upsample' for upsampling). |
| PhysicalSpecs | Description |
|---|---|
| wavelength [float] | Wavelength in [um]. |
| dpl [int] | One pixel size is 'wavelength / dpl' [um]. |
| Nx [int] | Pixel number along the x-axis. This is equivalent to the pixel number along the x-axis of your scattering sample. |
| Nz [int] | Pixel number along the z-axis (light propagation direction). This is equivalent to the pixel number along the z-axis of your scattering sample. |
| pml_thickness [int] | Perfectly-matched-layer (PML) thickness in pixel number. 'pml_thickness * wavelength / dpl' is the actual thickness of PML layer in micrometers. |
| symmetry_x [bool] | If this is True, MaxwellNet will assume your input scattering sample is symmetric along the x-axis. For example, when given a sample whose Nx and Nz are 100 and 200, respectively, if this sample is symmetric along the x-axis, you can save only half of it (Nx=50, Nz=200) in your train file (train.npz) and set 'symmetry_x' as True. |
| mode [str] | 'te' or 'tm' (Transverse Electric or Transverse Magnetic). |
| high_order [str] | 'second' or 'fourth'. It decides which order (second or fourth order) to calculate the gradient. 'fourth' is more accurate than 'second'. |
Training for a single spheric lens.
If you just want to train a model for a single lens (which would be a good exercise as it runs for a short time), you can train MaxwellNet for a single spheric lens as followings,
- TE mode.
python train_maxwellnet.py --directory examples\spheric_te - TM mode.
python train_maxwellnet.py --directory examples\spheric_tm
Training for multiple lenses.
You can download the datasets of multiple lenses here. Download and place 'lens_te' and 'lens_tm' folders under 'examples' folder.
- Transverse Electric (TE) mode.
python train_maxwellnet.py --directory examples\lens_te - Transverse Magnetic (TM) mode.
python train_maxwellnet.py --directory examples\lens_tm
The above training cases take about 37 (TE mode) and 63 (TM mode) hours on V100, respectively.
If you want to check the solution found by MaxwellNet,
python solution_maxwellnet.py --directory <YOUR_DIRECTORY> --model_filename <YOUR_MODEL_FILENAME> --sample_filename <YOUR_SAMPLE_FILENAME>
It will provide the sample (<YOUR_SAMPLE_FILENAME> in <YOUR_DIRECTORY>) to the saved model (<YOUR_MODEL_FILENAME>) and return the solution found by MaxwellNet, and this output will be saved as an image in <YOUR_DIRECTORY> as you can see in the below examples.
If you want to calculate the solution found by MaxwellNet for the single spheric lenses (as trained above),
-
TE mode.
python solution_maxwellnet.py --directory examples\spheric_te --model_filename 250000_te_fourth.pt --sample_filename sample.npz -
TM mode.
python solution_maxwellnet.py --directory examples\spheric_tm --model_filename 250000_tm_fourth.pt --sample_filename sample.npzMode Result TE mode 
TM mode 
You can find the solutions for the multiple lens training cases similarly.
If you find our work useful in your research, please consider citing our paper:
@article{lim2022maxwellnet,
title={MaxwellNet: Physics-driven deep neural network training based on Maxwell’s equations},
author={Lim, Joowon and Psaltis, Demetri},
journal={APL Photonics},
volume={7},
number={1},
pages={011301},
year={2022},
publisher={AIP Publishing LLC}
}
We referred to the code from the following repo, UNet. We thank the authors for sharing their code.
Extended by Rashedul Albab
The following enhancements have been implemented on top of the original MaxwellNet framework. All new features are backward-compatible — the original configuration and pre-trained models continue to work without modification.
Three architectural improvements to the UNet backbone:
- Residual Connections: Skip connections within each convolutional block (
x + F(x)) with learned 1×1 projections for channel alignment. Addresses vanishing gradients in deep networks. [Huang et al., IEEE TNNLS 2025] - Configurable Activations: Support for SiLU (Swish), GELU, and ReLU in addition to the original CELU. SiLU provides smoother gradients for physics-informed training. [Farea & Celebi, arXiv 2025]
- Attention Gates: Spatial attention on skip connections in the decoder, allowing the network to focus on scattering-relevant regions. [Wu et al., ICML 2024 (Transolver)]
Expected Impact:
| Metric | Improvement |
|---|---|
| Convergence speed | Residual connections provide gradient highways — 2-5x faster convergence in deep configurations by mitigating vanishing gradients |
| Solution accuracy | Attention gates focus decoder capacity on scattering-relevant spatial regions instead of wasting capacity on free-space areas |
| Training stability | SiLU/GELU offer smoother gradient landscapes than CELU/ReLU — fewer loss spikes, more consistent training curves |
A drop-in replacement for UNet based on spectral operator learning. The FNO operates in spectral (Fourier) space, providing:
- Global receptive fields at every layer (critical for wave propagation) [Li et al., NeurIPS 2025]
- Resolution-invariant learning (the learned operator generalizes across grids) [DA-FNO, Optics Express 2025]
- O(N log N) efficiency via FFT-based convolutions [F-FNO, arXiv 2026]
Expected Impact:
| Metric | Improvement |
|---|---|
| Physical correctness | Electromagnetic waves are inherently global — a scatterer affects the field everywhere. FNO captures this via spectral convolutions at every layer, while UNet only builds global context at the bottleneck |
| Resolution generalization | Train on a 64x64 grid, inference on 256x256 — FNO learns the continuous operator, not grid-specific features |
| Computational efficiency | FFT-based convolutions are O(N log N) vs O(N^2) for large-kernel spatial convolutions with equivalent receptive fields |
Feature-wise Linear Modulation for physics-aware parameter conditioning. The refractive index value generates per-channel scale (gamma) and shift (beta) parameters that modulate the backbone output. Recently demonstrated in electromagnetic metasurface solvers [Chen et al., Science Advances 2025 (MetaChat)]:
output = gamma * features + beta
This allows the network to adapt its predictions based on material properties, improving generalization across different refractive indices. Initialized to identity (gamma=1, beta=0) for backward compatibility with pre-trained checkpoints.
Expected Impact:
| Metric | Improvement |
|---|---|
| Multi-material generalization | Without FiLM, the network treats all refractive indices identically. FiLM enables material-dependent response — a single model handles glass (n=1.5), silicon (n=3.5), and beyond |
| Sample efficiency | One FiLM-conditioned model generalizes across the refractive index range, eliminating the need for separate models per material |
| Inverse design | Provides smooth, differentiable dependence on material parameters — critical for gradient-based optimization over refractive index |
Modern optimization techniques for physics-informed training:
| Feature | Config Key | Options | Default | Reference |
|---|---|---|---|---|
| AdamW Optimizer | Optimizer |
"adam", "adamw" |
"adam" |
Morales-Brotons et al., arXiv 2025 |
| Weight Decay | WeightDecay |
float | 0 |
— |
| Cosine Annealing | Scheduler |
"step", "cosine" |
"step" |
Le Boudec et al., arXiv 2024 |
| Cosine Period | CosineT0 |
int | 5000 |
— |
| Early Stopping | EarlyStopping |
bool | false |
— |
| Patience | EarlyStoppingPatience |
int | 5000 |
— |
| Mixed Precision | MixedPrecision |
bool | false |
Khurana et al., arXiv 2025 |
| Gradient Accumulation | GradientAccumulation |
int | 1 |
— |
Expected Impact:
| Feature | Improvement |
|---|---|
| AdamW | Decouples weight decay from gradient updates — prevents overfitting to dominant Fourier modes, better generalization to unseen scatterers |
| Cosine annealing | Cyclical learning rate escapes sharp local minima — physics loss landscapes have many saddle points, warm restarts help find flatter, more physical solutions |
| Mixed precision (AMP) | ~2x faster training on GPU with FP16 compute, ~40% lower memory — enables larger batch sizes or deeper networks on the same hardware |
| Gradient accumulation | Simulates larger effective batch sizes on limited GPU memory — more stable gradient estimates for physics-informed loss |
| Early stopping | Prevents overtraining where the Maxwell residual decreases numerically but solution quality plateaus — saves compute time |
Two optional regularization losses that encode electromagnetic physics:
- Scattered Field Decay Loss (
EnergyLossWeight): Enforces the Sommerfeld radiation condition by penalizing scattered field magnitude at domain boundaries. Ensures proper PML absorption. [DC-PINNs, arXiv 2026] - Field Smoothness Loss (
SmoothnessLossWeight): Penalizes non-physical high-frequency oscillations via second-order total variation on the field envelope. [FD-Regularized PINNs, arXiv 2026]
Expected Impact:
| Loss | Improvement |
|---|---|
| Scattered field decay | Enforces the Sommerfeld radiation condition — scattered waves must propagate outward and be absorbed by PML. Prevents the network from exploiting non-physical standing wave solutions that minimize the PDE residual but are physically incorrect |
| Field smoothness | Electromagnetic fields vary smoothly on sub-wavelength scales. Suppresses checkerboard artifacts and high-frequency noise that may satisfy Maxwell's equations numerically but represent non-physical solutions |
| Aspect | Original MaxwellNet | Enhanced MaxwellNet |
|---|---|---|
| Backbone | UNet only | UNet or Fourier Neural Operator (FNO) |
| Receptive field | Local (progressive via pooling) | Global at every layer (spectral convolutions) |
| Material handling | One model per refractive index | Multi-material via FiLM conditioning |
| Skip connections | Concatenation only | Attention-gated + residual blocks |
| Optimizer | Adam + StepLR | AdamW + cosine annealing + AMP + early stopping |
| Loss function | PDE residual only | PDE + Sommerfeld radiation + smoothness regularization |
| Training speed | Baseline | ~2x faster with mixed precision |
| Resolution | Grid-specific | Resolution-invariant (FNO backbone) |
All new features are controlled via specs_maxwell.json:
{
"NetworkSpecs": {
"backbone": "unet",
"residual": true,
"activation": "silu",
"attention": true,
"film_conditioning": true,
"fno_modes": 12,
"fno_width": 32,
"fno_layers": 4
},
"Optimizer": "adamw",
"WeightDecay": 0.0001,
"Scheduler": "cosine",
"CosineT0": 5000,
"EarlyStopping": true,
"EarlyStoppingPatience": 10000,
"MixedPrecision": true,
"GradientAccumulation": 1,
"EnergyLossWeight": 0.01,
"SmoothnessLossWeight": 0.001
}See examples/spheric_te/specs_maxwell_enhanced.json for a complete working example with all features enabled.
