主要内容

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

挤压网

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

说明

SqueezeNetは,深さが18层の畳み込みニューラルネットワークです0.100万枚を超えるイメージで学习させた事前学习済みのネットワークを,ImageNetデータベース[1]から読み込むことができます。この事前学习済みのネットワークは,イメージを1000个のオブジェクトカテゴリ(キーボード,マウス,铅笔,多くの动物など)に分类できます。结果として,このネットワークは広范囲のイメージに対する豊富な特徴表现を学习しています。この关数はSqueezeNet V1.1ネットワークを返します。このネットワークの精度はSqueezeNet 1.0と同様ですが,予测あたりに必要な浮动小数点演算回数は少なくなります[3]。ネットワークのイメージ入力サイズは 227 x 227です。MATLAB®の他の事前学习済みのネットワークについては,事前学习済みの深层ニューラルネットワークを参照してください。

分类を使用すると,SqueezeNetネットワークを使用して新しいイメージを分类できます。例については,SqueezeNetを使用したイメージの分类を参照してください。

SqueezeNetネットワークの再学习を行って,転移学习を使用して新しいタスクを実行できます。例については,SqueezeNetを使用した対话型の転移学习を参照してください。

=挤压网は、图像网データセットで学習させた 挤压网ネットワークを返します。

= squeezenet(“权重”,“imagenet”は,ImageNetデータセットで学习させたSqueezeNetネットワークを返します。この构文は,网= squeezenetと等価です。

lgraph= squeezenet(“权重”,'没有任何'は、未学習の 挤压网ネットワーク アーキテクチャを返します。

すべて折りたたむ

事前学习済みのSqueezeNetネットワークを読み込みます。

网= squeezenet
净= DAGNetwork与属性:层:[68×1 nnet.cnn.layer.Layer]连接:[75×2表]

この关数は,DAGNetworkオブジェクトを返します。

SqueezeNetは深学习工具箱™に含まれています。その他のネットワークを読み込むには,水壶などの关数を使用して,アドオンエクスプローラーから事前学习済みのネットワークをダウンロードするためのリンクを取得します。

この例では,事前学习済みのSqueezeNetネットワークを微调整して,新しいイメージコレクションを分类する方法を说明します。このプロセスは転移学习と呼ばれ,通常,新しいネットワークに学习させるよりもはるかに简単で时间がかかりません。これは,少ない数の学习イメージを使用して,新しいタスクに学习済みの特徴を适用できるためです。転移学习用のネットワークを対话形式で准备するには,ディープネットワークデザイナーを使用します。

データの解凍

ワークスペースで,MathWorks的专卖品データセットを解冻します。これは,75个のMathWorks公司の商品イメージから成る小さなデータセットであり,5つの异なるクラス(“cap”“立方体”,“打牌”,“螺丝刀”,“火炬”)に属します。

解压(“MerchData.zip”);

ディープネットワークデザイナーでSqueezeNetを開く

SqueezeNetでディープネットワークデザイナーを开きます。

deepNetworkDesigner(squeezenet);

ディープネットワークデザイナーの[デザイナー]ペインにネットワーク全体が缩小表示されます。

ネットワークのプロットを確認します。マウスでズームインするには,Ctrl键キーを押しながらスクロール ホイールを使用します。移動するには、方向キーを使用するか、スクロール ホイールを押したままでマウスをドラッグします。プロパティを表示する層を選択します。すべての層の選択を解除すると、[プロパティ]ペインにネットワークの概要が表示されます。

データのインポート

ディープネットワークデザイナーにデータを読み込むには,[データ]タブで,[データのインポート][イメージデータのインポート]をクリックします。[イメージ データのインポート] ダイアログ ボックスが開きます。

[データソース]リストの[フォルダー]を选択します。[参照]をクリックし,解凍したMerchDataフォルダーを選択します。

データを70%の学习データと30%の検证データに分割します。

学习イメージに対して実行する拡张演算を指定しますこの例では,X轴方向のランダムな反転,[ - 90,90]度の范囲のランダムな回転,[1,2]の范囲のランダムな再スケーリングを実行します。データ拡张は,ネットワークで过适合が発生したり,学习イメージの正确な详细が记忆されたりすることを防止するのに役立ちます。

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

データの可视化

ディープネットワークデザイナーを使用すると,[データ]タブにある学习データと検证データの分布を视覚的に検查できます。学习前の简単なチェックとして,ランダムな観测値とそのラベルを表示することもできます。この例では,データセットにクラスが5つあることが确认できます。

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

ネットワークの畳み込み層は、入力イメージを分類するために、最後の学習可能な層と最終分類層が使用するイメージの特徴を抽出します。挤压网のこれらの 2.つの層'conv10'および“分类层预测”は,ネットワークによって抽出された特徴を组み合わせてクラス确率,损失値,および予测ラベルにまとめる方法に关する情报を含んでいます。新しいイメージを分类するために事前学习済みのネットワークを再学习させるには,これら2つの层を新しいデータセットに适応させた新しい层に置き换えます。

ほとんどのネットワークでは,学習可能な重みを持つ最後の層は全結合層です。SqueezeNetなどの一部のネットワークでは,その代わりに最後の学習可能な層が最終畳み込み層となっています。この場合は,その畳み込み層を,クラスの数と同じ数のフィルターを持つ新しい畳み込み層に置き換えます。

[デザイナー]ペインで,新しいconvolution2dLayerをキャンバスにドラッグします。元の畳み込み層と一致させるために,FilterSize1,1に設定します。NumFiltersを新しいデータのクラス数(この例では5.) に変更します。

加权比率因子およびBiasLearnRateFactor10.に設定して学習率を変更し、新しい層での学習速度を転移層より速くします。最後の 2.次元畳み込み層を削除して、代わりに新しい層を結合します。

出力層を置き換えます。[层のライブラリ]の最后までスクロールして,新しい分类层をキャンバスにドラッグします。元の出力層を削除して、代わりに新しい層を結合します。

ネットワークの確認

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

ネットワークの学習

学习オプションの指定。[学習]タブを选択し,[学习オプション]をクリックします。

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

  • 各エポックで1回,検证データに対する精度が计算されるように,検证频度を指定します。

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

  • ミニバッチのサイズ,つまり各反复で使用するイメージの数を指定します。それぞれのエポックで必ずデータセット全体が使用されるように,学习サンプルの数を均等に分割するようミニバッチのサイズを设定します。

この例では,InitialLearnRate0.0001に,ValidationFrequency5.に,MaxEpochs8.に設定します。観測値が55個あるため,小匹匹匹匹配11.に設定します。

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

ディープ ネットワーク デザイナーでは、学習の進行状況の可視化と監視が行えます。必要に応じて、学習オプションを編集してネットワークを再学習させることができます。

結果のエクスポートとMATLABコードの生成

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

trainInfoStruct_1
trainInfoStruct_1 =同场的结构:培训损失:[1×40双倍]培训准确性:[1×40双倍]验证损失:[3.3420楠楠2.1187楠楠1.4291楠楠0.8527楠楠0.5849楠楠0.4678楠楠0.3967楠楠0.3875楠楠0.3749]验证准确性:[20楠楠楠30楠楠楠楠55.0000楠楠楠65楠楠楠楠楠85楠楠楠楠95楠楠楠楠楠95]基准利率:[1×40双倍]最终验证损失:0.3749最终验证准确率:95

使用するネットワークと学习オプションを再作成するMATLABコードを生成することもできます。[学習]タブの[エクスポート][学习用コードの生成]を选択します.MATLABコードを确认して,学习用のデータの准备,ネットワークアーキテクチャの作成,およびネットワークの学习をプログラムによって行う方法を学びます。

新しいイメージの分类

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

I=imread(“MerchDataTest.jpg”);

イメージサイズは学习の间,ネットワークの入力サイズに合うようにディープネットワークデザイナーにより変更されます。ネットワークの入力サイズを确认するには,[デザイナー]ペインに移动してimageInputLayer(最初の層) を選択します。このネットワークの入力サイズは 227 x 227です。

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

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

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

[YPred,probs] =分类(trainedNetwork_1,I);imshow(I)标记= YPred;标题(字符串(标签)+“,”+ num2str(100 *马克斯(聚合氯化铝),3)+“%”);

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

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

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

データの読み込み

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

解压(“MerchData.zip”);imd = imageDatastore ('MerchData'...'IncludeSubfolders',真的,...'LABELSOURCE'“foldernames”);

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

[imdsTrain,imdsValidation] = splitEachLabel(IMDS,0.7%,“随机”);

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

numTrainImages = numel(imdsTrain.Labels);IDX = randperm(numTrainImages,16);I = imtile(IMDS,“框架”,IDX);图imshow(I)

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

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

网= squeezenet;

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

analyzeNetwork(净)

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

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

最后の层の置き换え

ネットワークの畳み込み層は、入力イメージを分類するために、最後の学習可能な層と最終分類層が使用するイメージの特徴を抽出します。挤压网のこれらの 2.つの層'conv10'および“分类层预测”は,ネットワークによって抽出された特徴を组み合わせてクラス确率,损失値,および予测ラベルにまとめる方法に关する情报を含んでいます。新しいイメージを分类するために事前学习済みのネットワークを再学习させるには,これら2つの层を新しいデータセットに适応させた新しい层に置き换えます。

学習済みのネットワークから層グラフを抽出します。

lgraph = layerGraph(净);

置き換える 2.つの層の名前を見つけます。これは手動で行うことも、サポート関数FindlayerStore酒店を使用してこれらの层を自动的に见つけることもできます。

[learnableLayer, classLayer] = findLayersToReplace (lgraph);[learnableLayer, classLayer]
ANS = 1×2层阵列层:1 'conv10' 卷积1000轮1×1×512匝与步幅[1 1]和填充[0 0 0 0] -2 'ClassificationLayer_predictions' 分类输出crossentropyex与 '丁鲷' 和999等类

ほとんどのネットワークでは,学习可能な重みを持つ最后の层は全结合层です.SqueezeNetなどの一部のネットワークでは,その代わりに最后の学习可能な层が1×1畳み込み层となっています。この场合は,その畳み込み层を,クラスの数と同じ数のフィルターを持つ新しい畳み込み层に置き换えます。新しい层での学习速度を転移层より速くするには,畳み込み层の加权比率因子およびBiasLearnRateFactorの値を大きくします。

numClasses=numel(类别(imdsTrain.Labels))
numClasses = 5
newConvLayer = convolution2dLayer([1,1],numClasses,“WeightLearnRateFactor”,10,“BiasLearnRateFactor”,10,“姓名”'new_conv');lgraph=替换层(lgraph,'conv10',newConvLayer);

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

newClassificatonLayer = classificationLayer('姓名'“新类输出”);lgraph=替换层(lgraph,“分类层预测”,新分类层);

ネットワークの学習

ネットワークにはサイズが227 X 227×3の入力イメージが必要ですが,イメージデータストアにあるイメージのサイズは异なります。拡张イメージデータストアを使用して学习イメージのサイズを自动的に変更します。学习イメージに対して実行する追加の拡张演算として,学习イメージを縦轴に沿ってランダムに反転させる演算や,水平方向および垂直方向に最大30ピクセルだけランダムに平行移动させる演算を指定します。データ拡张は,ネットワークで过适合が発生したり,学习イメージの正确な详细が记忆されたりすることを防止するのに役立ちます。

pixelRange = [-30 30];imageaugmenter = imagedataAugmenter(...“RandXReflection”,真的,...“随机翻译”,pixelrange,...'RandYTranslation',pixelRange);augimdsTrain=增强的图像数据存储(inputSize(1:2),imdsTrain,...'dataaugmentation',imageAugmenter);

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

augimdsValidation=增强图像数据存储(inputSize(1:2),imdsValidation);

学习オプションを指定します。転移学习の场合,事前学习済みのネットワークの初期の层からの特徴(転移された层の重み)を保持します。転移层での学习速度を下げるため,初期学习率を小さい値に设定します。上记の手顺では,畳み込み层の学习率系数を大きくして,新しい最后の层での学习时间を短缩しています。この学习率设定の组み合わせによって,新しい层でのみ学习が急速に进み,他の层での学习速度は低下します。転移学习の実行时には,同じエポック数の学习を行う必要はありません。エポックとは,学习データセット全体の完全な学习サイクルのことです。エポックごとにすべてのデータが考虑されるように,ミニバッチのサイズを11に指定します。学习中はValidationFrequency回の反复ごとにネットワークが検证されます。

选项= trainingOptions(“sgdm”...“MiniBatchSize”,11,...'maxepochs',7,...'italllearnrate',2E-4,...“洗牌”“每个历元”...'ValidationData',augimdsValidation,...'ValidationFrequency'3,...“冗长”,错误的,...'plots'“训练进度”);

転移层と新しい层とで构成されるネットワークに学习させます。既定では,使用可能なGPUがある场合,Trainnetwork.は GPUを使用します。これには、并行计算工具箱™ とサポートされている GPUデバイスが必要です。サポートされているデバイスについては、リリース別のGPUサポート(并行计算工具箱)を参照してください。そうでない场合,Trainnetwork.はCPUを使用します。trainingOptionsの名前と値のペアの引数'executionenvironment'を使用して,実行环境を指定することもできます。

netTransfer=列车网络(augimdsTrain、lgraph、选项);

検证イメージの分类

微调整したネットワークを使用して検证イメージを分类します。

[YPred,得分]=分类(净转移,augimdsValidation);

4个のサンプル検证イメージと,その予测ラベルを表示します。

IDX = randperm(numel(imdsValidation.Files),4);数字为了i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(字符串(标签));结尾

検证セットに対する分类精度を计算します。精度とは,ネットワークによって予测が正しく行われるラベルの割合です。

YValidation = imdsValidation.Labels;精度=平均值(YPred == YValidation)
精度=1

分类精度の向上に关するヒントは,深层学习のヒントとコツを参照してください。

挤压网を使用してイメージの読み取り、サイズ変更、および分類を行います。

まず,事前学習済みのSqueezeNetモデルを読み込みます。

网= squeezenet;

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

I=imread(“peppers.png”);图imshow(I)

图中包含一个轴。这些轴包含一个image类型的对象。

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

SZ = net.Layers(1).InputSize
SZ =1×3227 227 3

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

I = imresize(I,SZ(1:2));图imshow(I)

图中包含一个轴。这些轴包含一个image类型的对象。

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

标记=分类(净,I)
标签=分类灯笼椒

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

图imshow(I)标题(标签)

图中包含一个坐标轴。标题为“甜椒”的轴包含一个类型为image的对象。

この例では,事前学习済みの畳み込みニューラルネットワークから学习済みのイメージの特徴を抽出し,これらの特徴を使用してイメージ分类器に学习させる方法を说明します。特徴抽出は,事前学习済みの深いネットワークの表现能力を活用できる最も简単で时间のかからない方法です。たとえば,抽出した特徴に対してfitcecoc(统计和机器学习工具箱)™) を使用してサポート ベクター マシン (支持向量机)に学習させることができます。特徴抽出が必要とするものはデータを一巡する 1.つのパスのみであるため、ネットワークの学習を加速するための GPUがない場合、これは適切な開始点となります。

データの読み込み

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

解压(“MerchData.zip”);imd = imageDatastore ('MerchData'...'IncludeSubfolders',真的,...'LABELSOURCE'“foldernames”);[imdsTrain,imdsTest] = splitEachLabel(IMDS,0.7%,“随机”);

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

numImagesTrain = numel(imdsTrain.Labels);IDX = randperm(numImagesTrain,16);I = imtile(IMDS,“框架”,IDX);图imshow(I)

图中包含一个轴。这些轴包含一个image类型的对象。

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

事前学习済みのSqueezeNetネットワークを読み込みます.SqueezeNetは,100万枚を超えるイメージについて学习済みであり,イメージを1000个のオブジェクトカテゴリ(キーボード,マウス,铅笔,多くの动物など)に分类できます。结果として,このモデルは広范囲のイメージに対する豊富な特徴表现を学习しています。

网= squeezenet;

ネットワーク アーキテクチャを解析します。

analyzeNetwork(净)

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

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

イメージの特徴の抽出

ネットワークは,入力イメージの階層表現を構築します。深い層には,それ以前の層の低レベルの特徴を使用して構築された,より高レベルの特徴が含まれます。学習イメージとテストイメージの特徴表現を取得するには,グローバル平均プーリング層'pool10'激活を使用します。イメージの低レベルの表现を取得するには,ネットワークの初期の层を使用します。

ネットワークにはサイズが227 X 227×3の入力イメージが必要ですが,イメージデータストアにあるイメージのサイズは异なります。学习およびテストイメージのサイズをネットワークへの入力前に自动的に変更するには,拡张イメージデータストアを作成して,目的のイメージサイズを指定し,これらのデータストアを激活の入力引数として使用します。

augimdsTrain=augmentedImageDatastore(inputSize(1:2),imdsTrain);augimdtest=augmentedImageDatastore(inputSize(1:2),imdsTest);层='pool10';特征应变=激活(净、螺旋应变、层、,'OutputAs'“行”); featuresTest=激活(净、模拟测试、层、,'OutputAs'“行”);

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

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

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

学习イメージから抽出された特徴を予测子変数として使用し,fitcecoc(统计和机器学习工具箱)を使用してマルチクラスサポートベクターマシン(SVM)をあてはめます。

mdl=fitcecoc(特征菌株,YTrain);

テストイメージの分类

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

featuresTest YPred =预测(mdl);

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

IDX = [1 5 10 15];数字为了i=1:numel(idx)子批次(2,2,i)i=readimage(imdsTest,idx(i));label=YPred(idx(i));imshow(i)title(label)结尾

图4个包含轴。轴1与标题MathWorks的第包含类型图像的对象。轴2与标题MathWorks的多维数据集包含类型图像的对象。轴3与标题MathWorks的扑克牌包含类型图像的对象。轴4与标题MathWorks的螺丝刀包含类型图像的对象。

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

精度=平均值(YPred == YTest)
精度=1

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

出力引数

すべて折りたたむ

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

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

参照

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

[2] Iandola,福雷斯特N.,宋焊,马修W. Moskewicz,哈立德阿什拉夫,威廉·J达利,和库尔特Keutzer。“SqueezeNet:AlexNet级的精度与50个更少的参数和<0.5 MB模型大小”预印本,提交11月4日,2016年https://arxiv.org/abs/1602.07360。

[3] Iandola,福雷斯特N “SqueezeNet”。https://github.com/forresti/SqueezeNet。

拡張機能

R2018aで導入