このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
alexnet
AlexNet 畳み込みニューラル ネットワーク
説明
AlexNet は、深さが 8 層の畳み込みニューラル ネットワークです。100 万個を超えるイメージで学習させた事前学習済みのネットワークを、ImageNet データベース[1]から読み込むことができます。この事前学習済みのネットワークは、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マウス、鉛筆、多くの動物など) に分類できます。結果として、このネットワークは広範囲のイメージに対する豊富な特徴表現を学習しています。ネットワークのイメージ入力サイズは 227 x 227 です。MATLAB® の他の事前学習済みのネットワークについては、事前学習済みの深層ニューラル ネットワークを参照してください。
classify
を使用すると、AlexNet ネットワークを使用して新しいイメージを分類できます。GoogLeNet を使用したイメージの分類の手順に従って、GoogLeNet を AlexNet に置き換えます。
実際の深層学習の各種手法を無料でお試しいただくには、ディープ ラーニング入門をご覧ください。
は、ImageNet データセットで学習させた AlexNet ネットワークを返します。net
= alexnet
この関数には、Deep Learning Toolbox™ Model for AlexNet Network サポート パッケージが必要です。このサポート パッケージがインストールされていない場合、関数によってダウンロード用リンクが表示されます。または、Deep Learning Toolbox Model for AlexNet Network を参照してください。
MATLAB の他の事前学習済みのネットワークについては、事前学習済みの深層ニューラル ネットワークを参照してください。
は、ImageNet データセットで学習させた AlexNet ネットワークを返します。この構文は、net
= alexnet('Weights','imagenet'
)net = alexnet
と等価です。
は、未学習の 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)
ディープ ネットワーク デザイナーで [新規] をクリックし、事前学習済みの他のニューラル ネットワークを探索します。
ニューラル ネットワークをダウンロードする必要がある場合は、目的のニューラル ネットワークで一時停止し、[インストール] をクリックしてアドオン エクスプローラーを開きます。
AlexNet を使用した転移学習
この例では、事前学習済みの 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 を使用してイメージの読み取り、サイズ変更、および分類を行います。最初に、事前学習済みの 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)
AlexNet を使用した特徴抽出
この例では、事前学習済みの畳み込みニューラル ネットワークから学習済みのイメージの特徴を抽出し、これらの特徴を使用してイメージ分類器に学習させる方法を説明します。特徴抽出は、事前学習済みの深いネットワークの表現能力を活用できる最も簡単で時間のかからない方法です。たとえば、抽出した特徴に対して 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 は高い精度を示しています。特徴抽出を使用しても十分な精度が得られない場合、代わりに転移学習を試してください。
出力引数
net
— 事前学習済み AlexNet 畳み込みニューラル ネットワーク
SeriesNetwork
オブジェクト
事前学習済みの AlexNet 畳み込みニューラル ネットワーク。SeriesNetwork
オブジェクトとして返されます。
layers
— 未学習の AlexNet 畳み込みニューラル ネットワーク アーキテクチャ
Layer
配列
未学習の 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
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
コード生成の場合、構文 net = alexnet
を使用するか、関数 alexnet
を coder.loadDeepLearningNetwork
(MATLAB Coder) に渡すことによって、ネットワークを読み込むことができます。次に例を示します。net = coder.loadDeepLearningNetwork('alexnet')
詳細については、コード生成のための事前学習済みネットワークの読み込み (MATLAB Coder)を参照してください。
構文 alexnet('Weights','none')
はコード生成でサポートされていません。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
使用上の注意および制限:
コード生成の場合、構文
net = alexnet
を使用するか、関数alexnet
をcoder.loadDeepLearningNetwork
(GPU Coder) に渡すことによって、ネットワークを読み込むことができます。次に例を示します。net = coder.loadDeepLearningNetwork('alexnet')
詳細については、コード生成用の事前学習済みのネットワークの読み込み (GPU Coder)を参照してください。
構文
alexnet('Weights','none')
は GPU コード生成でサポートされていません。
バージョン履歴
R2017a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)