ポルカドット価格分析 13 月 XNUMX 日

畳み込みニューラル ネットワーク – CIFAR-10 データセットへの PyTorch 実装

ソースノード: 1866263

この記事は、の一部として公開されました データサイエンスブログソン

概要

Cifar 10 | 畳み込みニューラルネットワークpytorch
                                    画像1

ConvNetsとも呼ばれる畳み込みニューラルネットワークは、1980年代に、バックグラウンドで働いていたコンピューターサイエンスの研究者であるYannLeCunによって最初に導入されました。 LeCunは、画像認識の基本ネットワークである日本の科学者である福島邦彦の作品に基づいて構築されました。

LeNet(LeCunの後)と呼ばれる古いバージョンのCNNは、手書きの数字を見ることができます。 CNNは、郵便からPINコードを見つけるのに役立ちます。 しかし、彼らの専門知識にもかかわらず、ConvNetsは大きな問題に直面したため、コンピュータービジョンと人工知能の近くにとどまりました。 CNNは、大きな画像でうまく機能するために、大量のデータと統合リソースを必要とします。

当時、この方法は低解像度の画像にしか適用できませんでした。 Pytorchは、深層学習操作を実行できるライブラリです。 これを使用して、畳み込みニューラルネットワークを実行できます。 畳み込みニューラルネットワークには、人工ニューロンの多くの層が含まれています。 合成ニューロン、生物学的対応物の複雑なシミュレーションは、複数の入力の加重質量と製品値の活性化を計算する数学関数です。

畳み込みニューラルネットワークpytorch
画像2

上の画像は、2の数字のような画像を取り込んで、画像に数字として表示された数字の結果を示すCNNモデルを示しています。 この記事では、これをどのように取得するかについて詳しく説明します。

CIFAR-10は、10の異なるクラスの画像のコレクションを持つデータセットです。 このデータセットは、さまざまな機械学習モデルをテストするための研究目的、特にコンピュータービジョンの問題に広く使用されています。 この記事では、Pytorchを使用してニューラルネットワークモデルを構築し、CIFAR-10データセットでテストして、どのような予測精度が得られるかを確認します。

PyTorch ライブラリのインポート 

numpyをnpとしてインポートします。pandasをpdとしてインポートします。
import torch import torch.nn.functional as F from torchvision import datasets、transforms from torch import nn import matplotlib.pyplot as plt import numpy as np import seaborn as sns #from tqdm.notebook import tqdm from tqdm import tqdm

このステップでは、必要なライブラリをインポートします。 数値演算にはNumPyを使用し、データフレーム演算にはパンダを使用していることがわかります。 トーチライブラリは、Pytorchのインポートに使用されます。

Pytorchには、機械学習の操作と関数の抽象化に使用されるnnコンポーネントがあります。 これはFとしてインポートされます。CIFAR-10データセットをインポートできるように、トーチビジョンライブラリが使用されます。 このライブラリには多くの画像データセットがあり、研究に広く使用されています。 変換をインポートして、すべての画像で同じサイズに画像のサイズを変更できます。 tqdmは、トレーニング中の進行状況を追跡できるようにするために使用され、視覚化に使用されます。

必要なデータセットを読む

trainData = pd.read_csv( 'cifar-10 / trainLabels.csv')trainData.head()

データセットを読み取ると、カエル、トラック、鹿、自動車などのさまざまなラベルが表示されます。

PyTorch を使用したデータの分析

print( "ポイント数:"、trainData.shape [0])print( "機能数:"、trainData.shape [1])print( "機能:"、trainData.columns.values)print( "数trainDataのcolの一意の値 "):print(col、": "、len(trainData [col] .unique()))plt.figure(figsize =(12,8))

出力:

ポイント数:50000機能数:2機能:['id''label']一意の値の数id:50000ラベル:10

このステップでは、データセットを分析し、列車データにIDと関連するラベルが付いた約50000行があることを確認します。 CIFAR-10という名前のように合計10のクラスがあります。

PyTorch を使用して検証セットを取得する

from torch.utils.data import random_split val_size = 5000 train_size = len(dataset)-val_size train_ds、val_ds = random_split(dataset、[train_size、val_size])len(train_ds)、len(val_ds)

このステップはトレーニングステップと同じですが、データをトレーニングセットと検証セットに分割します。

(45000、5000)
from torch.utils.data.dataloader import DataLoader batch_size = 64 train_dl = DataLoader(train_ds、batch_size、shuffle = True、num_workers = 4、pin_memory = True)val_dl = DataLoader(val_ds、batch_size、num_workers = 4、pin_memory = True)

torch.utilsには、ワーカー番号やバッチサイズなどのさまざまなパラメーターをバイパスして必要なデータをロードするのに役立つデータローダーがあります。

必要な機能の定義

@ torch.no_grad()defprecision(outputs、labels):_、preds = torch.max(outputs、dim = 1)return torch.tensor(torch.sum(preds == labels).item()/ len(preds ))class ImageClassificationBase(nn.Module):def training_step(self、batch):images、labels = batch out = self(images)#予測の生成loss = F.cross_entropy(out、labels)#損失の計算accu =精度(out 、labels)return loss、accu defvalidation_step(self、batch):images、labels = batch out = self(images)#予測損失の生成= F.cross_entropy(out、labels)#損失の計算acc =精度(out、labels) #精度を計算するreturn {'Loss':loss.detach()、 'Accuracy':acc} def validate_epoch_end(self、outputs):batch_losses = [x ['Loss'] for x in output] epoch_loss = torch.stack(batch_losses ).mean()#損失を組み合わせるbatch_accs = [x ['Accuracy'] for x in output] epoch_acc = torch.stack(batch_accs).mean()#精度を組み合わせるreturn {'Loss':epoch_loss.item()、 '精度 ':epoch_acc.item()} def epoch_end(self、epoch、result):pr int( "Epoch:"、epoch + 1)print(f'Train Accuracy:{result ["train_accuracy"] * 100:.2f}%Validation Accuracy:{result ["Accuracy"] * 100:.2f}% ' )print(f'Train Loss:{result ["train_loss"]:。4f} Validation Loss:{result ["Loss"]:。4f} ')

ここでわかるように、ImageClassificationのクラス実装を使用しており、nn.ModuleというXNUMXつのパラメーターを取ります。 このクラス内で、トレーニング、検証などのさまざまな関数またはさまざまなステップを実装できます。ここでの関数は、単純なPython実装です。

トレーニングステップでは、画像とラベルをバッチで取得します。 損失関数にクロスエントロピーを使用し、損失を計算して損失を返します。 これは、関数で確認できる検証手順に似ています。 エポックエンドは損失と精度を組み合わせ、最後に精度と損失を印刷します。

畳み込みニューラルネットワークモジュールの実装

class Cifar10CnnModel(ImageClassificationBase):def __init __(self):super().__ init __()self.network = nn.Sequential(nn.Conv2d(3、32、kernel_size = 3、padding = 1)、nn.ReLU()、 nn.Conv2d(32、64、kernel_size = 3、stride = 1、padding = 1)、nn.ReLU()、nn.MaxPool2d(2、2)、#出力:64 x 16 x 16 nn.BatchNorm2d(64) 、nn.Conv2d(64、128、kernel_size = 3、stride = 1、padding = 1)、nn.ReLU()、nn.Conv2d(128、128、kernel_size = 3、stride = 1、padding = 1)、nn .ReLU()、nn.MaxPool2d(2、2)、#出力:128 x 8 x 8 nn.BatchNorm2d(128)、nn.Conv2d(128、256、kernel_size = 3、stride = 1、padding = 1)、 nn.ReLU()、nn.Conv2d(256、256、kernel_size = 3、stride = 1、padding = 1)、nn.ReLU()、nn.MaxPool2d(2、2)、#出力:256 x 4 x 4 nn.BatchNorm2d(256)、nn.Flatten()、nn.Linear(256 * 4 * 4、1024)、nn.ReLU()、nn.Linear(1024、512)、nn.ReLU()、nn.Linear (512、10))def forward(self、xb):return self.network(xb)

これは、ニューラルネットワーク実装の最も重要な部分です。 全体を通して、トーチからインポートしたnnモジュールを使用します。 最初の行でわかるように、Conv2dは畳み込みニューラルネットワークの実装を支援するモジュールです。 ここでの最初のパラメータ3は、画像がカラーでRGB形式であることを表します。 それがグレースケール画像だったとしたら、1になります。

32は最初の出力チャネルのサイズであり、次のconv2dレイヤーに進むと、この32が入力チャネル、64が出力チャネルになります。

最初の行の3番目のパラメーターはカーネルサイズと呼ばれ、使用されるフィルターの処理に役立ちます。 パディング操作は最後のパラメーターです。

畳み込み演算は、ここでアクティベーションレイヤーとReluに接続されています。 2つのConv2dレイヤーの後、サイズ2 * 10の最大プーリング操作があります。これから得られる値は、安定性と内部共変量シフトを回避するためにバッチ正規化されます。 これらの操作は、ネットワークをより深くし、サイズを縮小するために、より多くのレイヤーで繰り返されます。 最後に、レイヤーをフラット化して、値を10個の値にマップする線形レイヤーを構築できるようにします。 これらのXNUMX個のニューロンの各ニューロンの確率は、最大確率に基づいて特定の画像がどのクラスに属するかを決定します。

モデルを訓練する

@ torch.no_grad()def Evaluation(model、data_loader):model.eval()outputs = [model.validation_step(batch)for batch in data_loader] return model.validation_epoch_end(outputs)def fit(model、train_loader、val_loader、epochs = 10、learning_rate = 0.001):best_valid =なし履歴= []オプティマイザー= torch.optim.Adam(model.parameters()、learning_rate、weight_decay = 0.0005)for epoch in range(epochs):#トレーニングフェーズmodel.train( )train_losses = [] train_accuracy = [] tqdm(train_loader)のバッチの場合:loss、accu = model.training_step(batch)train_losses.append(loss)train_accuracy.append(accu)loss.backward()optimizer.step()optimizer .zero_grad()#検証フェーズresult = Evaluation(model、val_loader)result ['train_loss'] = torch.stack(train_losses).mean()。item()result ['train_accuracy'] = torch.stack(train_accuracy)。 mean()。item()model.epoch_end(epoch、result)if(best_valid == Noneまたはbest_valid
history = fit(model、train_dl、val_dl)

これは、必要な結果を得るためにモデルをトレーニングするための基本的な手順です。 ここでの近似関数は、作成したモデルにtrainおよびValデータを近似します。 fit関数は、最初に、すべてのエポックの反復データを処理する履歴と呼ばれるリストを取得します。 forループを実行して、各エポックを反復処理できるようにします。 バッチごとに、tqdmを使用して進行状況を表示するようにします。 以前に実装したトレーニングステップを呼び出して、精度と損失を計算します。 前に定義した後方伝播と実行オプティマイザーを実行します。 これを行うと、リストを追跡し、関数は詳細と進行状況を印刷するのに役立ちます。

一方、evaluate関数はeval関数を使用し、ステップごとに、データローダーからロードされたバッチを取得して出力を計算します。 次に、値は前に定義した検証エポックエンドに渡され、それぞれの値が返されます。

結果のプロット

このステップでは、各エポックに対する精度を視覚化します。 エポックが増加するにつれて、システムの精度は増加し続け、同様に損失は減少し続けることがわかります。 ここでの赤い線はトレーニングデータの進行状況を示し、青い線は検証用です。 トレーニングデータが検証結果を大幅に上回っており、同様に損失が発生した場合も同様に、結果にかなりの過剰適合があったことがわかります。 10エポック後、列車データは90%の精度をバイパスしているように見えますが、約0.5の損失があります。 テストデータは約81%で、損失は0.2近くです。

def plot_accuracies(history):Validation_accuracies = [x ['Accuracy'] for x in history] ​​Training_Accuracies = [x ['train_accuracy'] for x in history] ​​plt.plot(Training_Accuracies、 '-rx')plt.plot(Validation_accuracies 、 '-bx')plt.xlabel( 'epoch')plt.ylabel( 'accuracy')plt.legend(['Training'、 'Validation'])plt.title( 'Accuracy vs. No. of epochs') ; plot_accuracies(history)
精度プロット
def plot_losses(history):train_losses = [x.get( 'train_loss')for x in history] ​​val_losses = [x ['Loss'] for x in history] ​​plt.plot(train_losses、 '-bx')plt.plot (val_losses、 '-rx')plt.xlabel( 'epoch')plt.ylabel( 'loss')plt.legend(['Training'、 'Validation'])plt.title( 'Loss vs. No. of epochs '); plot_losses(history)

test_dataset = ImageFolder(data_dir + '/ test'、transform = ToTensor())test_loader = DeviceDataLoader(DataLoader(test_dataset、batch_size)、device)result = Evaluation(final_model、test_loader)print(f'Test Accuracy:{result ["Accuracy" ] * 100:.2f}% ')
テスト精度:81.07%

最終的に81.07%の精度になることがわかります。

結論:

画像:https://unsplash.com/photos/5L0R8ZqPZHk

私について: 私はディープラーニングと自然言語処理の分野に興味があり、現在人工知能の大学院を目指している研究生です。

画像ソース

  1. Image 1: https://becominghuman.ai/cifar-10-image-classification-fd2ace47c5e8
  2. 画像2:https://www.analyticsvidhya.com/blog/2021/05/convolutional-neural-networks-cnn/

次のサイトでお気軽にご連絡ください。

  1.  Linkedin:https://www.linkedin.com/in/siddharth-m-426a9614a/
  2.  Github:https://github.com/Siddharth1698

この記事に示されているメディアは、Analytics Vidhyaが所有しておらず、作成者の裁量で使用されています。

出典:https://www.analyticsvidhya.com/blog/2021/09/convolutional-neural-network-pytorch-implementation-on-cifar10-dataset/

タイムスタンプ:

より多くの 分析Vidhya