準備資料以供分析
在本教學課程 的上一個階段中,我們在您的電腦上安裝 PyTorch。 現在,我們將使用它來設定程式碼與我們將用來建立模型的資料。
在 Visual Studio 中開啟新的專案。
- 開啟 Visual Studio,然後選擇
create a new project
。
- 在搜尋列中,輸入
Python
並選取Python Application
作為專案範本。
- 在組態視窗中:
- 命名專案。 在這裡,我們稱之為 DataClassifier 。
- 選擇專案的位置。
- 如果您使用 VS2019,請確定
Create directory for solution
已核取 。 - 如果您使用 VS2017,請確定
Place solution and project in the same directory
未核取。
按 create
以建立您的專案。
建立 Python 解譯器
現在,您需要定義新的 Python 解譯器。 這必須包含您最近安裝的 PyTorch 套件。
- 流覽至解譯器選取專案,然後選取
Add Environment
:
- 在
Add Environment
視窗中,選取Existing environment
,然後選擇Anaconda3 (3.6, 64-bit)
。 這包括 PyTorch 套件。
若要測試新的 Python 解譯器和 PyTorch 套件,請在檔案中輸入下列程式碼 DataClassifier.py
:
from __future__ import print_function
import torch
x=torch.rand(2, 3)
print(x)
輸出應該是類似下面的隨機 5x3 張量。
注意
有興趣深入了解嗎? 流覽 PyTorch 官方網站 。
瞭解資料
我們將在費舍爾的鳶尾花資料集上定型模型。 這個著名的資料集包含三種鳶尾花物種中的 50 筆記錄:鳶尾花 setosa、鳶尾花和鳶尾花維西色。
已發行數個資料集版本。 您可以在 UCI 機器學習 存放庫 找到鳶尾花資料集 、直接從 Python Scikit-learn 程式庫 匯入資料集,或使用先前發佈的任何其他版本。 若要瞭解鳶尾花資料集,請流覽 其維琪百科頁面 。
在本教學課程中,為了示範如何使用表格式輸入來定型模型,您將使用匯出至 Excel 檔案的鳶尾花資料集。
Excel 表格的每一行都會顯示虹膜的四個特徵:花瓣長度,以 cm 為單位的花瓣寬度,以 cm 為單位的花瓣長度,以 cm 為單位的花瓣寬度。這些功能將作為您的輸入。 最後一個資料行包含與這些參數相關的鳶尾花類型,並代表回歸輸出。 資料集總共包含四個特徵的 150 個輸入,每一個都符合相關的鳶尾花類型。
迴歸分析會查看輸入變數與結果之間的關聯性。 根據輸入,模型將瞭解如何預測正確的輸出類型-三種鳶尾花類型之一:鳶尾花、鳶尾花-維西色、鳶尾花。
重要
如果您決定使用任何其他資料集來建立自己的模型,則必須根據您的案例指定模型輸入變數和輸出。
載入資料集。
下載 Excel 格式的鳶尾花資料集。 您可以在這裡 找到它。
DataClassifier.py
在 [方案總管 Files] 資料夾中的 檔案 中,新增下列 import 語句,以存取我們需要的所有套件。
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
如您所見,您將使用 pandas (Python 資料分析) 套件來載入和運算元據和 torch.nn 套件,其中包含用於建置神經網路的模組和可延伸類別。
- 將資料載入記憶體,並確認類別數目。 我們預期會看到每個鳶尾花類型的 50 個專案。 請務必指定您電腦上的資料集位置。
將下列程式碼新增至 DataClassifier.py
檔案。
# 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())
當我們執行此程式碼時,預期的輸出如下所示:
若要能夠使用資料集並定型模型,我們需要定義輸入和輸出。 輸入包含 150 行特徵,輸出是鳶尾花類型資料行。 我們將使用的類神經網路需要數值變數,因此您將輸出變數轉換成數值格式。
- 在資料集中建立新的資料行,以數值格式表示輸出,並定義回歸輸入和輸出。
將下列程式碼新增至 DataClassifier.py
檔案。
# 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())
當我們執行此程式碼時,預期的輸出如下所示:
若要定型模型,我們需要將模型輸入和輸出轉換成 Tensor 格式:
- 轉換為 Tensor:
將下列程式碼新增至 DataClassifier.py
檔案。
# 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
如果我們執行程式碼,預期的輸出會顯示輸入和輸出格式,如下所示:
有 150 個輸入值。 大約 60% 是模型定型資料。 您將會保留 20% 的驗證,30% 用於測試。
在本教學課程中,訓練資料集的批次大小定義為 10。 訓練集中有 95 個專案,這表示平均有 9 個完整批次逐一查看定型集一次(一個 epoch)。 您將保留驗證和測試集的批次大小為 1。
- 分割資料以定型、驗證和測試集:
將下列程式碼新增至 DataClassifier.py
檔案。
# 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)
後續步驟
隨著資料準備就緒,是時候 定型 PyTorch 模型了