• 実験が小さく再現可能に 19
pytest で始めると自然に設計が良くなる # 依存が中に埋まっている model = nn.Sequential(nn.Flatten(), nn.Linear(784, 10)) optimizer = optim.Adam(model.parameters(), lr=1e-3) dataset = MNIST(train=True, transform=transforms.ToTensor()) train_loader = DataLoader(dataset, batch_size=64, shuffle=True) for epoch in range(5): for x, y in train_loader: optimizer.zero_grad() loss = nn.functional.cross_entropy(model(x), y) loss.backward() optimizer.step() @pytest.fixture def dataset() -> Dataset: return MNIST(train=True, transform=transforms.ToTensor()) @pytest.fixture def model() -> nn.Module: return nn.Sequential(nn.Flatten(), nn.Linear(784, 10)) def train(model: nn.Module, loader: DataLoader) -> float: opt = torch.optim.Adam(model.parameters(), lr=1e-3) for x, y in loader: opt.zero_grad() loss = F.cross_entropy(model(x), y) loss.backward(); opt.step() return loss.item() def test_train_smoke(model: nn.Module, dataset: Dataset): loader = DataLoader(dataset, batch_size=64, shuffle=True) loss = train(model, loader) assert loss < 10 ✅ After:pytest スタイル (依存が明示され、構造が見える) 🧨 Before:main.py スタイル (手続き的・密結合)