Vorbereiten der Daten für die Analyse
In der vorherigen Phase dieses Tutorials haben wir PyTorch auf Ihrem Computer installiert. Nun verwenden wir es, um unseren Code mit den Daten einzurichten, die wir für unser Modell verwenden.
Öffnen Sie ein neues Projekt in Visual Studio.
- Öffnen Sie Visual Studio, und wählen Sie
create a new project
aus.
- Geben Sie in der Suchleiste
Python
ein, und wählen SiePython Application
als Projektvorlage aus.
- Gehen Sie im Konfigurationsfenster folgendermaßen vor:
- Geben Sie dem Projekt einen Namen. Hier nennen wir es DataClassifier.
- Wählen Sie den Speicherort Ihres Projekts aus.
- Wenn Sie VS 2019 verwenden, stellen Sie sicher, dass
Create directory for solution
aktiviert ist. - Wenn Sie VS 2017 verwenden, stellen Sie sicher, dass
Place solution and project in the same directory
deaktiviert ist.
Drücken Sie create
, um das Projekt zu erstellen.
Erstellen eines Python-Interpreters
Nun müssen Sie einen neuen Python-Interpreter definieren. Dies muss das PyTorch-Paket enthalten, das Sie vor Kurzem installiert haben.
- Navigieren Sie zur Interpreterauswahl, und wählen Sie
Add Environment
aus:
- Wählen Sie im Fenster
Add Environment
die OptionExisting environment
und dannAnaconda3 (3.6, 64-bit)
aus. Dies bezieht das PyTorch-Paket mit ein.
Geben Sie den folgenden Code in die Datei DataClassifier.py
ein, um den neuen Python-Interpreter und das PyTorch-Paket zu testen:
from __future__ import print_function
import torch
x=torch.rand(2, 3)
print(x)
Die Ausgabe sollte ein zufälliger 5x3-Tensor ähnlich dem folgenden sein.
Hinweis
Möchten Sie mehr erfahren? Besuchen Sie die offizielle PyTorch-Website.
Grundlegendes zu den Daten
Wir trainieren das Modell anhand des Datasets „Schwertlilien“ von Fisher. Dieses bekannte Dataset enthält 50 Datensätze für jede von drei Schwertlilienarten: Iris setosa (Borsten-Schwertlilie), Iris virginica (virginische Schwertlilie) und Iris versicolor (verschiedenfarbige Schwertlilie).
Mehrere Versionen des Datasets wurden veröffentlicht. Sie finden das Dataset „Schwertlilien“ im UCI Machine Learning Repository. Importieren es direkt aus der Scikit-learn-Bibliothek von Python, oder verwenden Sie eine andere zuvor veröffentlichte Version. Informationen zum Dataset „Schwertlilien“ finden Sie auf der zugehörigen Wikipedia-Seite.
In diesem Tutorial wird gezeigt, wie das Modell mit tabellarischen Eingaben trainiert werden kann. Dazu wird das Dataset „Schwertlilien“ in eine Excel-Datei exportiert.
Jede Zeile der Excel-Tabelle enthält vier Features (Merkmale) von Schwertlilien: Kelchblattlänge in cm, Kelchblattbreite in cm, Blütenblattlänge in cm und Blütenblattbreite in cm. Diese Features dienen Ihnen als Eingabe. Die letzte Spalte enthält die Schwertlilienart, die mit diesen Parametern verknüpft ist, und stellt die Regressionsausgabe dar. Insgesamt umfasst das Dataset 150 Eingaben für vier Features, von denen jedes der jeweiligen Schwertlilienart zugeordnet ist.
Bei der Regressionsanalyse wird die Beziehung zwischen Eingabevariablen und Ergebnis untersucht. Auf Grundlage der Eingabe lernt das Modell, die richtige Art der Ausgabe vorherzusagen, nämlich eine der drei Schwertlilienarten: Iris-setosa, Iris-versicolor, Iris-virginica.
Wichtig
Wenn Sie ein anderes Dataset verwenden möchten, um Ihr eigenes Modell zu erstellen, müssen Sie die Modelleingabevariablen und Ausgabe Ihrem Szenario entsprechend angeben.
Laden Sie das Dataset.
Laden Sie das Dataset „Schwertlilien“ im Excel-Format herunter. Sie finden es hier.
Fügen Sie der Datei
DataClassifier.py
im Ordner Solution Explorer Files die folgende Importanweisung hinzu, um Zugriff auf alle benötigten Pakete zu erhalten.
import torch
import pandas as pd
import torch.nn as nn
from torch.utils.data import random_split, DataLoader, TensorDataset
import torch.nn.functional as F
import numpy as np
import torch.optim as optim
from torch.optim import Adam
Wie Sie sehen, verwenden Sie das pandas-Paket (Python-Datenanalyse) zum Laden und Bearbeiten von Daten und das Paket „torch.nn“, das Module und erweiterbare Klassen zum Aufbau neuronaler Netze enthält.
- Laden Sie die Daten in den Arbeitsspeicher, und überprüfen Sie die Anzahl der Klassen. Es werden voraussichtlich 50 Elemente jeder Schwertlilienart angezeigt. Stellen Sie sicher, dass Sie den Speicherort des Datasets auf Ihrem PC angeben.
Fügen Sie der Datei DataClassifier.py
den folgenden Code hinzu.
# Loading the Data
df = pd.read_excel(r'C:…\Iris_dataset.xlsx')
print('Take a look at sample from the dataset:')
print(df.head())
# Let's verify if our data is balanced and what types of species we have
print('\nOur dataset is balanced and has the following values to predict:')
print(df['Iris_Type'].value_counts())
Wenn wir diesen Code ausführen, sieht die erwartete Ausgabe wie folgt aus:
Um das Dataset verwenden und das Modell trainieren zu können, müssen wir die Ein- und Ausgabe bestimmen. Die Eingabe umfasst 150 Zeilen mit Features, die Ausgabe ist die Spalte mit der Schwertlilienart. Das von uns verwendete neuronale Netz erfordert numerische Variablen, weshalb Sie die Ausgabevariable in ein numerisches Format konvertieren.
- Erstellen Sie eine neue Spalte im Dataset, die die Ausgabe in einem numerischen Format darstellt, und legen Sie eine Regressionsein- und -ausgabe fest.
Fügen Sie der Datei DataClassifier.py
den folgenden Code hinzu.
# Convert Iris species into numeric types: Iris-setosa=0, Iris-versicolor=1, Iris-virginica=2.
labels = {'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2}
df['IrisType_num'] = df['Iris_Type'] # Create a new column "IrisType_num"
df.IrisType_num = [labels[item] for item in df.IrisType_num] # Convert the values to numeric ones
# Define input and output datasets
input = df.iloc[:, 1:-2] # We drop the first column and the two last ones.
print('\nInput values are:')
print(input.head())
output = df.loc[:, 'IrisType_num'] # Output Y is the last column
print('\nThe output value is:')
print(output.head())
Wenn wir diesen Code ausführen, sieht die erwartete Ausgabe wie folgt aus:
Zum Trainieren des Modells müssen wir die Modellein- und -ausgabe in das Tensor-Format konvertieren:
- Konvertieren in Tensor:
Fügen Sie der Datei DataClassifier.py
den folgenden Code hinzu.
# Convert Input and Output data to Tensors and create a TensorDataset
input = torch.Tensor(input.to_numpy()) # Create tensor of type torch.float32
print('\nInput format: ', input.shape, input.dtype) # Input format: torch.Size([150, 4]) torch.float32
output = torch.tensor(output.to_numpy()) # Create tensor type torch.int64
print('Output format: ', output.shape, output.dtype) # Output format: torch.Size([150]) torch.int64
data = TensorDataset(input, output) # Create a torch.utils.data.TensorDataset object for further data manipulation
Wenn wir den Code ausführen, zeigt die erwartete Ausgabe das Ein- und Ausgabeformat wie folgt:
Es gibt 150 Eingabewerte. Etwa 60 % sind die Trainingsdaten für das Modell. Sie reservieren 20 % für die Validierung und 30 % für einen Test.
In diesem Tutorial ist die Batchgröße für ein Trainingsdataset auf 10 festgelegt. Das Trainingsdataset enthält 95 Elemente, was bedeutet, dass es im Durchschnitt 9 vollständige Batches gibt, um das Trainingsdataset einmal zu durchlaufen (was Epoche genannt wird). Die Batchgröße der Validierungs- und Testdatasets ist auf 1 festgelegt.
- Teilen Sie die Daten in Trainings-, Validierungs- und Testdatasets auf:
Fügen Sie der Datei DataClassifier.py
den folgenden Code hinzu.
# Split to Train, Validate and Test sets using random_split
train_batch_size = 10
number_rows = len(input) # The size of our dataset or the number of rows in excel table.
test_split = int(number_rows*0.3)
validate_split = int(number_rows*0.2)
train_split = number_rows - test_split - validate_split
train_set, validate_set, test_set = random_split(
data, [train_split, validate_split, test_split])
# Create Dataloader to read the data within batch sizes and put into memory.
train_loader = DataLoader(train_set, batch_size = train_batch_size, shuffle = True)
validate_loader = DataLoader(validate_set, batch_size = 1)
test_loader = DataLoader(test_set, batch_size = 1)
Nächste Schritte
Wenn die Daten einsatzbereit sind, ist es an der Zeit, unser PyTorch-Modell zu trainieren.