ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

alexnet

事前学習済み AlexNet 畳み込みニューラル ネットワーク

AlexNet は、ImageNet データベース [1] の 100 万枚を超えるイメージで学習済みの畳み込みニューラル ネットワークです。このネットワークは、深さが 8 層であり、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マウス、鉛筆、多くの動物など) に分類できます。結果として、このネットワークは広範囲のイメージに対する豊富な特徴表現を学習しています。ネットワークのイメージ入力サイズは 227 x 227 です。MATLAB® の他の事前学習済みのネットワークについては、事前学習済みの畳み込みニューラル ネットワークを参照してください。

classify を使用すると、AlexNet ネットワークを使用して新しいイメージを分類できます。GoogLeNet を使用したイメージの分類の手順に従って、GoogLeNet を AlexNet に置き換えます。

実際の深層学習の各種手法を無料でお試しいただくには、ディープ ラーニング入門をご覧ください。

構文

net = alexnet

説明

net = alexnet は、事前学習済みの AlexNet ネットワークを返します。

この関数には、Deep Learning Toolbox™ Model for AlexNet Network サポート パッケージが必要です。このサポート パッケージがインストールされていない場合、関数によってダウンロード用リンクが表示されます。または、Deep Learning Toolbox Model for AlexNet Network を参照してください。

MATLAB の他の事前学習済みのネットワークについては、事前学習済みの畳み込みニューラル ネットワークを参照してください。

すべて折りたたむ

Deep Learning Toolbox Model for AlexNet Network サポート パッケージをダウンロードしてインストールします。

コマンド ラインで alexnet と入力します。

alexnet

Deep Learning Toolbox Model for AlexNet Network サポート パッケージがインストールされていない場合、関数によってアドオン エクスプローラーに必要なサポート パッケージへのリンクが表示されます。サポート パッケージをインストールするには、リンクをクリックして、[インストール] をクリックします。コマンド ラインで alexnet と入力して、インストールが正常に終了していることを確認します。

alexnet
ans = 

  SeriesNetwork with properties:

    Layers: [25×1 nnet.cnn.layer.Layer]

必要なサポート パッケージがインストールされていない場合、関数によって SeriesNetwork オブジェクトが返されます。

この例では、事前学習済みの AlexNet を微調整して、新しいイメージ コレクションを分類する方法を説明します。このプロセスは転移学習と呼ばれ、通常、新しいネットワークに学習させるよりもはるかに簡単で時間がかかりません。これは、少ない数の学習イメージを使用して、新しいタスクに学習済みの特徴を適用できるためです。転移学習用のネットワークを対話形式で準備するには、ディープ ネットワーク デザイナーを使用します。

事前学習済みのネットワークの読み込み

事前学習済みの AlexNet ネットワークを読み込みます。ネットワークをダウンロードする必要がある場合、ダウンロード用リンクを使用します。

net = alexnet;

ディープ ネットワーク デザイナーへのネットワークのインポート

ディープ ネットワーク デザイナーを開くには、次のように入力します。

deepNetworkDesigner

[インポート] をクリックして、ワークスペースからネットワークを選択します。ディープ ネットワーク デザイナーにネットワーク全体が縮小表示されます。ネットワークのプロットを確認します。マウスでズームインするには、Ctrl キーを押しながらスクロール ホイールを使用します。

転移学習用のネットワークの編集

新しいイメージを分類するように事前学習済みのネットワークに再学習させるには、最後の層を新しいデータセットに適応させた新しい層に置き換えます。クラス数をデータに合うように変更しなければなりません。

新しい FullyConnectedLayer[層] パレットからキャンバスにドラッグします。OutputSize を編集して新しいデータのクラス数 (この例では 5) にします。

学習率を編集して、新しい層での学習速度を転移層より速くします。WeightLearnRateFactor および BiasLearnRateFactor を 10 に設定します。元の層を削除して、代わりに新しい層を結合します。

出力層を置き換えます。[層] パレットの最後までスクロールして、新しい ClassificationOutputLayer をキャンバスにドラッグします。元の output 層を削除して、代わりに新しい層を結合します。

ネットワークの確認

編集したネットワークの学習の準備が整っていることを確認するには、[解析] をクリックし、深層学習ネットワーク アナライザーによって誤差 0 が報告されていることを確認します。

学習用のネットワークのエクスポート

ディープ ネットワーク デザイナーに戻り、[エクスポート] をクリックします。ディープ ネットワーク デザイナーは、編集したネットワーク層を含む lgraph_1 という新規変数にネットワークをエクスポートします。これで、層の変数を関数 trainNetwork に指定できます。

データの読み込みおよびネットワークの学習

新しいイメージを解凍してイメージ データストアとして読み込みます。データを 70% の学習データと 30% の検証データに分割します。

unzip('MerchData.zip');
imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

事前学習済みのネットワークの入力サイズに一致するようにイメージのサイズを変更します。

augimdsTrain = augmentedImageDatastore([227 227],imdsTrain);
augimdsValidation = augmentedImageDatastore([227 227],imdsValidation);

学習オプションを指定します。

  • ミニバッチのサイズ、つまり各反復で使用するイメージの数を指定します。

  • 小さい数のエポックを指定します。エポックとは、学習データセット全体の完全な学習サイクルのことです。転移学習の場合、同じエポック数の学習を行う必要はありません。すべてのエポックでデータをシャッフルします。

  • InitialLearnRate を小さい値に設定して、転移層での学習速度を下げます。

  • 検証データと少ない検証頻度を指定します。

  • 学習のプロットをオンにして、学習中に進行状況を監視します。

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'Shuffle','every-epoch', ...
    'InitialLearnRate',1e-4, ...
    'ValidationData',imdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

ネットワークに学習させるには、アプリからエクスポートされた層、lgraph_1、学習イメージ、オプションを関数 trainNetwork に指定します。trainNetwork は既定で、GPU を利用できる場合は、その GPU を使用します (Parallel Computing Toolbox™ が必要)。そうでない場合は CPU が使用されます。データセットのサイズが非常に小さいため、学習は短時間で終了します。

netTransfer = trainNetwork(imdsTrain,lgraph_1,options);

学習済みネットワークのテスト

微調整したネットワークを使用して検証イメージを分類し、分類精度を計算します。

[YPred,probs] = classify(netTransfer,imdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
accuracy = 1

4 個のサンプル検証イメージを、予測ラベルおよび予測確率と共に表示します。

idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label) + ", " + num2str(100*max(probs(idx(i),:)),3) + "%");
end

詳細を確認して他の事前学習済みのネットワークを試してみるには、ディープ ネットワーク デザイナーを参照してください。

この例では、事前学習済みの AlexNet 畳み込みニューラル ネットワークを微調整して、新しいイメージ コレクションを分類する方法を説明します。

AlexNet は、100 万枚を超えるイメージで学習しており、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、多くの動物など) に分類できます。このネットワークは広範囲にわたるイメージについての豊富な特徴表現を学習しています。このネットワークは入力としてイメージを取り、イメージ内のオブジェクトのラベルを各オブジェクト カテゴリの確率と共に出力します。

転移学習は、深層学習アプリケーションでよく使用されています。事前学習済みのネットワークを取得して、新しいタスクの学習の開始点として使用できます。通常は、転移学習によってネットワークを微調整する方が、ランダムに初期化された重みでゼロからネットワークに学習させるよりもはるかに簡単で時間がかかりません。少ない数の学習イメージを使用して、新しいタスクに学習済みの特徴を高速に転移できます。

データの読み込み

新しいイメージを解凍してイメージ データストアとして読み込みます。imageDatastore は、フォルダー名に基づいてイメージに自動的にラベルを付け、データを ImageDatastore オブジェクトとして格納します。イメージ データストアを使用すると、メモリに収まらないデータなどの大きなイメージ データを格納し、畳み込みニューラル ネットワークの学習中にイメージをバッチ単位で効率的に読み取ることができます。

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

データを学習データセットと検証データセットに分割します。イメージの 70% を学習に使用し、30% を検証に使用します。splitEachLabel は、images データストアを 2 つの新しいデータストアに分割します。

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

このとき、この非常に小さなデータセットには、55 個の学習イメージと 20 個の検証イメージが格納されています。いくつかのサンプル イメージを表示します。

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

事前学習済みのネットワークの読み込み

事前学習済みの AlexNet ニューラル ネットワークを読み込みます。Deep Learning Toolbox™ Model for AlexNet Network がインストールされていない場合、ダウンロード用リンクが表示されます。AlexNet は、100 万枚を超えるイメージについて学習済みであり、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マウス、鉛筆、多くの動物など) に分類できます。結果として、このモデルは広範囲のイメージに対する豊富な特徴表現を学習しています。

net = alexnet;

analyzeNetwork を使用して、ネットワーク アーキテクチャを対話的に可視化し、ネットワーク層についての詳細情報を表示します。

analyzeNetwork(net)

最初の層であるイメージ入力層には、サイズが 227 x 227 x 3 の入力イメージが必要です。ここで、3 はカラー チャネルの数です。

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

最後の層の置き換え

事前学習済みのネットワーク net の最後の 3 つの層は、1000 個のクラスに対して構成されています。これらの 3 つの層を、新しい分類問題に対して微調整しなければなりません。事前学習済みのネットワークから、最後の 3 つの層を除くすべての層を抽出します。

layersTransfer = net.Layers(1:end-3);

最後の 3 つの層を全結合層、ソフトマックス層、および分類出力層に置き換えることによって、層を新しい分類タスクに転移させます。新しいデータに従って新しい全結合層のオプションを指定します。全結合層のサイズが新しいデータのクラス数と同じになるように設定します。新しい層での学習速度を転移層より速くするには、全結合層の WeightLearnRateFactor および BiasLearnRateFactor の値を大きくします。

numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
layers = [
    layersTransfer
    fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
    softmaxLayer
    classificationLayer];

ネットワークの学習

ネットワークにはサイズが 227 x 227 x 3 の入力イメージが必要ですが、イメージ データストアにあるイメージのサイズは異なります。拡張イメージ データストアを使用して学習イメージのサイズを自動的に変更します。学習イメージに対して実行する追加の拡張演算として、学習イメージを縦軸に沿ってランダムに反転させる演算や、水平方向および垂直方向に最大 30 ピクセルだけランダムに平行移動させる演算を指定します。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。

pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'DataAugmentation',imageAugmenter);

他のデータ拡張を実行せずに検証イメージのサイズを自動的に変更するには、追加の前処理演算を指定せずに拡張イメージ データストアを使用します。

augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

学習オプションを指定します。転移学習の場合、事前学習済みのネットワークの初期の層からの特徴 (転移された層の重み) を保持します。転移層での学習速度を下げるため、初期学習率を小さい値に設定します。上記の手順では、全結合層の学習率係数を大きくして、新しい最後の層での学習時間を短縮しています。この学習率設定の組み合わせによって、新しい層でのみ学習が急速に進み、他の層での学習速度は低下します。転移学習の実行時には、同じエポック数の学習を行う必要はありません。エポックとは、学習データセット全体の完全な学習サイクルのことです。ミニバッチのサイズと検証データを指定します。学習中は ValidationFrequency 回の反復ごとにネットワークが検証されます。

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

転移層と新しい層とで構成されるネットワークに学習させます。既定では、利用可能な GPU がある場合、trainNetwork は GPU を使用します (Parallel Computing Toolbox™、および Compute Capability 3.0 以上の CUDA® 対応 GPU が必要)。そうでない場合は CPU が使用されます。trainingOptions の名前と値のペアの引数 'ExecutionEnvironment' を使用して、実行環境を指定することもできます。

netTransfer = trainNetwork(augimdsTrain,layers,options);

検証イメージの分類

微調整したネットワークを使用して検証イメージを分類します。

[YPred,scores] = classify(netTransfer,augimdsValidation);

4 個のサンプル検証イメージと、その予測ラベルを表示します。

idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label));
end

検証セットに対する分類精度を計算します。精度とは、ネットワークによって予測が正しく行われるラベルの割合です。

YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
accuracy = 1

この学習済みネットワークは高い精度を示しています。転移学習を使用しても十分な精度が得られない場合、代わりに特徴抽出を試してください。

AlexNet を使用してイメージの読み取り、サイズ変更、および分類を行います。最初に、事前学習済みの AlexNet モデルを読み込みます。

net = alexnet;

imread を使用してイメージを読み取ります。

I = imread('peppers.png');
figure
imshow(I)

事前学習済みのモデルは、イメージ サイズがネットワークの入力サイズと同じである必要があります。ネットワークの最初の層の InputSize プロパティを使用して、ネットワークの入力サイズを求めます。

sz = net.Layers(1).InputSize
sz =

   227   227     3

ネットワークの入力サイズに合わせてイメージを切り取ります。または、imresize を使用してイメージのサイズを変更できます。

I = I(1:sz(1),1:sz(2),1:sz(3));
figure
imshow(I)

classify を使用してイメージを分類します。

label = classify(net,I)
label = 

  categorical

     bell pepper 

イメージと分類結果をまとめて表示します。

figure
imshow(I)
title(char(label))

この例では、事前学習済みの畳み込みニューラル ネットワークから学習済みのイメージの特徴を抽出し、これらの特徴を使用してイメージ分類器に学習させる方法を説明します。特徴抽出は、事前学習済みの深いネットワークの表現能力を活用できる最も簡単で時間のかからない方法です。たとえば、抽出した特徴に対して fitcecoc (Statistics and Machine Learning Toolbox™) を使用してサポート ベクター マシン (SVM) に学習させることができます。特徴抽出が必要とするものはデータを一巡する 1 つのパスのみであるため、ネットワークの学習を加速するための GPU がない場合、これは適切な開始点となります。

データの読み込み

サンプル イメージを解凍してイメージ データストアとして読み込みます。imageDatastore は、フォルダー名に基づいてイメージに自動的にラベルを付け、データを ImageDatastore オブジェクトとして格納します。イメージ データストアを使用すると、メモリに収まらないデータを含む大きなイメージ データを格納できます。データを 70% の学習データと 30% のテスト データに分割します。

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');

このとき、この非常に小さなデータセットには、55 個の学習イメージと 20 個の検証イメージが格納されています。いくつかのサンプル イメージを表示します。

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

事前学習済みのネットワークの読み込み

事前学習済みの AlexNet ネットワークを読み込みます。Deep Learning Toolbox Model for AlexNet Network サポート パッケージがインストールされていない場合、ダウンロード用リンクが表示されます。AlexNet は、100 万枚を超えるイメージについて学習済みであり、イメージを 1000 個のオブジェクト カテゴリに分類できます。たとえば、キーボード、マウス、鉛筆、多くの動物などです。結果として、このモデルは広範囲のイメージに対する豊富な特徴表現を学習しています。

net = alexnet;

ネットワーク アーキテクチャを表示します。ネットワークには 5 つの畳み込み層と 3 つの全結合層があります。

net.Layers
ans = 
  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4], dilation factor [1  1] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Convolution                   256 5x5x48 convolutions with stride [1  1], dilation factor [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1], dilation factor [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Convolution                   384 3x3x192 convolutions with stride [1  1], dilation factor [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Convolution                   256 3x3x192 convolutions with stride [1  1], dilation factor [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

最初の層であるイメージ入力層には、サイズが 227 x 227 x 3 の入力イメージが必要です。ここで、3 はカラー チャネルの数です。

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

イメージの特徴の抽出

ネットワークは、入力イメージの階層表現を構築します。深い層には、初期の層の低レベルの特徴を使用して構築された、より高レベルの特徴が含まれます。学習イメージとテスト イメージの特徴表現を取得するには、全結合層 'fc7'activations を使用します。イメージの低レベルの表現を取得するには、ネットワークの初期の層を使用します。

ネットワークにはサイズが 227 x 227 x 3 の入力イメージが必要ですが、イメージ データストアにあるイメージのサイズは異なります。学習およびテスト イメージのサイズをネットワークへの入力前に自動的に変更するには、拡張イメージ データストアを作成して、目的のイメージ サイズを指定し、これらのデータストアを activations の入力引数として使用します。

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

layer = 'fc7';
featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows');
featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows');

学習データおよびテスト データからクラス ラベルを抽出します。

YTrain = imdsTrain.Labels;
YTest = imdsTest.Labels;

イメージ分類器のあてはめ

学習イメージから抽出された特徴を予測子変数として使用し、fitcecoc (Statistics and Machine Learning Toolbox) を使用してマルチクラス サポート ベクター マシン (SVM) をあてはめます。

classifier = fitcecoc(featuresTrain,YTrain);

テスト イメージの分類

学習済みの SVM モデルとテスト イメージから抽出された特徴を使用して、テスト イメージを分類します。

YPred = predict(classifier,featuresTest);

4 個のサンプル テスト イメージと、その予測ラベルを表示します。

idx = [1 5 10 15];
figure
for i = 1:numel(idx)
    subplot(2,2,i)
    I = readimage(imdsTest,idx(i));
    label = YPred(idx(i));
    imshow(I)
    title(char(label))
end

テスト セットに対する分類精度を計算します。精度とは、ネットワークによって予測が正しく行われるラベルの割合です。

accuracy = mean(YPred == YTest)
accuracy = 1

この SVM は高い精度を示しています。特徴抽出を使用しても十分な精度が得られない場合、代わりに転移学習を試してください。

出力引数

すべて折りたたむ

事前学習済みの AlexNet 畳み込みニューラル ネットワーク。SeriesNetwork オブジェクトとして返されます。

詳細

すべて折りたたむ

フィルター グループ

AlexNet の元の実装では、メモリの制限された 2 つの学習用 GPU 間でネットワークを分割するために、一部の畳み込み層で "フィルター グループ" を使用します。

これらの層では、フィルターが 2 つのグループに分割されます。層では、チャネルの次元に沿って入力が 2 つのセクションに分割され、各フィルター グループが異なるセクションに適用されます。その後、層では、結果として得られる 2 つのセクションが連結されて出力が生成されます。

たとえば、AlexNet の 2 番目の畳み込み層では、重みが、128 個のフィルターから成る 2 つのグループに分割されます。各フィルターには 48 個のチャネルがあります。この層への入力には 96 個のチャネルがあり、48 個のチャネルがある 2 つのセクションに分割されます。層では、フィルターの各グループが異なるセクションに適用され、128 個のチャネルがある 2 つの出力が生成されます。その後、層では、これら 2 つの出力が連結されて、256 個のチャネルがある最終的な出力が得られます。

googlenetresnet50 などの、より新しいハードウェアで学習したネットワークでは、学習用のフィルター グループは不要です。

ヒント

参照

[1] ImageNet. http://www.image-net.org

[2] Russakovsky, O., Deng, J., Su, H., et al. "ImageNet Large Scale Visual Recognition Challenge." International Journal of Computer Vision (IJCV). Vol 115, Issue 3, 2015, pp. 211–252

[3] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Advances in neural information processing systems. 2012.

[4] BVLC AlexNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

拡張機能

R2017a で導入