Da Tensorflow2, das auf Funktionen basiert, schwierig zu verwenden ist, migrieren wir zu Pytorch. Dieser Artikel richtet sich an Nostalgie, die Verlustfunktionen und Optimierungsmethoden selbst erstellen möchten, nicht an moderne Kinder, die Pakete so verwenden, wie sie sind. Fossilien, die sagen "Gradient wird von Hand berechnet", sind nicht das Ziel.
Richtig generiert
import numpy as np
import matplotlib.pyplot as plt
import torch
from torch.autograd import Variable
import torch.optim as optim
N = 100
a_data = - 1
b_data = 1
sigma_data = 0.1
x_data = 2 * np.random.rand(N)
y_data = a_data * x_data + b_data + sigma_data * np.random.randn(N)
Für verdrehte Menschen, die ihre eigene Verlustfunktion erstellen möchten.
#Variablendefinition
a = Variable(torch.randn(1), requires_grad=True)
b = Variable(torch.randn(1), requires_grad=True)
#Datenkonvertierung
x_train = torch.tensor(x_data)
y_train = torch.tensor(y_data)
#Funktionseinstellungen optimieren
optimizer = optim.Adam([a, b])
#Anzahl der Wiederholungen
epoch = 4000
loss_epoch = np.zeros(epoch)
for i in range(epoch):
#Gradienteninitialisierung im Optimierer
optimizer.zero_grad()
#Lineares Modell
y_hat = a * x_train + b
#Berechnung der Verlustfunktion
loss = (y_train - y_hat).norm()
loss_epoch[i] = loss.item()
#Verlaufseinstellung
loss.backward()
#Führen Sie eine Optimierung durch
optimizer.step()
Für diejenigen, die Optimizer nicht verwenden möchten und mehr Wendungen haben möchten. Optimiert mit der Gradientenmethode.
#Parametervorbereitung
a = torch.randn(1,requires_grad=True)
b = torch.randn(1,requires_grad=True)
#Datenkonvertierung
x_train = torch.tensor(x_data)
y_train = torch.tensor(y_data)
#Lernrate
eta = 0.001
#Anzahl der Wiederholungen
epoch = 4000
loss_epoch = np.zeros(epoch)
for i in range(epoch):
#Starten Sie die Aufnahme des Farbverlaufs
a.requires_grad_(True)
b.requires_grad_(True)
#Vorhersage und Berechnung der Verlustfunktion
y_hat = a * x_train + b
loss = (y_train - y_hat).norm()
loss_epoch[i] = loss.item()
#Verlaufseinstellung
loss.backward()
#Beenden Sie die Aufzeichnung des Verlaufs
a.requires_grad_(False)
b.requires_grad_(False)
#Update mit Farbverlauf
a = a - eta * a.grad
b = b - eta * b.grad
Es scheint einfach zu bedienen zu sein, sobald Sie sich an die Neigungserfassung und das Anhalten von Teilen gewöhnt haben.
https://github.com/yuji0001/2020Introduction_of_Pytorch
Reference Pytorch-Tutorials (hier).
Author Yuji Okamoto [email protected]
Recommended Posts