class SoftmaxRegission(torch.nn.Module):
linear: torch.nn.Linear
def __init__(self, num_features: int, num_classes: int):
super(SoftmaxRegission, self).__init__()
self.linear = torch.nn.Linear(num_features, num_classes)
self.linear.weight.detach().zero_()
self.linear.bias.detach().zero_()
def forward(self, x: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]:
logits: torch.Tensor = self.linear(x)
probas = F.softmax(logits, dim=1)
return logits, probas
model = SoftmaxRegission(num_features=num_features, num_classes=num_classes)
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
torch.manual_seed(random_seed)
def compute_accuracy(model: SoftmaxRegission, data_loader: DataLoader[datasets.MNIST]):
correct_pred: torch.Tensor
correct_pred, num_examples = torch.Tensor(0), 0
for features, targets in data_loader:
features: torch.Tensor = features.view(-1, 28 * 28).to(device)
targets = targets.to(device)
logits, probas = model(features)
_, predicted_labels = torch.max(probas, 1)
num_examples += targets.size(0)
correct_pred += (predicted_labels == targets).sum()
return correct_pred.float() / num_examples * 100
start_time = time.time()
epoch_costs: list[int] = []
for epoch in range(num_epochs):
avg_cost = 0
for batch_idx, (features, targets) in enumerate(train_loader):
features = features.view(-1, 28 * 28).to(device)
targets = targets.to(device)
logits, probas = model(features)
cost = F.cross_entropy(logits, targets)
optimizer.zero_grad()
# Tensor has a callback to upgrade the grad, finally this will change the linear in model
cost.backward()
avg_cost += cost
optimizer.step()
Например, такой фрагмент. Раньше я просто думал, что Tensor - это просто значение, но после того, как `cost.backward()` изменил градацию в SoftmaxRegission
, я уже прочитал документ на https://docs.pytorch.org/docs/stable/autograd.html. Но мне действительно интересно, как Torch реализует подобные вещи. У меня есть опыт работы с CPP и Rust, поэтому я могу подумать о том, что если Tensor владеет указателем модели или чем-то вроде обратного вызова, когда генерируется Tensor. Я прочитал исходники Тензора на Python, но не нашел ничего подобного, или, может быть, я это пропустил? Я обнаружил, что Tensor расширяет класс, который должен быть в файле c, но я не умею читать код c, особенно для cpython..
# Tensor has a callback to upgrade the grad, finally this will change the linear in model cost.backward() avg_cost += cost
optimizer.step() [/code] Например, такой фрагмент. Раньше я просто думал, что Tensor - это просто значение, но после того, как `cost.backward()` изменил градацию в SoftmaxRegission , я уже прочитал документ на https://docs.pytorch.org/docs/stable/autograd.html. Но мне действительно интересно, как Torch реализует подобные вещи. У меня есть опыт работы с CPP и Rust, поэтому я могу подумать о том, что если Tensor владеет указателем модели или чем-то вроде обратного вызова, когда генерируется Tensor. Я прочитал исходники Тензора на Python, но не нашел ничего подобного, или, может быть, я это пропустил? Я обнаружил, что Tensor расширяет класс, который должен быть в файле c, но я не умею читать код c, особенно для cpython..