メインコンテンツ

imagePretrainedNetwork

イメージ用の事前学習済みニューラル ネットワーク

R2024a 以降

    説明

    imagePretrainedNetwork 関数は、事前学習済みのニューラル ネットワークを読み込み、必要に応じてニューラル ネットワーク アーキテクチャを転移学習と微調整に適応させます。

    [net,classNames] = imagePretrainedNetwork は、事前学習済みの SqueezeNet ニューラル ネットワークとネットワーク クラス名を返します。このネットワークは、1000 個のクラスの ImageNet データ セットで学習済みです。

    [net,classNames] = imagePretrainedNetwork(name) は、指定された事前学習済みニューラル ネットワークとそのクラス名を返します。

    [net,classNames] = imagePretrainedNetwork(___,Name=Value) は、前の構文の入力引数の任意の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、Weights="none" は、事前学習済みの重みなしで、初期化されていないニューラル ネットワークを返すように指定します。

    すべて折りたたむ

    事前学習済みの SqueezeNet ニューラル ネットワークとネットワーク クラス名をワークスペースに読み込みます。

    [net,classNames] = imagePretrainedNetwork;

    ネットワークのプロパティを表示します。

    net
    net = 
      dlnetwork with properties:
    
             Layers: [68×1 nnet.cnn.layer.Layer]
        Connections: [75×2 table]
         Learnables: [52×3 table]
              State: [0×3 table]
         InputNames: {'data'}
        OutputNames: {'prob_flatten'}
        Initialized: 1
    
      View summary with summary.
    
    

    最初のいくつかのクラス名を表示します。

    head(classNames)
        "tench"
        "goldfish"
        "great white shark"
        "tiger shark"
        "hammerhead"
        "electric ray"
        "stingray"
        "cock"
    

    事前学習済みの SqueezeNet ニューラル ネットワークをワークスペースに読み込みます。

    [net,classNames] = imagePretrainedNetwork;

    イメージを PNG ファイルから読み取って分類します。イメージを分類するには、最初にイメージをデータ型 single に変換します。

    im = imread("peppers.png");
    figure
    imshow(im)

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

    X = single(im);
    scores = predict(net,X);
    [label,score] = scores2label(scores,classNames);

    予測されたラベルと対応するスコアを含むイメージを表示します。

    figure
    imshow(im)
    title(string(label) + " (Score: " + score + ")")

    Figure contains an axes object. The hidden axes object with title bell pepper (Score: 0.89394) contains an object of type image.

    ニューラル ネットワークを新しいタスクに合うように適応させ、学習した重みを開始点として使用することで、新しいデータセットを事前学習済みのネットワークに再学習させることができます。ネットワークを新しいデータに適応させるには、最後のいくつかの層 (ネットワーク ヘッドと呼ばれる) を置き換えて、新しいタスクの各クラスの予測スコアを出力するようにします。

    学習データの読み込み

    MathWorks™ Merch データ セットを解凍します。これは、5 つの異なるクラスに属する 75 個の MathWorks の商品イメージが格納された小さなデータ セットです。データは、これら 5 つのクラスに対応するサブフォルダーにイメージが置かれる配置になっています。

    folderName = "MerchData";
    unzip("MerchData.zip",folderName);

    イメージ データ ストアを作成します。イメージ データストアを使用すると、イメージ データの大規模なコレクション (メモリに収まらないデータなど) を格納し、ニューラル ネットワークの学習時にイメージをバッチ単位で効率的に読み取ることができます。抽出したイメージがあるフォルダーを指定し、サブフォルダー名がイメージ ラベルに対応していることを示します。

    imds = imageDatastore(folderName, ...
        IncludeSubfolders=true, ...
        LabelSource="foldernames");

    いくつかのサンプル イメージを表示します。

    numImages = numel(imds.Labels);
    idx = randperm(numImages,16);
    I = imtile(imds,Frames=idx);
    figure
    imshow(I)

    クラス名とクラス数を表示します。

    classNames = categories(imds.Labels)
    classNames = 5×1 cell
        {'MathWorks Cap'          }
        {'MathWorks Cube'         }
        {'MathWorks Playing Cards'}
        {'MathWorks Screwdriver'  }
        {'MathWorks Torch'        }
    
    
    numClasses = numel(classNames)
    numClasses = 
    5
    

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

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

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

    事前学習済みの SqueezeNet ニューラル ネットワークをワークスペースに読み込みます。新しいデータ用に再学習させる準備ができたニューラル ネットワークを返すには、クラスの数を指定します。

    net = imagePretrainedNetwork(NumClasses=numClasses)
    net = 
      dlnetwork with properties:
    
             Layers: [68×1 nnet.cnn.layer.Layer]
        Connections: [75×2 table]
         Learnables: [52×3 table]
              State: [0×3 table]
         InputNames: {'data'}
        OutputNames: {'prob_flatten'}
        Initialized: 1
    
      View summary with summary.
    
    

    ニューラル ネットワークの入力サイズを入力層から取得します。

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

    ネットワーク ヘッドの学習可能なパラメーターの層 (学習可能なパラメーターをもつ最後の層) は再学習が必要です。この層は通常、クラス数と一致する出力サイズをもつ全結合層または畳み込み層です。

    この層の更新レベルを上げ、収束を高速化するには、setLearnRateFactor 関数を使用して、学習可能なパラメーターの学習率係数を増やします。学習可能なパラメーターの学習率係数を 10 に設定します。

    net = setLearnRateFactor(net,"conv10/Weights",10);
    net = setLearnRateFactor(net,"conv10/Bias",10);

    学習用データの準備

    データストア内のイメージのサイズはさまざまです。学習イメージのサイズを自動的に変更するには、拡張イメージ データストアを使用します。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのにも役立ちます。学習イメージに対して実行するそのような追加の拡張演算として、学習イメージを縦軸に沿ってランダムに反転させる演算や、水平方向および垂直方向に最大 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);
    augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

    学習オプションの指定

    学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、実験マネージャーアプリを使用できます。

    この例では、次のオプションを使用します。

    • Adam オプティマイザーを使用して学習させます。

    • 事前学習済みの重みの更新レベルを下げるために、より小さな学習率を使用します。学習率を 0.0001 に設定します。

    • 5 回の反復ごとに検証データを使用してネットワークを検証します。データセットが大きい場合、検証によって学習の速度が低下しないようにするには、この値を増やします。

    • 学習の進行状況をプロットで表示し、精度メトリクスを監視します。

    • 詳細出力を無効にします。

    options = trainingOptions("adam", ...
        InitialLearnRate=0.0001, ...
        ValidationData=augimdsValidation, ...
        ValidationFrequency=5, ...
        Plots="training-progress", ...
        Metrics="accuracy", ...
        Verbose=false);

    ニューラル ネットワークの学習

    関数trainnetを使用してニューラル ネットワークに学習させます。分類には、クロスエントロピー損失を使用します。既定では、関数 trainnet は利用可能な GPU がある場合にそれを使用します。GPU を使用するには、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。そうでない場合、関数 trainnet は CPU を使用します。実行環境を指定するには、ExecutionEnvironment 学習オプションを使用します。

    net = trainnet(augimdsTrain,net,"crossentropy",options);

    ニューラル ネットワークのテスト

    testnet関数を使用してニューラル ネットワークをテストします。単一ラベルの分類では、精度を評価します。精度は、正しい予測の割合です。既定では、testnet 関数は利用可能な GPU がある場合にそれを使用します。実行環境を手動で選択するには、testnet 関数の ExecutionEnvironment 引数を使用します。

    accuracy = testnet(net,augimdsTest,"accuracy")
    accuracy = 
    100
    

    予測の実行

    テスト イメージを読み取って表示します。

    im = imread("MerchDataTest.jpg");
    figure
    imshow(im)

    ニューラル ネットワークを使用して予測を行います。単一のイメージで予測を行うには、イメージをデータ型 single に変換し、predict関数を使用します。GPU が利用可能な場合は、まずデータを gpuArray に変換します。複数のイメージで予測を行うには、minibatchpredict関数を使用します。

    X = single(im);
    
    if canUseGPU
        X = gpuArray(X);
    end
    
    scores = predict(net,X);
    label = scores2label(scores,classNames);

    イメージと予測を表示します。

    figure
    imshow(im)
    title("Prediction: " + string(label))

    入力引数

    すべて折りたたむ

    事前学習済みニューラル ネットワークの名前。次のいずれかの値として指定します。

    imagePretrainedNetwork のモデル名引数ニューラル ネットワーク名深さパラメーター メモリパラメーター数 (100 万個単位)イメージ入力サイズ入力値の範囲入力層の正規化必要なサポート パッケージ
    "squeezenet"SqueezeNet [2] 18

    4.7 MB

    1.24

    227-by-227

    [0, 255]"zerocenter"なし
    "googlenet"GoogLeNet [3][4]22

    27 MB

    7.0

    224-by-224

    [0, 255]"zerocenter"

    Deep Learning Toolbox™ Model for GoogLeNet Network

    "googlenet-places365"[0, 255]"zerocenter"
    "inceptionv3"Inception-v3 [5]48

    91 MB

    23.9

    299-by-299

    [0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Inception-v3 Network
    "densenet201"DenseNet-201 [6]201

    77 MB

    20.0

    224-by-224

    [0, 255]"zscore"Deep Learning Toolbox Model for DenseNet-201 Network
    "mobilenetv2"MobileNet-v2 [7]53

    14 MB

    3.5

    224-by-224

    [0, 255]"zscore"Deep Learning Toolbox Model for MobileNet-v2 Network
    "resnet18"ResNet-18 [8]18

    45 MB

    11.7

    224-by-224

    [0, 255]"zscore"Deep Learning Toolbox Model for ResNet-18 Network
    "resnet50"ResNet-50 [8]50

    98 MB

    25.6

    224-by-224

    [0, 255]"zscore"Deep Learning Toolbox Model for ResNet-50 Network
    "resnet101"ResNet-101 [8]101

    171 MB

    44.6

    224-by-224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for ResNet-101 Network
    "xception"Xception [9]71

    88 MB

    22.9299-by-299[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Xception Network
    "inceptionresnetv2"Inception-ResNet-v2 [10]164

    213 MB

    55.9

    299-by-299

    [0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Inception-ResNet-v2 Network
    "shufflenet"ShuffleNet [11]505.5 MB1.4224-by-224[0, 255]"zscore"Deep Learning Toolbox Model for ShuffleNet Network
    "nasnetmobile"NASNet-Mobile [12]*20 MB 5.3224-by-224[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for NASNet-Mobile Network
    "nasnetlarge"NASNet-Large [12]*340 MB88.9331-by-331[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for NASNet-Large Network
    "darknet19"DarkNet-19 [13]1980 MB20.8256 x 256[0, 255]"rescale-zero-one"Deep Learning Toolbox Model for DarkNet-19 Network
    "darknet53"DarkNet-53 [13]53159 MB41.6256 x 256[0, 255]"rescale-zero-one"Deep Learning Toolbox Model for DarkNet-53 Network
    "efficientnetb0"EfficientNet-b0 [14]8220 MB5.3

    224-by-224

    [0, 255]"zscore"Deep Learning Toolbox Model for EfficientNet-b0 Network
    "alexnet"AlexNet [15]8

    233 MB

    61.0

    227-by-227

    [0, 255]"zerocenter"Deep Learning Toolbox Model for AlexNet Network
    "vgg16"VGG-16 [16]16

    528 MB

    138

    224-by-224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for VGG-16 Network
    "vgg19"VGG-19 [16]19

    548 MB

    144

    224-by-224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for VGG-19 Network

    メモ

    Weights オプションを "none" に設定した場合、ほとんどのモデルではサポート パッケージをダウンロードする必要はありません。

    名前と値の引数

    すべて折りたたむ

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

    例: net = imagePretrainedNetwork("googlenet",NumClasses=10) は、10 クラス分類タスク用に再学習させる準備ができた、事前学習済みの GoogLeNet ニューラル ネットワークを返します。

    分類タスクのクラス数。正の整数または [] として指定します。

    NumClasses が整数の場合、imagePretrainedNetwork 関数は、ネットワークの分類ヘッド内の学習可能なパラメーターの層を置き換えることにより、指定された数のクラスをもつ分類タスク用に事前学習済みニューラル ネットワークを適応させます。

    NumClasses オプションを指定した場合、NumResponses[] でなければならず、関数は classNames 引数を出力してはなりません。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    回帰タスクの応答数。正の整数または [] として指定します。

    NumResponses が整数の場合、imagePretrainedNetwork 関数は、ネットワークの分類ヘッドを回帰タスクのヘッドに置き換えることで、指定された応答数をもつ回帰タスク用に事前学習済みニューラル ネットワークを適応させます。

    NumResponses オプションを指定した場合、NumClasses[] でなければならず、関数は classNames 引数を出力してはなりません。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    ニューラル ネットワークの重み。次のいずれかの値として指定します。

    • "pretrained" — 事前学習済みの重みをもつニューラル ネットワークを返します。

    • "none" — 初期化されていないニューラル ネットワーク アーキテクチャのみを返します。この場合、ほとんどのネットワークではサポート パッケージをダウンロードする必要はありません。

    クラス名の型。次のいずれかの値として指定します。

    • "string" — クラス名を string 配列として返します。

    • "cell" — クラス名を文字ベクトルの cell 配列として返します。コード生成にはこのオプションを使用します。

    出力引数

    すべて折りたたむ

    ニューラル ネットワーク。dlnetwork オブジェクトとして返されます。

    クラス名は、string 配列または文字ベクトルの cell 配列として返されます。

    この関数は、NumClassesNumResponses の両方の値が [] の場合にのみクラス名を返します。classNames のデータ型は、ClassNamesTypes 引数によって異なります。

    データ型: string | cell

    ヒント

    • 2 次元および 3 次元の ResNet ニューラル ネットワーク アーキテクチャを作成およびカスタマイズするには、それぞれ resnetNetwork 関数と resnet3dNetwork 関数を使用します。

    参照

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

    [2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. “SqueezeNet: AlexNet-Level Accuracy with 50x Fewer Parameters and <0.5MB Model Size.” Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

    [3] Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. “Going Deeper with Convolutions.” In 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 1–9. Boston, MA, USA: IEEE, 2015. https://doi.org/10.1109/CVPR.2015.7298594.

    [4] Places. http://places2.csail.mit.edu/

    [5] Szegedy, Christian, Vincent Vanhoucke, Sergey Ioffe, Jon Shlens, and Zbigniew Wojna. “Rethinking the Inception Architecture for Computer Vision.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2818–26. Las Vegas, NV, USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.308.

    [6] Huang, Gao, Zhuang Liu, Laurens Van Der Maaten, and Kilian Q. Weinberger. “Densely Connected Convolutional Networks.” In 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2261–69. Honolulu, HI: IEEE, 2017. https://doi.org/10.1109/CVPR.2017.243.

    [7] Sandler, Mark, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, and Liang-Chieh Chen. “MobileNetV2: Inverted Residuals and Linear Bottlenecks.” In 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition, 4510–20. Salt Lake City, UT: IEEE, 2018. https://doi.org/10.1109/CVPR.2018.00474.

    [8] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. “Deep Residual Learning for Image Recognition.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 770–78. Las Vegas, NV, USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.90.

    [9] Chollet, François. “Xception: Deep Learning with Depthwise Separable Convolutions.” Preprint, submitted in 2016. https://doi.org/10.48550/ARXIV.1610.02357.

    [10] Szegedy, Christian, Sergey Ioffe, Vincent Vanhoucke, and Alexander Alemi. “Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning.” Proceedings of the AAAI Conference on Artificial Intelligence 31, no. 1 (February 12, 2017). https://doi.org/10.1609/aaai.v31i1.11231.

    [11] Zhang, Xiangyu, Xinyu Zhou, Mengxiao Lin, and Jian Sun. “ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices.” Preprint, submitted July 4, 2017. http://arxiv.org/abs/1707.01083.

    [12] Zoph, Barret, Vijay Vasudevan, Jonathon Shlens, and Quoc V. Le. “Learning Transferable Architectures for Scalable Image Recognition.” Preprint, submitted in 2017. https://doi.org/10.48550/ARXIV.1707.07012.

    [13] Redmon, Joseph. “Darknet: Open Source Neural Networks in C.” https://pjreddie.com/darknet.

    [14] Tan, Mingxing, and Quoc V. Le. “EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks.” Preprint, submitted in 2019. https://doi.org/10.48550/ARXIV.1905.11946.

    [15] 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.

    [16] Simonyan, Karen, and Andrew Zisserman. “Very Deep Convolutional Networks for Large-Scale Image Recognition.” Preprint, submitted in 2014. https://doi.org/10.48550/ARXIV.1409.1556.

    拡張機能

    すべて展開する

    バージョン履歴

    R2024a で導入