Skip to main content

A Scalable Deep Learning Framework for Wave-Based Inverse Problems

Project description

WaveDL Logo

A Scalable Deep Learning Framework for Wave-Based Inverse Problems

Python 3.11+ PyTorch 2.x Accelerate
Tests Lint Try it on Colab
License: MIT DOI

Production-ready • Multi-GPU DDP • Memory-Efficient • Plug-and-Play

Getting StartedDocumentationExamplesDiscussionsCitation


Plug in your model, load your data, and let WaveDL do the heavy lifting 💪


💡 What is WaveDL?

WaveDL is a deep learning framework built for wave-based inverse problems — from ultrasonic NDE and geophysics to biomedical tissue characterization. It provides a robust, scalable training pipeline for mapping multi-dimensional data (1D/2D/3D) to physical quantities.

Input: Waveforms, spectrograms, B-scans, dispersion curves, ...
   ↓
Output: Material properties, defect dimensions, damage locations, ...

The framework handles the engineering challenges of large-scale deep learning — big datasets, distributed training, and HPC deployment — so you can focus on the science, not the infrastructure.

Built for researchers who need:

  • 📊 Multi-target regression with reproducibility and fair benchmarking
  • 🚀 Seamless multi-GPU training on HPC clusters
  • 💾 Memory-efficient handling of large-scale datasets
  • 🔧 Easy integration of custom model architectures

✨ Features

⚡ Load All Data — No More Bottleneck

Train on datasets larger than RAM:

  • Memory-mapped, zero-copy streaming
  • Full random shuffling at GPU speed
  • Your GPU stays fed — always

🧠 One-Line Model Registration

Plug in any architecture:

@register_model("my_net")
class MyNet(BaseModel): ...

Design your model. Register with one line.

🛡️ DDP That Actually Works

Multi-GPU training without the pain:

  • Synchronized early stopping
  • Deadlock-free checkpointing
  • Correct metric aggregation

📊 Publish-Ready Output

Results go straight to your paper:

  • 11 diagnostic plots with LaTeX styling
  • Multi-format export (PNG, PDF, SVG, ...)
  • MAE in physical units per parameter

🖥️ HPC-Native Design

Built for high-performance clusters:

  • Automatic GPU detection
  • WandB experiment tracking
  • BF16/FP16 mixed precision

🔄 Crash-Proof Training

Never lose your progress:

  • Full state checkpoints
  • Resume from any point
  • Emergency saves on interrupt

🎛️ Flexible & Reproducible Training

Fully configurable via CLI flags or YAML:

  • Loss functions, optimizers, schedulers
  • K-fold cross-validation
  • See Configuration for details

📦 ONNX Export

Deploy models anywhere:

  • One-command export to ONNX
  • LabVIEW, MATLAB, C++ compatible
  • Validated PyTorch↔ONNX outputs

🚀 Getting Started

Installation

git clone https://github.com/ductho-le/WaveDL.git
cd WaveDL

# Basic install (training + inference)
pip install -e .

# Full install (adds ONNX export, torch.compile, HPO, dev tools)
pip install -e ".[all]"

[!NOTE] Dependencies are managed in pyproject.toml. Python 3.11+ required.

For development setup (running tests, contributing), see CONTRIBUTING.md.

Quick Start

[!TIP] In all examples below, replace <...> placeholders with your values. See Configuration for defaults and options.

Option 1: Using the Helper Script (Recommended for HPC)

The run_training.sh wrapper automatically configures the environment for HPC systems:

# Make executable (first time only)
chmod +x run_training.sh

# Basic training (auto-detects available GPUs)
./run_training.sh --model <model_name> --data_path <train_data> --batch_size <number> --output_dir <output_folder>

# Detailed configuration
./run_training.sh --model <model_name> --data_path <train_data> --batch_size <number> \
  --lr <number> --epochs <number> --patience <number> --compile --output_dir <output_folder>

Option 2: Direct Accelerate Launch

# Local - auto-detects GPUs
accelerate launch -m wavedl.train --model <model_name> --data_path <train_data> --batch_size <number> --output_dir <output_folder>

# Resume training (automatic - just re-run with same output_dir)
# Manual resume from specific checkpoint:
accelerate launch -m wavedl.train --model <model_name> --data_path <train_data> --resume <checkpoint_folder> --output_dir <output_folder>

# Force fresh start (ignores existing checkpoints)
accelerate launch -m wavedl.train --model <model_name> --data_path <train_data> --output_dir <output_folder> --fresh

# List available models
python -m wavedl.train --list_models

[!TIP] Auto-Resume: If training crashes or is interrupted, simply re-run with the same --output_dir. The framework automatically detects incomplete training and resumes from the last checkpoint. Use --fresh to force a fresh start.

GPU Auto-Detection: By default, run_training.sh automatically detects available GPUs using nvidia-smi. Set NUM_GPUS to override this behavior.

Testing & Inference

After training, use wavedl.test to evaluate your model on test data:

# Basic inference
python -m wavedl.test --checkpoint <checkpoint_folder> --data_path <test_data>

# With visualization, CSV export, and multiple file formats
python -m wavedl.test --checkpoint <checkpoint_folder> --data_path <test_data> \
  --plot --plot_format png pdf --save_predictions --output_dir <output_folder>

# With custom parameter names
python -m wavedl.test --checkpoint <checkpoint_folder> --data_path <test_data> \
  --param_names '$p_1$' '$p_2$' '$p_3$' --plot

# Export model to ONNX for deployment (LabVIEW, MATLAB, C++, etc.)
python -m wavedl.test --checkpoint <checkpoint_folder> --data_path <test_data> \
  --export onnx --export_path <output_file.onnx>

Output:

  • Console: R², Pearson correlation, MAE per parameter
  • CSV (with --save_predictions): True, predicted, error, and absolute error for all parameters
  • Plots (with --plot): 10 publication-quality plots (scatter, histogram, residuals, Bland-Altman, Q-Q, correlation, relative error, CDF, index plot, box plot)
  • Format (with --plot_format): Supported formats: png (default), pdf (vector), svg (vector), eps (LaTeX), tiff, jpg, ps

[!NOTE] wavedl.test auto-detects the model architecture from checkpoint metadata. If unavailable, it falls back to folder name parsing. Use --model to override if needed.


📁 Project Structure

WaveDL/
├── src/
│   └── wavedl/                # Main package (namespaced)
│       ├── __init__.py        # Package init with __version__
│       ├── train.py           # Training entry point
│       ├── test.py            # Testing & inference script
│       ├── hpo.py             # Hyperparameter optimization
│       │
│       ├── models/            # Model architectures
│       │   ├── registry.py    # Model factory (@register_model)
│       │   ├── base.py        # Abstract base class
│       │   ├── cnn.py         # Baseline CNN
│       │   ├── resnet.py      # ResNet-18/34/50 (1D/2D/3D)
│       │   ├── efficientnet.py# EfficientNet-B0/B1/B2
│       │   ├── vit.py         # Vision Transformer (1D/2D)
│       │   ├── convnext.py    # ConvNeXt (1D/2D/3D)
│       │   ├── densenet.py    # DenseNet-121/169 (1D/2D/3D)
│       │   └── unet.py        # U-Net / U-Net Regression
│       │
│       └── utils/             # Utilities
│           ├── data.py        # Memory-mapped data pipeline
│           ├── metrics.py     # R², Pearson, visualization
│           ├── distributed.py # DDP synchronization
│           ├── losses.py      # Loss function factory
│           ├── optimizers.py  # Optimizer factory
│           ├── schedulers.py  # LR scheduler factory
│           └── config.py      # YAML configuration support
│
├── run_training.sh            # HPC helper script
├── configs/                   # YAML config templates
├── examples/                  # Ready-to-run examples
├── notebooks/                 # Jupyter notebooks
├── unit_tests/                # Pytest test suite (422 tests)
│
├── pyproject.toml             # Package config, dependencies
├── CHANGELOG.md               # Version history
└── CITATION.cff               # Citation metadata

⚙️ Configuration

[!NOTE] All configuration options below work with both run_training.sh and direct accelerate launch. The wrapper script passes all arguments directly to train.py.

Examples:

# Using run_training.sh
./run_training.sh --model cnn --batch_size 256 --lr 5e-4 --compile

# Using accelerate launch directly
accelerate launch -m wavedl.train --model cnn --batch_size 256 --lr 5e-4 --compile
Available Models — 21 pre-built architectures
Model Best For Params (2D) Dimensionality
cnn Baseline, lightweight 1.7M 1D/2D/3D
resnet18 Fast training, smaller datasets 11.4M 1D/2D/3D
resnet34 Balanced performance 21.5M 1D/2D/3D
resnet50 High capacity, complex patterns 24.6M 1D/2D/3D
resnet18_pretrained Transfer learning 11.4M 2D only
resnet50_pretrained Transfer learning 24.6M 2D only
efficientnet_b0 Efficient, pretrained 4.7M 2D only
efficientnet_b1 Efficient, pretrained 7.2M 2D only
efficientnet_b2 Efficient, pretrained 8.4M 2D only
vit_tiny Transformer, small datasets 5.4M 1D/2D
vit_small Transformer, balanced 21.5M 1D/2D
vit_base Transformer, high capacity 85.5M 1D/2D
convnext_tiny Modern CNN, transformer-inspired 28.2M 1D/2D/3D
convnext_tiny_pretrained Transfer learning 28.2M 2D only
convnext_small Modern CNN, balanced 49.8M 1D/2D/3D
convnext_base Modern CNN, high capacity 88.1M 1D/2D/3D
densenet121 Feature reuse, small data 7.5M 1D/2D/3D
densenet121_pretrained Transfer learning 7.5M 2D only
densenet169 Deeper DenseNet 13.3M 1D/2D/3D
unet Spatial output (velocity fields) 31.0M 1D/2D/3D
unet_regression Multi-scale features for regression 31.1M 1D/2D/3D

Pretrained models use ImageNet weights for transfer learning.

Training Parameters
Argument Default Description
--model cnn Model architecture
--batch_size 128 Per-GPU batch size
--lr 1e-3 Learning rate
--epochs 1000 Maximum epochs
--patience 20 Early stopping patience
--weight_decay 1e-4 AdamW regularization
--grad_clip 1.0 Gradient clipping
Data & I/O
Argument Default Description
--data_path train_data.npz Dataset path
--workers -1 DataLoader workers per GPU (-1=auto-detect)
--seed 2025 Random seed
--output_dir . Output directory for checkpoints
--resume None Checkpoint to resume (auto-detected if not set)
--save_every 50 Checkpoint frequency
--fresh False Force fresh training, ignore existing checkpoints
--single_channel False Confirm data is single-channel (for shallow 3D volumes like (8, 128, 128))
Performance
Argument Default Description
--compile False Enable torch.compile
--precision bf16 Mixed precision mode (bf16, fp16, no)
--wandb False Enable W&B logging
--project_name DL-Training W&B project name
--run_name None W&B run name (auto-generated if not set)
Environment Variables (run_training.sh)
Variable Default Description
NUM_GPUS Auto-detected Number of GPUs to use. By default, automatically detected via nvidia-smi. Set explicitly to override (e.g., NUM_GPUS=2)
NUM_MACHINES 1 Number of machines in distributed setup
MIXED_PRECISION bf16 Precision mode: bf16, fp16, or no
DYNAMO_BACKEND no PyTorch Dynamo backend
WANDB_MODE offline WandB mode: offline or online
Loss Functions
Loss Flag Best For Notes
mse --loss mse Default, smooth gradients Standard Mean Squared Error
mae --loss mae Outlier-robust, linear penalty Mean Absolute Error (L1)
huber --loss huber --huber_delta 1.0 Best of MSE + MAE Robust, smooth transition
smooth_l1 --loss smooth_l1 Similar to Huber PyTorch native implementation
log_cosh --loss log_cosh Smooth approximation to MAE Differentiable everywhere
weighted_mse --loss weighted_mse --loss_weights "2.0,1.0,1.0" Prioritize specific targets Per-target weighting

Example:

# Use Huber loss for noisy NDE data
accelerate launch -m wavedl.train --model cnn --loss huber --huber_delta 0.5

# Weighted MSE: prioritize thickness (first target)
accelerate launch -m wavedl.train --model cnn --loss weighted_mse --loss_weights "2.0,1.0,1.0"
Optimizers
Optimizer Flag Best For Key Parameters
adamw --optimizer adamw Default, most cases --betas "0.9,0.999"
adam --optimizer adam Legacy compatibility --betas "0.9,0.999"
sgd --optimizer sgd Better generalization --momentum 0.9 --nesterov
nadam --optimizer nadam Adam + Nesterov Faster convergence
radam --optimizer radam Variance-adaptive More stable training
rmsprop --optimizer rmsprop RNN/LSTM models --momentum 0.9

Example:

# SGD with Nesterov momentum (often better generalization)
accelerate launch -m wavedl.train --model cnn --optimizer sgd --lr 0.01 --momentum 0.9 --nesterov

# RAdam for more stable training
accelerate launch -m wavedl.train --model cnn --optimizer radam --lr 1e-3
Learning Rate Schedulers
Scheduler Flag Best For Key Parameters
plateau --scheduler plateau Default, adaptive --scheduler_patience 10 --scheduler_factor 0.5
cosine --scheduler cosine Long training, smooth decay --min_lr 1e-6
cosine_restarts --scheduler cosine_restarts Escape local minima Warm restarts
onecycle --scheduler onecycle Fast convergence Super-convergence
step --scheduler step Simple decay --step_size 30 --scheduler_factor 0.1
multistep --scheduler multistep Custom milestones --milestones "30,60,90"
exponential --scheduler exponential Continuous decay --scheduler_factor 0.95
linear_warmup --scheduler linear_warmup Warmup phase --warmup_epochs 5

Example:

# Cosine annealing for 1000 epochs
accelerate launch -m wavedl.train --model cnn --scheduler cosine --epochs 1000 --min_lr 1e-7

# OneCycleLR for super-convergence
accelerate launch -m wavedl.train --model cnn --scheduler onecycle --lr 1e-2 --epochs 50

# MultiStep with custom milestones
accelerate launch -m wavedl.train --model cnn --scheduler multistep --milestones "100,200,300"
Cross-Validation

For robust model evaluation, simply add the --cv flag:

# 5-fold cross-validation (works with both methods!)
./run_training.sh --model cnn --cv 5 --data_path train_data.npz
# OR
accelerate launch -m wavedl.train --model cnn --cv 5 --data_path train_data.npz

# Stratified CV (recommended for unbalanced data)
./run_training.sh --model cnn --cv 5 --cv_stratify --loss huber --epochs 100

# Full configuration
./run_training.sh --model cnn --cv 5 --cv_stratify \
    --loss huber --optimizer adamw --scheduler cosine \
    --output_dir ./cv_results
Argument Default Description
--cv 0 Number of CV folds (0=disabled, normal training)
--cv_stratify False Use stratified splitting (bins targets)
--cv_bins 10 Number of bins for stratified CV

Output:

  • cv_summary.json: Aggregated metrics (mean ± std)
  • cv_results.csv: Per-fold detailed results
  • fold_*/: Individual fold models and scalers
Configuration Files (YAML)

Use YAML files for reproducible experiments. CLI arguments can override any config value.

# Use a config file
accelerate launch -m wavedl.train --config configs/config.yaml --data_path train.npz

# Override specific values from config
accelerate launch -m wavedl.train --config configs/config.yaml --lr 5e-4 --epochs 500

Example config (configs/config.yaml):

# Model & Training
model: cnn
batch_size: 128
lr: 0.001
epochs: 1000
patience: 20

# Loss, Optimizer, Scheduler
loss: mse
optimizer: adamw
scheduler: plateau

# Cross-Validation (0 = disabled)
cv: 0

# Performance
precision: bf16
compile: false
seed: 2025

[!TIP] See configs/config.yaml for the complete template with all available options documented.

Hyperparameter Search (HPO)

Automatically find the best training configuration using Optuna.

Step 1: Install

pip install -e ".[hpo]"

Step 2: Run HPO

You specify which models to search and how many trials to run:

# Search 3 models with 100 trials
python -m wavedl.hpo --data_path train.npz --models cnn resnet18 efficientnet_b0 --n_trials 100

# Search 1 model (faster)
python -m wavedl.hpo --data_path train.npz --models cnn --n_trials 50

# Search all your candidate models
python -m wavedl.hpo --data_path train.npz --models cnn resnet18 resnet50 vit_small densenet121 --n_trials 200

Step 3: Train with best parameters

After HPO completes, it prints the optimal command:

accelerate launch -m wavedl.train --data_path train.npz --model cnn --lr 3.2e-4 --batch_size 128 ...

What Gets Searched:

Parameter Default You Can Override With
Models cnn, resnet18, resnet34 --models X Y Z
Optimizers all 6 --optimizers X Y
Schedulers all 8 --schedulers X Y
Losses all 6 --losses X Y
Learning rate 1e-5 → 1e-2 (always searched)
Batch size 64, 128, 256, 512 (always searched)

Quick Mode (--quick):

  • Uses minimal defaults: cnn + adamw + plateau + mse
  • Faster for testing your setup before running full search
  • You can still override any option with the flags above

All Arguments:

Argument Default Description
--data_path (required) Training data file
--models 3 defaults Models to search (specify any number)
--n_trials 50 Number of trials to run
--quick False Use minimal defaults (faster)
--optimizers all 6 Optimizers to search
--schedulers all 8 Schedulers to search
--losses all 6 Losses to search
--n_jobs 1 Parallel trials (multi-GPU)
--max_epochs 50 Max epochs per trial
--output hpo_results.json Output file

[!TIP] See Available Models for all 21 architectures you can search.


📈 Data Preparation

WaveDL supports multiple data formats for training and inference:

Format Extension Key Advantages
NPZ .npz Native NumPy, fast loading, recommended
HDF5 .h5, .hdf5 Large datasets, hierarchical, cross-platform
MAT .mat MATLAB compatibility (v7.3+ only, saved with -v7.3 flag)

The framework automatically detects file format and data dimensionality (1D, 2D, or 3D) — you only need to provide the appropriate model architecture.

Key Shape Type Description
input_train / input_test (N, L), (N, H, W), or (N, D, H, W) float32 N samples of 1D/2D/3D representations
output_train / output_test (N, T) float32 N samples with T regression targets

[!TIP]

  • Flexible Key Names: WaveDL auto-detects common key pairs:
    • input_train/output_train, input_test/output_test (WaveDL standard)
    • X/Y, x/y (ML convention)
    • data/labels, inputs/outputs, features/targets
  • Automatic Dimension Detection: Channel dimension is added automatically. No manual reshaping required!
  • Sparse Matrix Support: NPZ and MAT v7.3 files with scipy/MATLAB sparse matrices are automatically converted to dense arrays.
  • Auto-Normalization: Target values are automatically standardized during training. MAE is reported in original physical units.

[!IMPORTANT] MATLAB Users: MAT files must be saved with the -v7.3 flag for memory-efficient loading:

save('data.mat', 'input_train', 'output_train', '-v7.3')

Older MAT formats (v5/v7) are not supported. Convert to NPZ for best compatibility.

Example: Basic Preparation
import numpy as np

X = np.array(images, dtype=np.float32)  # (N, H, W)
y = np.array(labels, dtype=np.float32)  # (N, T)

np.savez('train_data.npz', input_train=X, output_train=y)
Example: From Image Files + CSV
import numpy as np
from PIL import Image
from pathlib import Path
import pandas as pd

# Load images
images = [np.array(Image.open(f).convert('L'), dtype=np.float32)
          for f in sorted(Path("images/").glob("*.png"))]
X = np.stack(images)

# Load labels
y = pd.read_csv("labels.csv").values.astype(np.float32)

np.savez('train_data.npz', input_train=X, output_train=y)
Example: From MATLAB (.mat)
import numpy as np
from scipy.io import loadmat

data = loadmat('simulation_data.mat')
X = data['spectrograms'].astype(np.float32)  # Adjust key
y = data['parameters'].astype(np.float32)

# Transpose if needed: (H, W, N) → (N, H, W)
if X.ndim == 3 and X.shape[2] < X.shape[0]:
    X = np.transpose(X, (2, 0, 1))

np.savez('train_data.npz', input_train=X, output_train=y)
Example: Synthetic Test Data
import numpy as np

X = np.random.randn(1000, 256, 256).astype(np.float32)
y = np.random.randn(1000, 5).astype(np.float32)

np.savez('test_data.npz', input_train=X, output_train=y)
Validation Script
import numpy as np

data = np.load('train_data.npz')
assert data['input_train'].ndim == 3, "Input must be 3D: (N, H, W)"
assert data['output_train'].ndim == 2, "Output must be 2D: (N, T)"
assert len(data['input_train']) == len(data['output_train']), "Sample mismatch"

print(f"✓ Input:  {data['input_train'].shape} {data['input_train'].dtype}")
print(f"✓ Output: {data['output_train'].shape} {data['output_train'].dtype}")

📦 Examples Try it on Colab

The examples/ folder contains a complete, ready-to-run example for material characterization of isotropic plates. The pre-trained CNN predicts three physical parameters from Lamb wave dispersion curves:

Parameter Unit Description
h mm Plate thickness
√(E/ρ) km/s Square root of Young's modulus over density
ν Poisson's ratio

[!NOTE] This example is based on our paper at SPIE Smart Structures + NDE 2026: "Deep learning-based ultrasonic assessment of plate thickness and elasticity" (Paper 13951-4, to appear).

Try it yourself:

# Run inference on the example data
python -m wavedl.test --checkpoint ./examples/elastic_cnn_example/best_checkpoint \
  --data_path ./examples/elastic_cnn_example/Test_data_100.mat \
  --plot --save_predictions --output_dir ./examples/elastic_cnn_example/test_results

# Export to ONNX (already included as model.onnx)
python -m wavedl.test --checkpoint ./examples/elastic_cnn_example/best_checkpoint \
  --data_path ./examples/elastic_cnn_example/Test_data_100.mat \
  --export onnx --export_path ./examples/elastic_cnn_example/model.onnx

What's Included:

File Description
best_checkpoint/ Pre-trained CNN checkpoint
Test_data_100.mat 100 sample test set (500×500 dispersion curves → h, √(E/ρ), ν)
model.onnx ONNX export with embedded de-normalization
training_history.csv Epoch-by-epoch training metrics (loss, R², LR, etc.)
training_curves.png Training/validation loss and learning rate plot
test_results/ Example predictions and diagnostic plots
WaveDL_ONNX_Inference.m MATLAB script for ONNX inference

Training Progress:

Training curves
Training and validation loss over 162 epochs with learning rate schedule

Inference Results:

Scatter plot
Figure 1: Predictions vs ground truth for all three elastic parameters

Error histogram
Figure 2: Distribution of prediction errors showing near-zero mean bias

Residual plot
Figure 3: Residuals vs predicted values (no heteroscedasticity detected)

Bland-Altman plot
Figure 4: Bland-Altman analysis with ±1.96 SD limits of agreement

Q-Q plot
Figure 5: Q-Q plots confirming normally distributed prediction errors

Error correlation
Figure 6: Error correlation matrix between parameters

Relative error
Figure 7: Relative error (%) vs true value for each parameter

Error CDF
Figure 8: Cumulative error distribution — 95% of predictions within indicated bounds

Prediction vs index
Figure 9: True vs predicted values by sample index

Error box plot
Figure 10: Error distribution summary (median, quartiles, outliers)


🔬 Broader Applications

Beyond the material characterization example above, the WaveDL pipeline can be adapted for a wide range of wave-based inverse problems across multiple domains:

🏗️ Non-Destructive Evaluation & Structural Health Monitoring

Application Input Output
Defect Sizing A-scans, phased array images, FMC/TFM, ... Crack length, depth, ...
Corrosion Estimation Thickness maps, resonance spectra, ... Wall thickness, corrosion rate, ...
Weld Quality Assessment Phased array images, TOFD, ... Porosity %, penetration depth, ...
RUL Prediction Acoustic emission (AE), vibration spectra, ... Cycles to failure, ...
Damage Localization Wavefield images, DAS/DVS data, ... Damage coordinates (x, y, z)

🌍 Geophysics & Seismology

Application Input Output
Seismic Inversion Shot gathers, seismograms, ... Velocity models, density profiles, ...
Subsurface Characterization Surface wave dispersion, receiver functions, ... Layer thickness, shear modulus, ...
Earthquake Source Parameters Waveforms, spectrograms, ... Magnitude, depth, focal mechanism, ...
Reservoir Characterization Reflection seismic, AVO attributes, ... Porosity, fluid saturation, ...

🩺 Biomedical Ultrasound & Elastography

Application Input Output
Tissue Elastography Shear wave data, strain images, ... Shear modulus, Young's modulus, ...
Liver Fibrosis Staging Elastography images, US RF data, ... Stiffness (kPa), fibrosis score, ...
Tumor Characterization B-mode + elastography, ARFI data, ... Lesion stiffness, size, ...
Bone QUS Axial-transmission signals, ... Porosity, cortical thickness, elastic modulus ...

[!NOTE] Adapting WaveDL to these applications requires preparing your own dataset and choosing a suitable model architecture to match your input dimensionality.


📚 Documentation

Resource Description
Technical Paper In-depth framework description (coming soon)
_template.py Template for new architectures

📜 Citation

If you use WaveDL in your research, please cite:

@software{le2025wavedl,
  author = {Le, Ductho},
  title = {{WaveDL}: A Scalable Deep Learning Framework for Wave-Based Inverse Problems},
  year = {2025},
  publisher = {Zenodo},
  doi = {10.5281/zenodo.18012338},
  url = {https://doi.org/10.5281/zenodo.18012338}
}

Or in APA format:

Le, D. (2025). WaveDL: A Scalable Deep Learning Framework for Wave-Based Inverse Problems. Zenodo. https://doi.org/10.5281/zenodo.18012338


🙏 Acknowledgments

Ductho Le would like to acknowledge NSERC and Alberta Innovates for supporting his study and research by means of a research assistantship and a graduate doctoral fellowship.

This research was enabled in part by support provided by Compute Ontario, Calcul Québec, and the Digital Research Alliance of Canada.


University of Alberta    Alberta Innovates    NSERC

Digital Research Alliance of Canada


Ductho Le · University of Alberta

ORCID Google Scholar ResearchGate

Released under the MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wavedl-1.2.0.tar.gz (112.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wavedl-1.2.0-py3-none-any.whl (104.5 kB view details)

Uploaded Python 3

File details

Details for the file wavedl-1.2.0.tar.gz.

File metadata

  • Download URL: wavedl-1.2.0.tar.gz
  • Upload date:
  • Size: 112.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.10

File hashes

Hashes for wavedl-1.2.0.tar.gz
Algorithm Hash digest
SHA256 2b719b5dcfe371e624e01cb70ef5dbe252de9d44eeea07b3a6c773079b0a6211
MD5 0a7932fd49f2085be879d876c4988a0a
BLAKE2b-256 01a747db85a0b902cf6fcfa364d3b2e9cc904921463c60d4f235c3fcbbf0c2de

See more details on using hashes here.

File details

Details for the file wavedl-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: wavedl-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 104.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.10

File hashes

Hashes for wavedl-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 750dedc7092fcf70c4ce66bd139eb58175fc48293e6a435373838d40f5dbb835
MD5 702de0a43300ca4c3c81b8d35ba78ef0
BLAKE2b-256 210beff02c3586bcbe61288f87564a05ff76845df74c43dfeb587b1c89f1c4f2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page