次の方法で共有


分析のためにデータを準備する

このチュートリアルの前の段階では、お使いのコンピューターに PyTorch をインストールしました。 ここでは、それを使用して、モデルの作成に使用するデータを用いてコードを設定します。

Visual Studio 内で新しいプロジェクトを開く

  1. Visual Studio を開き、create a new project を選択します。

Create new Visual Studio project

  1. 検索バーに「Python」と入力し、プロジェクト テンプレートとして [Python Application ] を選択します。

Create new Python app

  1. 構成ウィンドウで:
  • プロジェクトに名前を付けます。 ここでは、DataClassifier という名前にします。
  • プロジェクトの場所を選択します。
  • VS 2019 を使用する場合は、[Create directory for solution] がオンになっていることを確認します。
  • VS2017 を使用している場合、[Place solution and project in the same directory] を必ずオフにします。

Configure your new Python app

[create] を選択してプロジェクトを作成します。

Python インタープリターを作成する

次に、新しい Python インタープリターを定義する必要があります。 これには、インストールしたばかりの PyTorch パッケージが含まれている必要があります。

  1. インタープリターの選択に移動し、[Add Environment] を選択します。

Python interpreter selection

  1. [Add Environment] ウィンドウで、[Existing environment]、[Anaconda3 (3.6, 64-bit)] の順に選択します。 この中に、PyTorch パッケージが含まれています。

Configure a new Python environment

新しい Python インタープリターと PyTorch パッケージをテストするには、次のコードを DataClassifier.py ファイルに入力します。

from __future__ import print_function 

import torch 

x=torch.rand(2, 3) 

print(x) 

出力は、次のようなランダムな 5 x 3 のテンソルになります。

Test your new Python interpreter

Note

もっと詳しく知りたいですか? PyTorch の公式 Web サイトを参照してください。

データの説明

フィッシャーのアヤメの花データセットでモデルをトレーニングします。 この有名なデータセットには、アヤメの 3 つの種 (Iris setosa、Iris virginica、Iris versicolor) に関するレコードがそれぞれ 50 件ずつ含まれています。

このデータセットは、いくつかのバージョンが公開されています。 アヤメのデータセットは、UCI Machine Learning Repository で公開されています。また、Python Scikit-learn ライブラリからデータセットを直接インポートすることも、以前に公開された他のバージョンを使用することもできます。 アヤメの花データセットについては、そのウィキペディアのページを参照してください。

このチュートリアルでは、表形式の入力を使用してモデルをトレーニングする方法を紹介するために、Excel ファイルにエクスポートされたアヤメのデータセットを使用します。

Excel の表の各行は、アヤメの 4 つの特徴 (がく片の長さ (cm)、がく片の幅 (cm)、花弁の長さ (cm)、花弁の幅 (cm)) を示します。これらの特徴は入力として使用されます。 最後の列には、これらのパラメーターに関連するアヤメの種類が含まれており、回帰分析の結果を表します。 このデータセットには、4 つの特徴からなる入力が合計で 150 件含まれており、それぞれが関連するアヤメの種類と一致します。

Iris data

回帰分析では、入力変数と結果の関係が確認されます。 モデルは、入力に基づいて、適切な出力の種類 (アヤメの 3 つの種類 (Iris-setosa、Iris-versicolor、Iris-virginica) のうちの 1 つ) を予測することを学習します。

重要

他のデータセットを使用して独自のモデルを作成する場合は、シナリオに応じてモデルの入力変数と出力を指定する必要があります。

データセットを読み込みます。

  1. アヤメのデータセットを Excel 形式でダウンロードします。 データセットは、こちらにあります。

  2. Solution Explorer Files フォルダー内にある DataClassifier.py ファイルに、次の 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 パッケージを使用します。

  1. データをメモリに読み込んで、クラスの数を確認します。 アヤメの種類ごとに 50 個ずつ項目が表示されるはずです。 必ず、お使いの PC 上のデータセットの場所を指定してください。

次のコードを 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()) 

このコードを実行すると、次のような出力が表示されます。

Dataset status

このデータセットを使用してモデルをトレーニングできるようにするには、入力と出力を定義する必要があります。 入力には、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()) 

このコードを実行すると、次のような出力が表示されます。

Input and output

モデルをトレーニングするには、モデルの入力と出力をテンソル形式に変換する必要があります。

  1. テンソルに変換します。

次のコードを 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 

このコードを実行すると、入力と出力の形式を示す次のような出力が表示されます。

Dataset input and output format

150 個の入力値があります。 約 60% がモデルのトレーニング用データになります。 20% を検証用として、30% をテスト用として保持します。

このチュートリアルでは、トレーニング用データセットのバッチ サイズを 10 と定義します。 トレーニング用セットには 95 個の項目があります。つまり、平均して、トレーニング用セット全体を 1 回 (1 エポック) 反復する完全なバッチが 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 モデルのトレーニングを行う