Complete worked example
python
from bootstrap_lab import torch_setup
torch = torch_setup()
from torch import nn
def tiny_classifier(steps=60):
if type(steps) is not int or not 1 <= steps <= 100:
raise ValueError('bounded training steps required')
train_x = torch.tensor([[-2.],[-1.],[1.],[2.]])
train_y = torch.tensor([0,0,1,1], dtype=torch.long)
held_x = torch.tensor([[-1.5],[1.5]])
held_y = torch.tensor([0,1], dtype=torch.long)
model = nn.Linear(1, 2)
with torch.no_grad():
model.weight.zero_()
model.bias.zero_()
optimizer = torch.optim.SGD(model.parameters(), lr=0.2)
loss_fn = nn.CrossEntropyLoss()
initial = loss_fn(model(train_x), train_y).item()
model.train()
for _ in range(steps):
optimizer.zero_grad(set_to_none=True)
loss = loss_fn(model(train_x), train_y)
loss.backward()
optimizer.step()
model.eval()
with torch.inference_mode():
final = loss_fn(model(train_x), train_y).item()
predictions = model(held_x).argmax(dim=1)
return {'loss_fell': final < initial, 'predictions': predictions.tolist(),
'training': model.training}- Reasoning
- The fixture trains a one-input two-logit linear classifier on four owned points with known labels. Parameters start at zero, SGD updates are bounded and cross-entropy receives raw logits.