1. Vorbereitung der Daten
import torch
import torchvision
import torchvision.transforms as transforms
# Definieren der Transformationen
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# Laden des CIFAR-10-Datensatzes
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
Files already downloaded and verified
Files already downloaded and verified
torchtext
:import torchtext
from torchtext.data import Field, TabularDataset, BucketIterator
# Definieren der Felder
TEXT = Field(tokenize='spacy', lower=True)
LABEL = Field(sequential=False, use_vocab=False)
# Laden des Datensatzes
train_data, test_data = TabularDataset.splits(
path='.', train='train.csv', test='test.csv', format='csv',
fields=[('text', TEXT), ('label', LABEL)]
)
# Erstellen der Iteratoren
train_iterator, test_iterator = BucketIterator.splits(
(train_data, test_data), batch_size=32, sort_key=lambda x: len(x.text),
sort_within_batch=False, repeat=False
)
2. Datenaugmentation und Vorverarbeitung
# Definieren der Transformationen mit Datenaugmentation
transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomCrop(32, padding=4),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# Beispielhafte Tokenisierung und Text-Vorverarbeitung
TEXT = Field(tokenize='spacy', lower=True, include_lengths=True)
LABEL = Field(sequential=False, use_vocab=False)
3. DataLoader und Batch-Verarbeitung
trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True, num_workers=2)
testloader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=2)
Beispiel: DataLoader für Textdaten:
train_iterator, test_iterator = BucketIterator.splits(
(train_data, test_data), batch_size=32, sort_key=lambda x: len(x.text),
sort_within_batch=True, repeat=False
)
4. Trainingsschleife
Die Trainingsschleife ist der Kern des Trainingsprozesses, in dem das Modell die Daten durchläuft, die Vorhersagen trifft, den Verlust berechnet und die Gewichte aktualisiert.
Definieren der Trainingsschleife:
import torch.optim as optim
import torch.nn as nn
# Beispielhaftes Modell, Verlustfunktion und Optimierer
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# Trainingsschleife
for epoch in range(10): # Anzahl der Epochen
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
# Nullsetzen der Gradienten
optimizer.zero_grad()
# Vorwärtsausbreitung
outputs = model(inputs)
loss = criterion(outputs, labels)
# Rückwärtsausbreitung und Optimierung
loss.backward()
optimizer.step()
# Verlust summieren
running_loss += loss.item()
if i % 2000 == 1999: # Alle 2000 Mini-Batches ausgeben
print(f'[{epoch + 1}, {i + 1}] loss: {running_loss / 2000:.3f}')
running_loss = 0.0
print('Finished Training')
Output:
[1, 2000] loss: 2.156
[1, 4000] loss: 1.954
[1, 6000] loss: 1.744
[1, 8000] loss: 1.601
...
Finished Training
5. Evaluierung des Modells
Nach dem Training muss das Modell evaluiert werden, um seine Leistung zu bewerten.
Beispiel: Evaluierung des Modells:
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy of the network on the test images: {100 * correct / total}%')
# Output:
# Accuracy of the network on the test images: 47.6%
6. Speichern und Laden von Modellen
Es ist wichtig, trainierte Modelle zu speichern, um sie später laden und verwenden zu können.
Speichern des Modells:
# Speichern des Modells
torch.save(model.state_dict(), 'model.pth')
Laden des Modells:
# Laden des Modells
model = SimpleNN()
model.load_state_dict(torch.load('model.pth'))
model.eval()
7. Fazit
Das Training eines neuronalen Netzwerks mit PyTorch umfasst mehrere wichtige Schritte, von der Datenvorbereitung über die Implementierung der Trainingsschleife bis hin zur Evaluierung und Speicherung des Modells. Durch die Nutzung der leistungsstarken Bibliotheken und Funktionen von PyTorch können Sie effiziente und skalierbare Machine-Learning-Modelle entwickeln und einsetzen. Nutzen Sie diese Techniken und Best Practices, um Ihre Machine-Learning-Projekte erfolgreich umzusetzen.