- 新增 irstd 核心包、scripts、tests、configs - 新增研究文档:literature_review / mathematical_analysis / novelty_matrix / experiment_plan / research_decision / research_log / manuscript_outline - 新增 evidence、results 数据与审计产物 - 新增 pyproject.toml、requirements、.gitignore
19 lines
1021 B
Python
19 lines
1021 B
Python
import unittest,importlib.util
|
|
AVAILABLE=importlib.util.find_spec('torch') is not None
|
|
@unittest.skipUnless(AVAILABLE,'PyTorch is unavailable; gradient/training tests NOT executed')
|
|
class TorchTests(unittest.TestCase):
|
|
def test_shapes_and_gradient(self):
|
|
import torch
|
|
from irstd.models import TinyUNet,segmentation_loss
|
|
model=TinyUNet();x=torch.randn(1,1,17,19);y=torch.zeros_like(x);y[:,:,8,9]=1
|
|
for name in ['bce','dice','bce_dice','focal','iou']:
|
|
model.zero_grad();z=model(x);self.assertEqual(z.shape,x.shape)
|
|
loss=segmentation_loss(z,y,name);loss.backward();self.assertTrue(torch.isfinite(loss))
|
|
self.assertTrue(all(torch.isfinite(p.grad).all() for p in model.parameters()))
|
|
def test_gate_gradients(self):
|
|
import torch
|
|
from irstd.models import gate_loss
|
|
s=torch.tensor([0.,0.],requires_grad=True)
|
|
loss,upper=gate_loss(s,torch.tensor([1.,0.]),torch.tensor([4.,1.]),1.,.1)
|
|
loss.backward();self.assertLess(s.grad[0],0);self.assertGreater(s.grad[1],0);self.assertAlmostEqual(upper.item(),1.)
|