Wie kann die Rückwärtsfunktion im Tensor die Matrix im Modell beeinflussen?Python

Python-Programme
Anonymous
 Wie kann die Rückwärtsfunktion im Tensor die Matrix im Modell beeinflussen?

Post by Anonymous »

Code: Select all

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()
Zum Beispiel so ein Snippet. Vorher denke ich nur, dass Tensor nur ein Wert ist, aber nachdem „cost.backward()“ den Grad in SoftmaxRegission ändert
Ich habe das Dokument bereits auf https://docs.pytorch.org/docs/stable/autograd.html gelesen. Aber ich weiß wirklich, wie Torch so etwas umsetzt. Ich habe CPP- und Rust-Erfahrung, also kann ich darüber nachdenken, ob der Tensor den Zeiger des Modells besitzt oder so etwas wie einen Rückruf, wenn Tensor generiert wird. Ich habe die Python-Quelle des Tensors gelesen, aber so etwas habe ich nicht gefunden, oder habe ich das vielleicht übersehen? Ich habe festgestellt, dass Tensor eine Klasse erweitert, die in einer C-Datei enthalten sein sollte, aber ich bin nicht gut darin, C-Code zu lesen, insbesondere den für Cpython..

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post