Browse Source
Refactor: Move BB regressor debug tensor comparison to model_comparison/bbreg_comparison.py; modularize test/compare_models.py
resnet
Refactor: Move BB regressor debug tensor comparison to model_comparison/bbreg_comparison.py; modularize test/compare_models.py
resnet
3 changed files with 64 additions and 2 deletions
-
11test/compare_models.py
-
1test/model_comparison/__init__.py
-
54test/model_comparison/bbreg_comparison.py
@ -0,0 +1 @@ |
|||
|
@ -0,0 +1,54 @@ |
|||
import os |
|||
import torch |
|||
import numpy as np |
|||
|
|||
def compare_debug_tensors(cpp_dir, py_dir, sample_idx=0, verbose=True): |
|||
""" |
|||
Compare C++ and Python debug tensors for BB regressor (BatchNorm and ReLU outputs). |
|||
Args: |
|||
cpp_dir (str): Directory with C++ debug tensors. |
|||
py_dir (str): Directory with Python debug tensors. |
|||
sample_idx (int): Sample index to compare. |
|||
verbose (bool): Print detailed comparison results. |
|||
Returns: |
|||
dict: Comparison metrics for each layer/output. |
|||
""" |
|||
layers = ["conv3_1t", "conv3_2t", "conv4_1t", "conv4_2t"] |
|||
stages = ["bn", "relu"] |
|||
results = {} |
|||
for layer in layers: |
|||
for stage in stages: |
|||
cpp_file = os.path.join(cpp_dir, f"sample_{sample_idx}_debug_{layer}_{stage}.pt") |
|||
py_file = os.path.join(py_dir, f"sample_{sample_idx}_debug_{layer}_{stage}_py.pt") |
|||
if not os.path.exists(cpp_file) or not os.path.exists(py_file): |
|||
results[f"{layer}_{stage}"] = None |
|||
if verbose: |
|||
print(f"[WARN] Missing file: {cpp_file if not os.path.exists(cpp_file) else py_file}") |
|||
continue |
|||
cpp_tensor = torch.load(cpp_file, map_location="cpu") |
|||
py_tensor = torch.load(py_file, map_location="cpu") |
|||
cpp_np = cpp_tensor.cpu().detach().numpy().astype(np.float32) |
|||
py_np = py_tensor.cpu().detach().numpy().astype(np.float32) |
|||
if cpp_np.shape != py_np.shape: |
|||
results[f"{layer}_{stage}"] = None |
|||
if verbose: |
|||
print(f"[WARN] Shape mismatch for {layer}_{stage}: C++ {cpp_np.shape}, Py {py_np.shape}") |
|||
continue |
|||
flat_cpp = cpp_np.flatten() |
|||
flat_py = py_np.flatten() |
|||
mae = np.mean(np.abs(flat_cpp - flat_py)) |
|||
max_err = np.max(np.abs(flat_cpp - flat_py)) |
|||
l2_cpp = np.linalg.norm(flat_cpp) |
|||
l2_py = np.linalg.norm(flat_py) |
|||
cos_sim = np.dot(flat_cpp, flat_py) / (l2_cpp * l2_py) if l2_cpp > 0 and l2_py > 0 else float('nan') |
|||
results[f"{layer}_{stage}"] = { |
|||
"mae": mae, |
|||
"max_err": max_err, |
|||
"cos_sim": cos_sim, |
|||
"l2_cpp": l2_cpp, |
|||
"l2_py": l2_py, |
|||
"shape": cpp_np.shape |
|||
} |
|||
if verbose: |
|||
print(f"{layer}_{stage}: cos_sim={cos_sim:.6f}, mae={mae:.4e}, max_err={max_err:.4e}, shape={cpp_np.shape}") |
|||
return results |
Write
Preview
Loading…
Cancel
Save
Reference in new issue