主要内容

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

イメージ分類用の積層自己符号化器の学習

この例では,積層自己符号化器に学習させて,数字のイメージを分類する方法を説明します。

複数の隠れ層があるニューラルネットワークは,イメージなどデータが複雑である分類問題を解くのに役立ちます。各層は,異なる抽象化レベルで特徴を学習できます。ただし,複数の隠れ層があるニューラルネットワークの学習は,実際には難しい場合があります。

複数の層があるニューラルネットワークの学習を行う効果的な方法の1つは,一度に1つの層の学習を行うことです。これを行うには,目的の各隠れ層に対して自己符号化器として知られている特殊なネットワークの学習を行います。

この例では,2つの隠れ层があるニューラルネットワークの学习を行い,イメージ内の数字を分类する方法を说明します。最初に,自己符号化器を使用して教师なしの方法で个々の隠れ层の学习を行います。次に,最后のソフトマックス层の学习を行い,层を结合して积层ネットワークを形成し,教师ありの方法でもう一度このネットワークの学习を行います。

データセット

この例では,学習とテストの全体をとおして合成データを使用します。合成イメージは,さまざまなフォントを使用して作成された数字のイメージにランダムなアフィン変換を適用して生成されたものです。

それぞれの数字イメージは28 x 28ピクセルで,5000個の学習例があります。学習データを読み込み,一部のイメージを表示できます。

%将训练数据载入记忆[xTrainImages, tTrain] = digitTrainCellArrayData;%显示一些训练图像clfI = 1:20副区(4,5,i)的;imshow(xTrainImages {I});结束

イメージのラベルは,10行5000列の行列に格纳されます。この行列は,すべての列で数字が属するクラスを示す1つの要素が1になり,列内の他のすべての要素は0になります0.10番目の要素が1の场合,数字イメージは0であることに注意してください。

最初の自己符号化器の学习

はじめに,ラベルを使用しない学习データでスパース自己符号化器の学习を行います。

自己符号化器とは,出力で入力を複製しようとするニューラルネットワークです。したがって,入力のサイズは出力のサイズと同じになります。隠れ層のニューロンの数が入力のサイズより小さい場合,自己符号化器は入力の圧縮表現を学習します。

ニューラルネットワークには,学習前にランダムに初期化された重みが設定されます。そのため,学習の結果は毎回異なります。この動作を回避するには,乱数発生器のシードを明示的に設定します。

RNG('默认'

自己符号化器の隠れ层のサイズを设定します。学习を行う自己符号化器に対して,入力サイズより小さいサイズを设定することをお勧めします。

hiddenSize1 = 100;

学習を行う自己符号化器のタイプは,スパース自己符号化器です。この自己符号化器は,正則化項を使用して最初の層のスパース表現を学習します。さまざまなパラメーターを設定することで,これらの正則化項の影響を制御できます。

  • L2WeightRegularizationは,ネットワークの重み(バイアスを除く)に対するL2正則化項の影響を制御します。これは一般的に,非常に小さくする必要があります。

  • SparsityRegularizationは,隠れ层からの出力のスパース性に制约を课そうとする,スパース正则化项の影响を制御します。これは,重みに対するスパース正则化项の适用とは异なるので注意してください。

  • SparsityProportionはスパース正則化項のパラメーターです。これは,隠れ層からの出力のスパース性を制御します。SparsityProportionに低い値を指定すると,通常,隠れ层の各ニューロンは,少数の学习例の出力を大きくした场合に限り “特殊化” します。たとえば,SparsityProportion0.1をに設定するのは,隠れ層の各ニューロンの学習例に対する平均出力が0.1になるようにすることと等価です。この値は0 ~ 1でなければなりません。理想値は問題の性質によって異なります。

ここで,上記の正則化項に値を指定して,自己符号化器の学習を行います。

autoenc1 = trainAutoencoder (xTrainImages hiddenSize1,...“MaxEpochs”, 400,...“L2WeightRegularization”, 0.004,...“SparsityRegularization”4,...'SparsityProportion', 0.15,...“ScaleData”、假);

自己符号化器の図を表示できます。自己符号化器は、符号化器と、その後に続く復号化器で構成されています。符号化器は隠れ表現に入力をマッピングし、復号化器はこのマッピングを逆にして元の入力を再構成しようとします。

视图(autoenc1)

最初の自己符号化器の重みの可視化

自己符号化器の符号化器部分で学習されたマッピングは,データからの特徴の抽出に役立ちます。符号化器の各ニューロンには関連付けられた重みのベクトルがあり,この重みのベクトルは,特定の視覚的な特徴に応答するように調整されます。これらの特徴の表現を表示できます。

图()plotWeights(autoenc1);

自己符号化器によって学习された特徴が,数字イメージに含まれる曲线や直线のパターンを表すことを确认できます。

自己符号化器の隠れ層の100次元の出力は,入力を圧縮したものです。これには,上記の可視化された特徴に対する応答がまとめられています。学習データから抽出されたこれらの一連のベクトルで,次の自己符号化器の学習を行います。まず,学習済みの自己符号化器の符号化器を使用して,特徴を生成しなければなりません。

feat1 =编码(autoenc1 xTrainImages);

2番目の自己符号化器の学习

最初の自己符号化器の学習を行った後,同様に2番目の自己符号化器の学習を行います。主な違いは2番目の自己符号化器では,最初の自己符号化器によって生成された特徴を学習データとして使用することです。また,隠れ表現のサイズを50に減らして,2番目の自己符号化器の符号化器によって入力データのさらに小さい表現の学習が行われるようにします。

hiddenSize2 = 50;autoenc2 = trainAutoencoder (feat1 hiddenSize2,...“MaxEpochs”, 100,...“L2WeightRegularization”, 0.002,...“SparsityRegularization”4,...'SparsityProportion', 0.1,...“ScaleData”、假);

この场合にも,关数视图を使用して自己符号化器の図を表示できます。

视图(autoenc2)

前のセットを2番目の自己符号化器の符号化器に渡すことによって,特徴の2番目のセットを抽出できます。

feat2 =编码(autoenc2 feat1);

学習データの元のベクトルは784次元でした。これらを1番目の符号化器に渡した後は,100次元に減少しています。2番目の符号化器を使用した後は,さらに50次元に減少しています。これで50次元のベクトルを異なる数字クラスに分類するように,最後の層の学習を行うことができます。

最后のソフトマックス层の学习

50次元の特徴ベクトルを分类するように,ソフトマックス层の学习を行います。自己符号化器とは异なり,学习データのラベルを使用して教师ありの方法でソフトマックス层の学习を行います。

SOFTNET = trainSoftmaxLayer(FEAT2,tTrain,“MaxEpochs”, 400);

関数视图を使用してソフトマックス層の図を表示できます。

视图(SOFTNET)

積層ニューラルネットワークの形成

3つの异なる积层ニューラルネットワークのコンポーネントを个别に学习させました。この时点で,学习した3つのニューラルネットワークを表示すると有益です。それは,autoenc1autoenc2,およびSOFTNETです。

视图(autoenc1)视图(autoenc2)视图(SOFTNET)

前述のように,特徴の抽出には自己符号化器の符号化器が使用されています。自己符号化器の符号化器とソフトマックス層を積み重ねて、分類用の積層ネットワークを形成できます。

stackednet =堆栈(autoenc1 autoenc2 softnet);

関数视图を使用して,積層ネットワークの図を表示できます。ネットワークは,自己符号化器の符号化器とソフトマックス層によって形成されています。

视图(stackednet)

ネットワーク全体が形成されると,テストセットに対する結果を計算できます。積層ネットワークでイメージを使用するには,テストイメージの形状を行列に変更しなければなりません。これを行うには,イメージの列をスタックしてベクトルを形成した後に,これらのベクトルから行列を形成します。

%得到每个图像的像素数imageWidth = 28;imageHeight = 28;inputSize = imageWidth * imageHeight;%加载测试映像[xTestImages,t检验] = digitTestCellArrayData;%转动测试图像到载体中,并把它们以矩阵xTest = 0 (inputSize元素个数(xTestImages));I = 1:numel(xTestImages)XTEST(:,1)= xTestImages {I}(:);结束

混同行列を使用して結果を可視化できます。行列の右下の正方形の数字は,全体の精度を示します。

Y = stackednet(XTEST);plotconfusion(t检验,Y);

积层ニューラルネットワークの微调整

多层ネットワーク全体に対して逆伝播を実行することによって,积层ニューラルネットワークの结果を改善できます。このプロセスは,多くの场合,微调整と呼ばれます。

教師ありの方法で学習データについて再学習を行うことで,ネットワークを微調整します。これを行う前に,テストイメージの場合と同様に,学習イメージの形状を行列に変更しなければなりません。

%将训练图像转换成向量,并将它们放入矩阵中xTrain = 0 (inputSize元素个数(xTrainImages));i = 1:numel(xTrainImages) xTrain(:,i) = xTrainImages{i}(:);结束%执行微调stackednet =火车(stackednet xTrain tTrain);

この場合にも,混同行列を使用して結果を表示できます。

Y = stackednet(XTEST);plotconfusion(t检验,Y);

まとめ

この例では,自己符号化器を使用して,イメージ内の数字を分類するように積層ニューラルネットワークの学習を行う方法を説明しました。説明した手順は,文字イメージ,つまり一様で小さな,特定カテゴリのオブジェクトイメージといったものの分類など,その他の類似の問題に適用できます。