准备要分析的数据

在本教程的上一阶段中,我们在计算机上安装了 PyTorch。 现在,我们将使用它来设置代码,其中包含用于构建模型的数据。

在 Visual Studio 内打开新项目。

  1. 打开 Visual Studio 并选择 create a new project。

创建新的 Visual Studio 项目

  1. 在搜索栏中,键入 Python然后选择 Python Application 作为项目模板。

创建新的 Python 应用

  1. 在配置窗口中:
  • 为项目命名。 在这里,我们称之为 DataClassifier。
  • 选择项目的位置。
  • 如果使用的是 VS 2019,请确保选中 Create directory for solution。
  • 如果使用的是 VS2017,请确保未勾选 Place solution and project in the same directory。

配置新的 Python 应用

按键 create 创建项目。

创建 Python 解释器

现在,需要定义新的 Python 解释器。 这必须包括最近安装的 PyTorch 包。

  1. 导航到解释器选择,然后选择 Add Environment:

Python 解释器选择

  1. 在 Add Environment 窗口中,选择 Existing environment,然后选择 Anaconda3 (3.6, 64-bit)。 其中包括 PyTorch 包。

配置新的 Python 环境

若要测试新的 Python 解释器和 PyTorch 包,请在 DataClassifier.py 文件中输入以下代码:

from __future__ import print_function 

import torch 

x=torch.rand(2, 3) 

print(x) 

输出应为类似于以下内容的随机 5x3 张量。

测试新的 Python 解释器

注释

想要了解更多内容? 请访问 PyTorch 官方网站。

了解数据

我们将使用 Fisher 鸢尾花数据集来训练机器学习模型。 鸢尾花有 Iris setosa、Iris virginica 和 Iris versicolor 三个品种,对于每个品种,这个著名的数据集都包含 50 条记录。

已发布多个版本的数据集。 你可在 UCI 机器学习库中找到鸢尾花数据集,直接从 Python Scikit-learn 库导入数据集,或者使用之前发布的任何其他版本。 若要了解鸢尾花数据集,请访问 其维基百科页面。

在本教程中,为了展示如何使用表格类型的输入内容来训练模型,你将使用导出到 Excel 文件的鸢尾花数据集。

Excel 表格的每一行将显示四个虹膜特征:花瓣长度(厘米)、花瓣宽度(厘米)和花瓣宽度(厘米)。这些功能将用作输入。 最后一列包含与这些参数相关的鸢尾花类型,并将表示回归输出。 该数据集对这四个特征总共包含 150 条输入,其中每个输入与相关的鸢尾花类型匹配。

鸢尾花数据

回归分析查看输入变量与结果之间的关系。 根据输入,模型将学习预测正确的输出类型,即三种鸢尾花类型之一:山鸢尾、杂色鸢尾、维吉尼亚鸢尾。

重要

如果决定使用任何其他数据集创建自己的模型,则需要根据方案指定模型输入变量和输出。

加载数据集。

  1. 按 Excel 格式下载鸢尾花数据集。 你可以在此处找到它。

  2. DataClassifier.py在解决方案资源管理器文件文件夹中,添加以下导入语句,以获取对我们需要的所有包的访问权限。

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 包。

  1. 将数据加载到内存中并验证类数。 我们预计每种鸢尾花类型有 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 行特征,输出是鸢尾花类型列。 我们将使用的神经网络需要数值变量,因此你将输出变量转换为数字格式。

  1. 在数据集中创建一个新列,该列将以数字格式表示输出,并定义回归输入和输出。

将以下代码添加到 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 格式:

  1. 转换为 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 个完整批次遍历训练集一次(一个周期)。 将验证和测试集的批大小保留为 1。

  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 模型