ToTf 0.2.5__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. {totf-0.2.5 → totf-0.3.0}/PKG-INFO +430 -31
  2. {totf-0.2.5 → totf-0.3.0}/README.md +428 -29
  3. totf-0.3.0/ToTf/__init__.py +55 -0
  4. totf-0.3.0/ToTf/backend_manager.py +411 -0
  5. {totf-0.2.5 → totf-0.3.0}/ToTf.egg-info/PKG-INFO +430 -31
  6. {totf-0.2.5 → totf-0.3.0}/ToTf.egg-info/SOURCES.txt +3 -0
  7. {totf-0.2.5 → totf-0.3.0}/pyproject.toml +1 -2
  8. {totf-0.2.5 → totf-0.3.0}/setup.py +1 -1
  9. totf-0.3.0/test/test_phase1_utils.py +345 -0
  10. totf-0.3.0/test/test_phase2_utils.py +218 -0
  11. totf-0.3.0/test/test_phase3_utils.py +149 -0
  12. totf-0.2.5/ToTf/__init__.py +0 -14
  13. totf-0.2.5/ToTf/backend_manager.py +0 -227
  14. {totf-0.2.5 → totf-0.3.0}/LICENSE +0 -0
  15. {totf-0.2.5 → totf-0.3.0}/ToTf/backend.py +0 -0
  16. {totf-0.2.5 → totf-0.3.0}/ToTf.egg-info/dependency_links.txt +0 -0
  17. {totf-0.2.5 → totf-0.3.0}/ToTf.egg-info/requires.txt +0 -0
  18. {totf-0.2.5 → totf-0.3.0}/ToTf.egg-info/top_level.txt +0 -0
  19. {totf-0.2.5 → totf-0.3.0}/setup.cfg +0 -0
  20. {totf-0.2.5 → totf-0.3.0}/test/test_connection_api.py +0 -0
  21. {totf-0.2.5 → totf-0.3.0}/test/test_connections_visual.py +0 -0
  22. {totf-0.2.5 → totf-0.3.0}/test/test_integration.py +0 -0
  23. {totf-0.2.5 → totf-0.3.0}/test/test_modelview_quick.py +0 -0
  24. {totf-0.2.5 → totf-0.3.0}/test/test_modelview_tf.py +0 -0
  25. {totf-0.2.5 → totf-0.3.0}/test/test_monitor.py +0 -0
  26. {totf-0.2.5 → totf-0.3.0}/test/test_onnx_pytorch.py +0 -0
  27. {totf-0.2.5 → totf-0.3.0}/test/test_onnx_tensorflow.py +0 -0
  28. {totf-0.2.5 → totf-0.3.0}/test/test_pytorch_modelview_quick.py +0 -0
  29. {totf-0.2.5 → totf-0.3.0}/test/test_smartsummary.py +0 -0
  30. {totf-0.2.5 → totf-0.3.0}/test/test_smartsummary_features.py +0 -0
  31. {totf-0.2.5 → totf-0.3.0}/test/test_smartsummary_tf.py +0 -0
  32. {totf-0.2.5 → totf-0.3.0}/test/test_utils_integration.py +0 -0
  33. {totf-0.2.5 → totf-0.3.0}/test/test_utils_pytorch.py +0 -0
  34. {totf-0.2.5 → totf-0.3.0}/test/test_utils_tf.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ToTf
3
- Version: 0.2.5
3
+ Version: 0.3.0
4
4
  Summary: A Cross-Library Compatible Library for PyTorch and TensorFlow that provides advanced features for ease of use
5
5
  Home-page: https://github.com/Akshay-Ramesh-VITC/ToTf
6
- Author: Akshay, Shyamanth Reddy
6
+ Author: Akshay
7
7
  Author-email: akshay.r2023@vitstudent.ac.in
8
8
  License: Apache-2.0
9
9
  Project-URL: Homepage, https://github.com/Akshay-Ramesh-VITC/ToTf
@@ -124,6 +124,46 @@ Framework-agnostic "missing" functions that save time and improve code quality:
124
124
  - **`LRFinder`** - Full-featured LR range test class with plotting
125
125
  - **Use case**: Automatically discover the best learning rate before training (fast.ai style), avoid manual tuning
126
126
 
127
+ #### Cross-Framework Reproducibility
128
+ - **`seed_everything(seed=42, deterministic=False, benchmark=False, verbose=False)`** - Seeds Python, NumPy, PyTorch (CPU & CUDA), and TensorFlow in a single call. Optionally sets deterministic algorithms and cuBLAS workspace config.
129
+ - **Use case**: Guaranteed reproducible experiments and benchmarks across backends without repeating 10 lines of boilerplate.
130
+
131
+ #### Tensor Health & Diagnostics
132
+ - **`inspect_tensor(tensor, name=None, print_info=True, quantiles=True)`** - One-line diagnostic inspector for PyTorch, TensorFlow, or NumPy tensors.
133
+ - **Information provided**: Shape, dtype, device, memory MB, element count, NaN/Inf detection, zero sparsity %, min, max, mean, std, and quantiles (p25, p50, p75).
134
+ - **Use case**: Rapid sanity-checking and debugging of activations, embeddings, and gradients.
135
+
136
+ #### Transfer Learning & Fine-Tuning
137
+ - **`freeze_layers(model, up_to=None, layer_names=None, layer_types=None, regex=None)`** - Freeze model parameters/layers (supports both `torch.nn.Module` and `tf.keras.Model`).
138
+ - **`unfreeze_layers(model, last_n=None, layer_names=None, layer_types=None, regex=None)`** - Selectively unfreeze layers (e.g., `last_n=1` for classification heads).
139
+ - **`freeze_batchnorm(model, freeze_eval=True)`** - Lock BatchNorm affine parameters and freeze running statistics (eval mode) during fine-tuning.
140
+ - **Use case**: Effortless backbone freezing and transfer learning across both frameworks.
141
+
142
+ #### Focal Loss for Class Imbalance
143
+ - **`loss_focal(y_true, y_pred, alpha=0.25, gamma=2.0)`** - Focal loss function for addressing extreme class imbalance in object detection and dense classification.
144
+ - **`FocalLoss(alpha=0.25, gamma=2.0)`** - PyTorch and Keras-compatible Focal Loss class.
145
+ - **Use case**: One-stage detectors, fraud/rare disease detection where easy negatives overwhelm the gradients.
146
+
147
+ #### Dice Loss & IoU Segmentation Metrics
148
+ - **`loss_dice(y_true, y_pred, smooth=1e-6)`** - Soft Dice loss for image segmentation.
149
+ - **`DiceLoss(smooth=1e-6)`** - PyTorch and Keras-compatible Dice Loss class.
150
+ - **`dice_score(y_true, y_pred)`** / **`iou_score(y_true, y_pred)`** - Fast Dice Similarity Coefficient and Jaccard Index metrics.
151
+ - **Use case**: Biomedical and satellite image segmentation with foreground-background class imbalance.
152
+
153
+ #### Numerical Anomaly Tracking (First-NaN / Inf Pinpointing)
154
+ - **`AnomalyDetector(model, check_inputs=True, check_outputs=True, check_gradients=True)`** - Non-intrusive hook monitor that intercepts the exact layer and tensor where NaN or Inf first originates.
155
+ - **`check_anomalies(tensor, name=None)`** - Quick boolean assertion check for tensors.
156
+ - **Use case**: Instantly identifies exploding gradients, numerical instability, or invalid layer inputs without hours of manual debugging.
157
+
158
+ #### Publication-Ready Model Profiling & Benchmarking
159
+ - **`benchmark_model(model, input_shape=..., num_runs=50, warmup=10)`** - Complete model complexity profiler calculating total/trainable params, memory (MB), estimated FLOPs & MACs, latency percentiles (mean, std, p50, p95, p99), throughput (FPS), plus ready-to-paste **Markdown** and **LaTeX** tables.
160
+ - **Use case**: Generate camera-ready complexity and performance tables for research papers, GitHub READMEs, and technical reports.
161
+
162
+ #### Direct In-Memory Weight Transfer (PyTorch <-> TensorFlow)
163
+ - **`transfer_weights(source_model, target_model, layer_mapping=None, verbose=True)`** - Direct zero-disk-overhead in-memory weight mapper between PyTorch and TensorFlow/Keras models.
164
+ - **Automated features**: Automatically handles spatial weight transpositions (PyTorch `[out, in, H, W]` vs Keras `[H, W, in, out]`), Linear/Dense transpositions (`[out, in]` vs `[in, out]`), and aligns BatchNorm gamma, beta, mean, and var.
165
+ - **Use case**: Instant cross-framework model porting, rapid paper replication, and comparing inference speeds between PyTorch and TensorFlow without cumbersome ONNX exports.
166
+
127
167
  ### 📊 ModelView (PyTorch & TensorFlow)
128
168
  Publication-quality neural network architecture diagrams for both frameworks:
129
169
  - **PyTorch support** - Wraps torchview for comprehensive PyTorch model visualization
@@ -1094,6 +1134,210 @@ best_lr = lr_finder.get_best_lr()
1094
1134
 
1095
1135
  ---
1096
1136
 
1137
+ ### Cross-Framework Reproducibility (`seed_everything`)
1138
+
1139
+ **Problem**: Achieving full determinism and reproducibility across PyTorch, TensorFlow, NumPy, and Python usually requires 10+ lines of framework-specific boilerplate, device flags, and cuBLAS configurations.
1140
+
1141
+ **Solution**: `seed_everything()` configures all random number generators, backend states, and hardware determinism flags in a single call.
1142
+
1143
+ ```python
1144
+ from ToTf import seed_everything
1145
+
1146
+ # Basic reproducible seeding (Python, NumPy, PyTorch CPU/CUDA, TensorFlow)
1147
+ seed_everything(42)
1148
+
1149
+ # Strict deterministic execution for scientific benchmarking
1150
+ seed_everything(42, deterministic=True, verbose=True)
1151
+ ```
1152
+
1153
+ ---
1154
+
1155
+ ### Tensor Health & Diagnostics (`inspect_tensor`)
1156
+
1157
+ **Problem**: When debugging unexpected model outputs, vanishing gradients, or shape mismatches, printing a tensor only displays raw numbers or truncated floats, requiring multiple manual `.shape`, `.dtype`, `torch.isnan()`, `.mean()`, and `.std()` calls.
1158
+
1159
+ **Solution**: `inspect_tensor()` provides a comprehensive one-line diagnostic health profile for PyTorch, TensorFlow, and NumPy tensors.
1160
+
1161
+ ```python
1162
+ from ToTf import inspect_tensor
1163
+ import torch
1164
+
1165
+ x = torch.randn(32, 64, 128)
1166
+ stats = inspect_tensor(x, name="encoder_activations")
1167
+ ```
1168
+
1169
+ **Output:**
1170
+ ```
1171
+ ======================================================================
1172
+ [TENSOR HEALTH CHECK] 'encoder_activations'
1173
+ ======================================================================
1174
+ Framework: PyTorch
1175
+ Shape: (32, 64, 128)
1176
+ Dtype: torch.float32
1177
+ Device: cpu
1178
+ Memory: 1.000 MB
1179
+ Elements: 262,144
1180
+ NaNs: 0 (0.0000%) [OK]
1181
+ Infs: 0 (0.0000%) [OK]
1182
+ Zeros: 0 (0.0000%)
1183
+ Min / Max: -4.521849 / 4.678121
1184
+ Mean / Std: -0.000142 / 0.999812
1185
+ Quantiles: p25=-0.674912, p50=0.000185, p75=0.674391
1186
+ ======================================================================
1187
+ ```
1188
+
1189
+ ---
1190
+
1191
+ ### Transfer Learning & Fine-Tuning Toolkit
1192
+
1193
+ **Problem**: Freezing backbones or fine-tuning heads in PyTorch requires navigating parameter generators and setting `param.requires_grad = False`. In TensorFlow/Keras, it requires setting `layer.trainable = False`. Furthermore, PyTorch `BatchNorm` layers continue updating running mean and variance in `.train()` mode even if affine parameters are frozen!
1194
+
1195
+ **Solution**: Framework-agnostic `freeze_layers()`, `unfreeze_layers()`, and `freeze_batchnorm()`.
1196
+
1197
+ ```python
1198
+ from ToTf import freeze_layers, unfreeze_layers, freeze_batchnorm
1199
+
1200
+ # Freeze backbone layers up to index 8, or matching a name pattern
1201
+ freeze_layers(model, up_to=8)
1202
+ freeze_layers(model, regex=r"(conv|block[1-3])")
1203
+
1204
+ # Unfreeze only the final classifier head
1205
+ unfreeze_layers(model, last_n=1)
1206
+
1207
+ # Lock BatchNorm weights AND running statistics during fine-tuning
1208
+ freeze_batchnorm(model, freeze_eval=True)
1209
+ ```
1210
+
1211
+ ---
1212
+
1213
+ ### Focal Loss for Class Imbalance
1214
+
1215
+ **Problem**: Standard Cross-Entropy is overwhelmed by vast numbers of easily classified background/negative examples in tasks like object detection, anomaly detection, or medical triage.
1216
+
1217
+ **Solution**: `loss_focal()` and `FocalLoss` dynamically scale the cross-entropy loss, down-weighting easy examples to focus gradient updates on hard, confusing examples.
1218
+
1219
+ ```python
1220
+ from ToTf import loss_focal, FocalLoss
1221
+
1222
+ # Functional usage
1223
+ loss = loss_focal(y_true, y_pred, alpha=0.25, gamma=2.0)
1224
+
1225
+ # PyTorch Module / Keras Loss Layer usage
1226
+ criterion = FocalLoss(alpha=0.25, gamma=2.0)
1227
+ loss = criterion(y_true, y_pred)
1228
+ ```
1229
+
1230
+ ---
1231
+
1232
+ ### Dice Loss & Segmentation Metrics
1233
+
1234
+ **Problem**: Pixel-wise cross-entropy struggles with severe foreground-background imbalance in semantic/biomedical segmentation (e.g. small tumors or lesions covering <1% of the image).
1235
+
1236
+ **Solution**: Differentiable soft `loss_dice()` / `DiceLoss`, alongside `dice_score()` and `iou_score()` (Jaccard Index) evaluation metrics.
1237
+
1238
+ ```python
1239
+ from ToTf import loss_dice, DiceLoss, dice_score, iou_score
1240
+
1241
+ # Differentiable loss for backpropagation
1242
+ loss = loss_dice(masks_true, masks_pred, smooth=1e-6)
1243
+
1244
+ # Validation evaluation metrics
1245
+ dsc = dice_score(masks_true, masks_pred) # Dice Similarity Coefficient
1246
+ iou = iou_score(masks_true, masks_pred) # Jaccard Index (IoU)
1247
+ print(f"Validation Dice: {dsc:.4f} | IoU: {iou:.4f}")
1248
+ ```
1249
+
1250
+ ---
1251
+
1252
+ ### Numerical Anomaly Tracking (`AnomalyDetector`)
1253
+
1254
+ **Problem**: When NaN or Inf values appear in a deep network, PyTorch and TensorFlow typically do not fail until the loss or backward pass diverges, leaving you with zero visibility into which layer or tensor first went unstable.
1255
+
1256
+ **Solution**: `AnomalyDetector` attaches non-intrusive hooks to all layers, recording the exact layer name, stage (input, output, or backward gradient), tensor shape, and NaN/Inf count where instability first occurs.
1257
+
1258
+ ```python
1259
+ from ToTf import AnomalyDetector, check_anomalies
1260
+
1261
+ # Fast single-tensor check
1262
+ has_anomaly = check_anomalies(tensor, name="latent_embedding")
1263
+
1264
+ # Deep layer-by-layer anomaly interceptor
1265
+ detector = AnomalyDetector(model, check_inputs=True, check_outputs=True, check_gradients=True)
1266
+
1267
+ # Run forward & backward passes normally
1268
+ output = model(inputs)
1269
+ loss = criterion(output, targets)
1270
+ loss.backward()
1271
+
1272
+ # Inspect any detected anomalies
1273
+ if detector.has_anomalies():
1274
+ print(detector.summary())
1275
+ for anomaly in detector.anomalies:
1276
+ print(f"Layer '{anomaly['layer_name']}' failed at {anomaly['stage']} with {anomaly['nan_count']} NaNs!")
1277
+
1278
+ # Clean up hooks after debugging
1279
+ detector.remove_hooks()
1280
+ ```
1281
+
1282
+ ---
1283
+
1284
+ ### Publication-Ready Model Profiling (`benchmark_model`)
1285
+
1286
+ **Problem**: Writing research papers and technical documentation requires reporting parameter counts, memory footprint, FLOPs/MACs, latency percentiles, and throughput. Setting up CUDA warmup, timing loops, percentiles, and converting results into Markdown and LaTeX tables is repetitive and error-prone.
1287
+
1288
+ **Solution**: `benchmark_model()` benchmarks models with warmup, calculates parameter and computational complexity, and outputs copy-paste ready Markdown and LaTeX tables.
1289
+
1290
+ ```python
1291
+ from ToTf import benchmark_model
1292
+
1293
+ report = benchmark_model(
1294
+ model,
1295
+ input_shape=(8, 3, 64, 64),
1296
+ num_runs=50,
1297
+ warmup=10,
1298
+ device="cpu", # or 'cuda'
1299
+ print_table=True
1300
+ )
1301
+
1302
+ # Access computed metrics
1303
+ print(f"FLOPs: {report['flops_g']:.3f} G | Throughput: {report['fps']:.1f} FPS")
1304
+
1305
+ # Camera-ready LaTeX table for Overleaf / paper submission:
1306
+ print(report['latex_table'])
1307
+
1308
+ # Markdown table for GitHub / Notion documentation:
1309
+ print(report['markdown_table'])
1310
+ ```
1311
+
1312
+ ---
1313
+
1314
+ ### Direct In-Memory Weight Transfer (`transfer_weights`)
1315
+
1316
+ **Problem**: Porting a trained PyTorch model to TensorFlow/Keras (or vice-versa) usually requires saving to ONNX, writing custom conversion scripts, or manually transposing convolution weights and mapping BatchNorm parameters.
1317
+
1318
+ **Solution**: `transfer_weights()` transfers compatible parameters directly in-memory between PyTorch and TensorFlow models without disk I/O, automatically handling convolution kernel transpositions (`[out, in, H, W]` vs `[H, W, in, out]`), dense layer transpositions (`[out, in]` vs `[in, out]`), and aligning BatchNorm weights, biases, running means, and running variances.
1319
+
1320
+ ```python
1321
+ from ToTf import transfer_weights
1322
+
1323
+ # PyTorch -> TensorFlow / Keras
1324
+ transfer_weights(torch_model, keras_model, verbose=True)
1325
+
1326
+ # TensorFlow / Keras -> PyTorch
1327
+ transfer_weights(keras_model, torch_model, verbose=True)
1328
+
1329
+ # Optional custom layer name mapping for non-sequential architectures:
1330
+ transfer_weights(
1331
+ source_model,
1332
+ target_model,
1333
+ layer_mapping={"resnet_conv1": "features.0", "classifier": "head"}
1334
+ )
1335
+ ```
1336
+
1337
+ ---
1338
+
1339
+ ---
1340
+
1097
1341
  ## API Reference
1098
1342
 
1099
1343
  ### TrainingMonitor
@@ -1312,6 +1556,152 @@ LRFinder(model, loss_fn, optimizer=None)
1312
1556
 
1313
1557
  ---
1314
1558
 
1559
+ #### seed_everything
1560
+
1561
+ ```python
1562
+ seed_everything(seed: int = 42, deterministic: bool = False, benchmark: bool = False, verbose: bool = False)
1563
+ ```
1564
+
1565
+ **Parameters:**
1566
+ - `seed` (int): Master seed value (default: 42).
1567
+ - `deterministic` (bool): Enable deterministic algorithms across PyTorch & TensorFlow (may impact performance).
1568
+ - `benchmark` (bool): PyTorch cuDNN benchmark setting.
1569
+ - `verbose` (bool): Print seeding confirmation status.
1570
+
1571
+ ---
1572
+
1573
+ #### inspect_tensor
1574
+
1575
+ ```python
1576
+ inspect_tensor(tensor: Any, name: Optional[str] = None, print_info: bool = True, quantiles: bool = True) -> Dict[str, Any]
1577
+ ```
1578
+
1579
+ **Parameters:**
1580
+ - `tensor`: Input PyTorch tensor, TensorFlow tensor, or NumPy array.
1581
+ - `name` (str, optional): Custom display name for debugging.
1582
+ - `print_info` (bool): Print formatted summary table to console.
1583
+ - `quantiles` (bool): Compute 25th, 50th (median), and 75th percentiles.
1584
+
1585
+ **Returns:** Dictionary with keys `shape`, `dtype`, `device`, `numel`, `memory_mb`, `has_nan`, `nan_count`, `has_inf`, `inf_count`, `zero_pct`, `min`, `max`, `mean`, `std`, and optional `quantiles`.
1586
+
1587
+ ---
1588
+
1589
+ #### freeze_layers / unfreeze_layers / freeze_batchnorm
1590
+
1591
+ ```python
1592
+ freeze_layers(model: Any, up_to: Optional[int] = None, layer_names: Optional[List[str]] = None, layer_types: Optional[Tuple[Type, ...]] = None, regex: Optional[str] = None) -> int
1593
+
1594
+ unfreeze_layers(model: Any, last_n: Optional[int] = None, layer_names: Optional[List[str]] = None, layer_types: Optional[Tuple[Type, ...]] = None, regex: Optional[str] = None) -> int
1595
+
1596
+ freeze_batchnorm(model: Any, freeze_eval: bool = True) -> int
1597
+ ```
1598
+
1599
+ **Parameters:**
1600
+ - `model`: PyTorch `nn.Module` or TensorFlow `tf.keras.Model`.
1601
+ - `up_to`: Index up to which layers should be frozen (exclusive).
1602
+ - `last_n`: Count of trailing layers to unfreeze.
1603
+ - `layer_names`: Explicit list of layer names to match.
1604
+ - `layer_types`: Tuple of layer classes/types to match (e.g. `(nn.Conv2d, nn.Linear)`).
1605
+ - `regex`: Regex pattern matching layer names.
1606
+ - `freeze_eval` (bool): For PyTorch, force BatchNorm modules into eval mode and prevent running statistics from updating.
1607
+
1608
+ **Returns:** Count of modified layers/parameters.
1609
+
1610
+ ---
1611
+
1612
+ #### loss_focal / FocalLoss
1613
+
1614
+ ```python
1615
+ loss_focal(y_true: Any, y_pred: Any, alpha: float = 0.25, gamma: float = 2.0, reduction: str = 'mean') -> Any
1616
+
1617
+ FocalLoss(alpha: float = 0.25, gamma: float = 2.0, reduction: str = 'mean')
1618
+ ```
1619
+
1620
+ **Parameters:**
1621
+ - `alpha` (float): Weighting factor for rare/positive class (default: 0.25).
1622
+ - `gamma` (float): Focusing parameter for hard examples (default: 2.0).
1623
+ - `reduction` (str): `'mean'`, `'sum'`, or `'none'` (default: `'mean'`).
1624
+
1625
+ ---
1626
+
1627
+ #### loss_dice / DiceLoss / dice_score / iou_score
1628
+
1629
+ ```python
1630
+ loss_dice(y_true: Any, y_pred: Any, smooth: float = 1e-6) -> Any
1631
+ DiceLoss(smooth: float = 1e-6)
1632
+
1633
+ dice_score(y_true: Any, y_pred: Any, smooth: float = 1e-6) -> float
1634
+ iou_score(y_true: Any, y_pred: Any, smooth: float = 1e-6) -> float
1635
+ ```
1636
+
1637
+ **Parameters:**
1638
+ - `y_true`, `y_pred`: Ground truth masks and predicted probability/activation masks.
1639
+ - `smooth` (float): Smoothing epsilon to prevent division by zero (default: 1e-6).
1640
+
1641
+ ---
1642
+
1643
+ #### AnomalyDetector / check_anomalies
1644
+
1645
+ ```python
1646
+ check_anomalies(tensor: Any, name: Optional[str] = None) -> bool
1647
+
1648
+ AnomalyDetector(model: Any, check_inputs: bool = True, check_outputs: bool = True, check_gradients: bool = True)
1649
+ ```
1650
+
1651
+ **Methods:**
1652
+ - `has_anomalies() -> bool`: Returns True if any NaN or Inf was captured.
1653
+ - `summary() -> str`: Formatted report of all anomalies encountered.
1654
+ - `reset()`: Clear captured anomaly history.
1655
+ - `remove_hooks()`: Detach all hooks from the model.
1656
+
1657
+ ---
1658
+
1659
+ #### benchmark_model
1660
+
1661
+ ```python
1662
+ benchmark_model(
1663
+ model: Any,
1664
+ input_shape: Tuple[int, ...],
1665
+ num_runs: int = 50,
1666
+ warmup: int = 10,
1667
+ device: str = 'cpu',
1668
+ print_table: bool = True
1669
+ ) -> Dict[str, Any]
1670
+ ```
1671
+
1672
+ **Parameters:**
1673
+ - `model`: PyTorch `nn.Module` or TensorFlow `tf.keras.Model`.
1674
+ - `input_shape`: Input tensor shape including or excluding batch (e.g. `(8, 3, 224, 224)`).
1675
+ - `num_runs` (int): Timed evaluation runs (default: 50).
1676
+ - `warmup` (int): Untimed warmup iterations to initialize caches/CUDA kernels (default: 10).
1677
+ - `device` (str): `'cpu'` or `'cuda'` (default: `'cpu'`).
1678
+ - `print_table` (bool): Pretty-print console summary.
1679
+
1680
+ **Returns:** Dictionary with `total_params`, `trainable_params`, `param_memory_mb`, `macs`, `flops`, `latency_mean_ms`, `latency_std_ms`, `latency_p50_ms`, `latency_p95_ms`, `latency_p99_ms`, `fps`, `markdown_table`, and `latex_table`.
1681
+
1682
+ ---
1683
+
1684
+ #### transfer_weights
1685
+
1686
+ ```python
1687
+ transfer_weights(
1688
+ source_model: Any,
1689
+ target_model: Any,
1690
+ layer_mapping: Optional[Dict[str, str]] = None,
1691
+ verbose: bool = True
1692
+ ) -> Dict[str, int]
1693
+ ```
1694
+
1695
+ **Parameters:**
1696
+ - `source_model`: Source model (PyTorch `nn.Module` or TensorFlow `tf.keras.Model`).
1697
+ - `target_model`: Target model (PyTorch `nn.Module` or TensorFlow `tf.keras.Model`).
1698
+ - `layer_mapping` (dict, optional): Custom mapping from source layer names to target layer names.
1699
+ - `verbose` (bool): Print layer mapping and transfer details.
1700
+
1701
+ **Returns:** Dictionary with `transferred_layers` and `transferred_params` counts.
1702
+
1703
+ ---
1704
+
1315
1705
  ## Comparison with Alternatives
1316
1706
 
1317
1707
  ### SmartSummary vs Other Tools
@@ -1343,6 +1733,11 @@ LRFinder(model, loss_fn, optimizer=None)
1343
1733
  - [example_smartsummary_tf.py](example_smartsummary_tf.py) - SmartSummary examples for TensorFlow/Keras (8 detailed scenarios including multi-input models, gradient tracking, and MobileNetV2 analysis)
1344
1734
  - [example_utils_tf.py](example_utils_tf.py) - Utility functions examples (6 scenarios: lazy_flatten, NCC loss with Keras, LR finder, Functional API usage)
1345
1735
 
1736
+ ### Cross-Framework & Research Examples
1737
+ - [examples/example_phase1_qol.py](examples/example_phase1_qol.py) - Phase 1: Cross-framework seeding, tensor health check, layer and BatchNorm freezing
1738
+ - [examples/example_phase2_diagnostics_losses.py](examples/example_phase2_diagnostics_losses.py) - Phase 2: Focal Loss, Dice Loss & IoU metrics, and AnomalyDetector for pinpointing first-NaN/Inf origins
1739
+ - [examples/example_phase3_benchmarking_transfer.py](examples/example_phase3_benchmarking_transfer.py) - Phase 3: Paper-ready benchmark profiling (FLOPs/latency/Markdown/LaTeX tables) and direct in-memory PyTorch <-> TensorFlow weight transfer
1740
+
1346
1741
  ---
1347
1742
 
1348
1743
  ## Testing
@@ -1350,24 +1745,18 @@ LRFinder(model, loss_fn, optimizer=None)
1350
1745
  Run the test suites to verify everything works:
1351
1746
 
1352
1747
  ```bash
1353
- # Test TrainingMonitor (PyTorch)
1354
- python test/test_monitor.py
1355
- python test/test_integration.py
1356
-
1357
- # Test SmartSummary (PyTorch)
1358
- python test/test_smartsummary.py
1748
+ # Test Phase 1 Quality-of-Life & Transfer Learning Utilities
1749
+ pytest test/test_phase1_utils.py -v
1359
1750
 
1360
- # Test SmartSummary (TensorFlow)
1361
- python test/test_smartsummary_tf.py
1751
+ # Test Phase 2 Advanced Diagnostics & Losses
1752
+ pytest test/test_phase2_utils.py -v
1362
1753
 
1363
- # Test Utility Functions (PyTorch)
1364
- python test/test_utils_pytorch.py
1754
+ # Test Phase 3 Benchmarking & Weight Transfer
1755
+ pytest test/test_phase3_utils.py -v
1365
1756
 
1366
- # Test Utility Functions (TensorFlow)
1367
- python test/test_utils_tf.py
1368
-
1369
- # Test Cross-Framework Integration
1370
- python test/test_utils_integration.py
1757
+ # Run full test suite across all modules (119+ tests)
1758
+ pytest test/ -v
1759
+ ```
1371
1760
 
1372
1761
  ---
1373
1762
 
@@ -1388,6 +1777,7 @@ print(get_backend()) # Returns 'torch' or 'tensorflow'
1388
1777
  ToTf/
1389
1778
  ├── __init__.py # Package exports with auto backend detection
1390
1779
  ├── backend.py # Backend detection (PyTorch/TensorFlow)
1780
+ ├── backend_manager.py # Dynamic component dispatching & registration
1391
1781
  ├── requirements.txt # Dependencies
1392
1782
  ├── setup.py # Package config
1393
1783
  │
@@ -1402,32 +1792,36 @@ ToTf/
1402
1792
  │ ├── __init__.py
1403
1793
  │ ├── trainingmonitor.py # TrainingMonitor implementation
1404
1794
  │ ├── smartsummary.py # SmartSummary implementation (PyTorch)
1405
- │ └── utils.py # Utility functions (lazy_flatten, NCC loss, LR finder)
1795
+ │ └── utils.py # Utilities (seed, inspect, freeze, focal, dice, anomaly, benchmark, transfer)
1406
1796
  │
1407
1797
  ├── tenf/
1408
1798
  │ ├── __init__.py
1409
1799
  │ ├── smartsummary.py # SmartSummary implementation (TensorFlow)
1410
- │ ├── modelview.py # ModelView for architecture diagrams (NEW!)
1411
- │ └── utils.py # Utility functions (lazy_flatten, NCC loss, LR finder)
1800
+ │ ├── modelview.py # ModelView for architecture diagrams
1801
+ │ └── utils.py # Utilities (seed, inspect, freeze, focal, dice, anomaly, benchmark, transfer)
1412
1802
  │
1413
- ├── Examples/
1803
+ ├── examples/
1414
1804
  │ ├── example_usage.py # TrainingMonitor examples
1415
1805
  │ ├── example_smartsummary.py # SmartSummary examples (PyTorch)
1416
1806
  │ ├── example_smartsummary_tf.py # SmartSummary examples (TensorFlow)
1417
1807
  │ ├── example_modelview_tf.py # ModelView examples (8+ examples)
1418
- │ ├── demo_complex_architectures.py # Complex architecture demos (5 examples) (NEW!)
1419
- │ ├── example_utils_pytorch.py # Utility functions examples (PyTorch)
1420
- │ └── example_utils_tf.py # Utility functions examples (TensorFlow)
1808
+ │ ├── example_phase1_qol.py # Seeding, inspect_tensor, layer & BN freezing
1809
+ │ ├── example_phase2_diagnostics_losses.py # Focal loss, Dice, IoU, AnomalyDetector
1810
+ │ ├── example_phase3_benchmarking_transfer.py # Model benchmarking & weight transfer
1811
+ │ └── demo_complex_architectures.py # Complex architecture demos
1421
1812
  │
1422
1813
  ├── test/
1423
1814
  │ ├── test_monitor.py # TrainingMonitor tests
1424
1815
  │ ├── test_integration.py # Integration tests
1425
1816
  │ ├── test_smartsummary.py # SmartSummary tests (PyTorch)
1426
1817
  │ ├── test_smartsummary_tf.py # SmartSummary tests (TensorFlow)
1427
- │ ├── test_modelview_tf.py # ModelView tests (41 tests, 9 classes) (NEW!)
1818
+ │ ├── test_modelview_tf.py # ModelView tests (41 tests, 9 classes)
1428
1819
  │ ├── test_utils_pytorch.py # Utility functions tests (PyTorch)
1429
1820
  │ ├── test_utils_tf.py # Utility functions tests (TensorFlow)
1430
- │ └── test_utils_integration.py # Cross-framework integration tests
1821
+ │ ├── test_utils_integration.py # Cross-framework integration tests
1822
+ │ ├── test_phase1_utils.py # Phase 1 tests (19 tests)
1823
+ │ ├── test_phase2_utils.py # Phase 2 tests (6 tests)
1824
+ │ └── test_phase3_utils.py # Phase 3 tests (4 tests)
1431
1825
  │
1432
1826
  └── verify_modelview.py # Quick ModelView verification script
1433
1827
  ```
@@ -1447,17 +1841,22 @@ Contributions are welcome! Please ensure all tests pass before submitting PRs.
1447
1841
  ```bash
1448
1842
  # Run all tests
1449
1843
  pytest test/ -v
1450
-
1451
- # Run specific test suites
1452
- pytest test/test_modelview_tf.py -v # ModelView tests (32 tests)
1453
- pytest test/test_smartsummary_tf.py -v # SmartSummary tests
1454
- pytest test/test_utils_tf.py -v # Utilities tests
1455
1844
  ```
1456
1845
 
1457
1846
  ---
1458
1847
 
1459
1848
  ## What's New
1460
1849
 
1850
+ **v0.3.0 - Research & Production Deep Learning Toolkit (Phases 1, 2, & 3)** 🚀
1851
+ - ✅ **Cross-Framework Reproducibility**: `seed_everything()` sets unified seeds, determinism flags, and hardware workspace configs for Python, NumPy, PyTorch (CPU/CUDA), and TensorFlow.
1852
+ - ✅ **Tensor Health & Diagnostics**: `inspect_tensor()` provides instant one-line profiling (shape, dtype, memory, NaNs, Infs, zero sparsity, quantiles).
1853
+ - ✅ **Transfer Learning Toolkit**: `freeze_layers()`, `unfreeze_layers()`, and `freeze_batchnorm()` for seamless backbone locking across PyTorch and Keras.
1854
+ - ✅ **Focal Loss**: `loss_focal()` and `FocalLoss` for imbalanced dense classification and object detection.
1855
+ - ✅ **Dice Loss & IoU**: `loss_dice()`, `DiceLoss`, `dice_score()`, and `iou_score()` for segmentation tasks.
1856
+ - ✅ **First-NaN/Inf Anomaly Interceptor**: `AnomalyDetector` and `check_anomalies()` track exactly which layer and forward/backward stage first produces numerical instability.
1857
+ - ✅ **Camera-Ready Model Benchmarking**: `benchmark_model()` measures FLOPs, MACs, latency percentiles (p50, p95, p99), and throughput (FPS), auto-generating ready-to-publish Markdown and LaTeX tables.
1858
+ - ✅ **Direct In-Memory Weight Transfer**: `transfer_weights()` transfers weights between PyTorch and TensorFlow/Keras without disk I/O or ONNX overhead, automatically handling 2D conv kernel and dense weight matrix transpositions.
1859
+
1461
1860
  **v0.2.3 ONNX Support**
1462
1861
  - ✅ **toONNX** and **fromONNX** have been added to support ONNX
1463
1862
  **v0.2.2 Connection Extraction Fix** 🔧