Main Content

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

resnet18

ResNet-18 畳み込みニューラル ネットワーク

  • ResNet-18 network architecture

説明

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

classify を使用すると、ResNet-18 モデルを使用して新しいイメージを分類できます。GoogLeNet を使用したイメージの分類の手順に従って、GoogLeNet を ResNet-18 に置き換えます。

新しい分類タスクでネットワークの再学習を行うには、新しいイメージを分類するための深層学習ネットワークの学習の手順に従い、GoogLeNet の代わりに ResNet-18 を読み込みます。

ヒント

イメージ分類タスクに適した未学習の残差ネットワークを作成するには、resnetLayers を使用します。

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

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

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

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

すべて折りたたむ

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

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

resnet18

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

resnet18
ans = 

  DAGNetwork with properties:

         Layers: [72×1 nnet.cnn.layer.Layer]
    Connections: [79×2 table]

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

deepNetworkDesigner(resnet18)

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

Deep Network Designer start page showing available pretrained neural networks

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

事前学習済みの ResNet-18 モデルを読み込みます。

net = resnet18;

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

I = imread("peppers.png");
imshow(I)

Figure contains an axes object. The axes object contains an object of type image.

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

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

   224   224     3

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

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

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

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

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

imshow(I)
title(label)

Figure contains an axes object. The axes object with title bell pepper contains an object of type image.

ワークスペースで、MathWorks Merch データセットを解凍します。

unzip("MerchData.zip");

ディープ ネットワーク デザイナーを開いて、利用可能な事前学習済みネットワークを確認します。

deepNetworkDesigner

[ResNet-18] を選択し、[開く] をクリックします。Deep Learning Toolbox™ Model for ResNet-18 Network がインストールされていない場合、ソフトウェアは "アドオン エクスプローラー" を開きます。

ディープ ネットワーク デザイナーにデータを読み込むには、[データ] タブで、[データのインポート][イメージ分類データのインポート] をクリックします。[データ ソース] リストの [フォルダー] を選択します。[参照] をクリックし、解凍した MerchData フォルダーを選択します。

データを学習データセットと検証データセットに分割します。イメージの 70% を学習に使用し、30% を検証に使用します。[ランダム化] を選択し、指定した割合でイメージを検証セットと学習セットにランダムに割り当てます。

[インポート] をクリックして、ディープ ネットワーク デザイナーにデータをインポートします。

インポートされたデータの概要がアプリによって表示されます。

新しいイメージを分類するように事前学習済みのネットワークに再学習させるには、最後の学習可能な層と最終分類層を新しいデータ セットに適応させます。

[デザイナー] タブで最後の全結合層をクリックします。[プロパティ] ペインの下部で、[層のロックを解除] をクリックします。表示される警告ダイアログで、[ロックの強制解除] をクリックします。これにより層のプロパティのロックが解除され、それらを新しいタスクに適応できるようになります。

R2023b より前: 層のプロパティを編集するには、層のロックを解除するのではなく、層を置き換えなければなりません。

OutputSize を新しいデータのクラス数 (この例では 5) に設定します。学習率を編集して、新しい層での学習速度を転移層より速くします。WeightLearnRateFactor および BiasLearnRateFactor10 に設定します。

分類層を選択し、[層のロックを解除] をクリックしてから、[ロックの強制解除] をクリックします。ロックが解除された出力層に対して OutputSize を設定する必要はありません。学習時に、ディープ ネットワーク デザイナーによって層の出力クラスがデータから自動的に設定されます。

学習オプションを指定します。[学習] タブを選択し、[学習オプション] をクリックします。[Solver]sgdm[InitialLearnRate]0.0001[MiniBatchSize]11[MaxEpochs]8[ValidationFrequency]5 に設定します。

指定した学習オプションでネットワークに学習させるには、[OK] をクリックしてから [学習] をクリックします。

学習した重みを含むネットワーク アーキテクチャをエクスポートするには、[学習] タブの [エクスポート][学習済みネットワークと結果のエクスポート] を選択します。ディープ ネットワーク デザイナーによって、学習済みネットワークが変数 trainedNetwork_1 としてエクスポートされます。

学習済みネットワークを使用して分類する新しいイメージを読み込みます。

I = imread("MerchDataTest.jpg");

イメージ サイズは学習の間、ネットワークの入力サイズに合うようにディープ ネットワーク デザイナーにより変更されます。ネットワークの入力サイズを確認するには、[デザイナー] ペインに移動して imageInputLayer (最初の層) を選択します。このネットワークの入力サイズは 224 x 224 です。

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

I = imresize(I,[224 224]);

学習済みネットワークを使用してテスト イメージを分類します。

YPred = classify(trainedNetwork_1,I);
imshow(I)
title("Predicted Class: " + string(YPred));

事前学習済みの ResNet-18 ニューラル ネットワークを読み込み、入力サイズを求めます。

net = resnet18;
inputSize = net.Layers(1).InputSize;

MathWorks Merch データ セットを抽出します。新しいイメージをイメージ データストアとして読み込みます。

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

numClasses = numel(categories(imds.Labels));

データを学習データセットと検証データセットに分割します。"randomized" を選択し、指定した割合でイメージを検証セットと学習セットにランダムに割り当てます。

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

拡張イメージ データストアを使用して、ネットワークの入力サイズに一致するように学習イメージのサイズを自動的に変更します。

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

事前学習済みのネットワークに再学習させて新しいイメージを分類するには、最後の全結合層と最終分類層を、新しいデータ セットに適応した新しい層に置き換えます。まず、学習済みのネットワークから層グラフを抽出します。

lgraph = layerGraph(net); 

全結合層を、クラスの数と同じ数の出力をもつ新しい全結合層に置き換えます。新しい層での学習速度を転移層より速くするには、全結合層の WeightLearnRateFactor および BiasLearnRateFactor の値を大きくします。

newLearnableLayer = fullyConnectedLayer(numClasses, ...
    WeightLearnRateFactor=10, ...
    BiasLearnRateFactor=10);
    
lgraph = replaceLayer(lgraph,"fc1000",newLearnableLayer);

分類層はネットワークの出力クラスを指定します。分類層をクラス ラベルのない新しい層に置き換えます。trainNetwork は、学習時に層の出力クラスを自動的に設定します。

newClassLayer = classificationLayer;
lgraph = replaceLayer(lgraph,"ClassificationLayer_predictions",newClassLayer);

学習オプションを指定します。転移層での学習速度を下げるため、初期学習率を小さい値に設定します。

options = trainingOptions("sgdm", ...
    InitialLearnRate=0.0001, ...
    MiniBatchSize=11, ...
    MaxEpochs=8, ...
    ValidationData=augimdsValidation, ...
    ValidationFrequency=5, ...
    Verbose=false, ...
    Plots="training-progress");

ネットワークに学習をさせます。

trainedNetwork = trainNetwork(augimdsTrain,lgraph,options);

Figure Training Progress (29-Aug-2023 21:12:57) contains 2 axes objects and another object of type uigridlayout. Axes object 1 with xlabel Iteration, ylabel Loss contains 15 objects of type patch, text, line. Axes object 2 with xlabel Iteration, ylabel Accuracy (%) contains 15 objects of type patch, text, line.

学習済みネットワークを使用して分類する新しいイメージを読み込みます。

I = imread("MerchDataTest.jpg");
I = imresize(I,inputSize(1:2));

テスト イメージを分類します。

YPred = classify(trainedNetwork,I);
imshow(I)
title("Predicted class: " + string(YPred));

Figure contains an axes object. The axes object with title Predicted class: MathWorks Cube contains an object of type image.

出力引数

すべて折りたたむ

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

未学習の ResNet-18 畳み込みニューラル ネットワーク アーキテクチャ。LayerGraph オブジェクトとして返されます。

参照

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

[2] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Deep residual learning for image recognition." In Proceedings of the IEEE conference on computer vision and pattern recognition, pp. 770-778. 2016.

拡張機能

バージョン履歴

R2018a で導入