# Neural Network Parameter Explorer
# Core implementation example — ackleywill.com

import torch
from torch import nn

model = nn.Sequential(
    nn.Linear(3, 4, bias=True),  # 3*4 + 4 = 16
    nn.ReLU(),                 # 0 parameters
    nn.Linear(4, 2, bias=True)  # 4*2 + 2 = 10
)
for name, layer in model.named_children():
    total = sum(p.numel() for p in layer.parameters())
    trainable = sum(p.numel() for p in layer.parameters() if p.requires_grad)
    print(name, total, trainable)

# Freeze only the first dense layer.
for parameter in model[0].parameters():
    parameter.requires_grad = False
print("Total:", sum(p.numel() for p in model.parameters()))
print("Trainable:", sum(p.numel() for p in model.parameters() if p.requires_grad))
# Conv2d: out_channels * (in_channels * kH * kW + bias_term).
# Groups=1 in this explorer; MaxPool2d / AvgPool2d have no learned parameters.
