Multigrid Neural Network implemented in PyTorch
Project description
MGNet
MultiGrid Methods + Neural Networks = MgNet
tl;dr
MultiGrid methods cool. Repository implements paper with pytorch.
Usage
from mgnet.model import mgnet, MGNet
import torch
supported_smoothers = MGNet.supported_smoothers()
print(f'{supported_smoothers=}')
n_image_chan = 3
batch_size = 1
image_width = 28
image_height = 28
model = mgnet(smoother=supported_smoothers[0],
pretrained=False,
progress=False,
in_channels=n_image_chan,
n_chan_u=128,
n_chan_f=128,
n_classes=10,
n_iter=[2,2,2,2]
)
x = torch.rand((batch_size, n_image_chan, image_width, image_height))
y = model(x)
print(f'{y=}')
Background
I first came up with the idea of using multigrid methods in deep learning after attending the seminar algebraic multigrid, in which we studied the publication by Jinchao Xu and Ludmil Zikatanov.
If multigrid methods are one of the fastest solvers for partial differential equality problems by use of grids, then knowing that images are functions on grids, multigrid methods can be used in machine learning, especially in FNNs and CNNs ...
i thought. Unfortunately, Sir Xu beat me up to the idea and published a paper 2 years before.
As I couldn't find a ready-to-use implementation of the paper, the work in this repository came to be.
Theory of operation
This type of network generalizes multiple preexisting models like the famous ResNet and DenseNet into a single configurable system.
The premise is built upon the idea of multigrid: the solution u is smoothened and
its errors are projected on layers of various sizes.
A single step consists of three phases:
- Relaxation: Given a smooth
S, the solution of the problemuis computed usingS(u) = fseveral time, to obtain an improved solutionv. The residuum of the equation is computedr = f - S(v) - Restriction: the residuum
ris transferred on a layer of lower size and the approximation of the errorA_{r}e_{r} = ris computed - Prolongation or interpolation: the error
eis projected back on the original layerA_{p}e_{r} = r_{p}and the original solution updated:v = v + e_{r}
---
title: Basic multigrid
---
flowchart TD;
s[Start: v<sup>h</sup> = 0] --> v1
subgraph "Relaxation"
v1["Solve: S<sup>h</sup> * u<sup>h</sup> = f<sup>h</sup>"]--> v["Compute residuum: r = f - S * v"]
end
subgraph Restriction
v["Compute residuum: r<sup>h</sup> = f<sup>h</sup> - S<sup>h</sup>v<sup>h</sup>"] --> r1
r1["Project residuum on coarse layer: G<sup>2h</sup>: r<sup>2h</sup>"] --> r2
end
subgraph Prolongation
r2["Compute error: S<sup>2h</sup> * e<sup>2h</sup>= r<sup>2h</sup>"] --> r3
end
r3["Project error on finer layer: G<sup>h</sup>: e<sup>h</sup>"] --> p1["Updated solution: v<sup>h</sub> = v<sup>h</sub> + e<sup>h</sub>"]
Testing
Local:
Install dependencies:
uv sync --dev
Run inference test (default values already set. Use --help option for help):
PYTHONPATH="${PYTHONPATH}:${PWD}" uv run tests/test_inference.py
Docker:
Build image:
docker build . -t mgnet
Run image in container:
docker run mgnet --help
Literatur
- "Algebraic Multigrid Methods", Jinchao Xu, Ludmil T Zikatanov
- "MgNet: A Unified Framework of Multigrid and Convolutional Neural Network", Juncai He, Jinchao Xu
- "Iterative Solution of Large Sparse Systems of Equations", Wolfgang Hackbusch
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mgnet-0.1.2.tar.gz.
File metadata
- Download URL: mgnet-0.1.2.tar.gz
- Upload date:
- Size: 6.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"20.04","id":"focal","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c15a9db7b5d8b40406d4b1b3f148ef8a62541eb2acbce15616ba67612c8420ae
|
|
| MD5 |
884affa9950ac69d549f419af93ceeb9
|
|
| BLAKE2b-256 |
8144dd4ca49d2a84913689924fd5a2a1a5de63328209dd4def57e9597ddcac63
|
File details
Details for the file mgnet-0.1.2-py3-none-any.whl.
File metadata
- Download URL: mgnet-0.1.2-py3-none-any.whl
- Upload date:
- Size: 7.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"20.04","id":"focal","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd9a31aa1957315dafcd88580fc9a5c836b379512a3558b1b6048e094e8e682a
|
|
| MD5 |
348008c924de8f93430878450934a43d
|
|
| BLAKE2b-256 |
1b1307118f505dbd97c06d3c00e1d58d63f8e267ea9114484ded97f5f193416c
|