Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

alexnet

AlexNet 畳み込みニューラル ネットワーク

  • AlexNet network architecture

説明

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

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

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

net = alexnet は、ImageNet データセットで学習させた AlexNet ネットワークを返します。

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

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

net = alexnet('Weights','imagenet') は、ImageNet データセットで学習させた AlexNet ネットワークを返します。この構文は、net = alexnet と等価です。

layers = alexnet('Weights','none') は、未学習の AlexNet ネットワーク アーキテクチャを返します。未学習のモデルは、サポート パッケージを必要としません。

すべて折りたたむ

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 オブジェクトが返されます。

ディープ ネットワーク デザイナーを使用してネットワークを可視化します。

deepNetworkDesigner(alexnet)

ディープ ネットワーク デザイナーで [新規] をクリックし、事前学習済みの他のニューラル ネットワークを探索します。

Deep Network Designer start page showing available pretrained neural networks

ニューラル ネットワークをダウンロードする必要がある場合は、目的のニューラル ネットワークで一時停止し、[インストール] をクリックしてアドオン エクスプローラーを開きます。

この例では、事前学習済みの 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');

転移層と新しい層とで構成されるネットワークに学習させます。既定で、trainNetwork は、使用可能な GPU があれば GPU を使用し、なければ CPU を使用します。GPU で学習を行うには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。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 = 1×3

   227   227     3

イメージのサイズをネットワークの入力サイズに変更します。

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

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

label = classify(net,I)
label = categorical
     bell pepper 

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

figure
imshow(I)
title(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 個の検証イメージが格納されています。いくつかのサンプル イメージを表示します。

numImagesTrain = numel(imdsTrain.Labels);
idx = randperm(numImagesTrain,16);

for i = 1:16
    I{i} = readimage(imdsTrain,idx(i));
end

figure
imshow(imtile(I))

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

事前学習済みの 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] 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'    Grouped Convolution           2 groups of 128 5x5x48 convolutions with stride [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] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Grouped Convolution           2 groups of 192 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Grouped Convolution           2 groups of 128 3x3x192 convolutions with stride [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) を当てはめます。

mdl = fitcecoc(featuresTrain,YTrain);

テスト イメージの分類

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

YPred = predict(mdl,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(label)
end

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

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

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

出力引数

すべて折りたたむ

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

未学習の AlexNet 畳み込みニューラル ネットワーク アーキテクチャ。配列 Layer として返されます。

ヒント

参照

[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." Communications of the ACM 60, no. 6 (May 24, 2017): 84–90. https://doi.org/10.1145/3065386

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

拡張機能

バージョン履歴

R2017a で導入