主要内容

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

回帰用の畳み込みニューラルネットワークの学習

この例では,畳み込みニューラルネットワークを使用して回帰モデルにあてはめ,手書きの数字の回転角度を予測する方法を示します。

畳み込みニューラルネットワーク(CNNまたは事先)は深層学習に不可欠なツールであり,特にイメージデータの解析に適しています。たとえば,CNNを使用してイメージを分類できます。角度や距離などの連続データを予測するために,ネットワークの最後に回帰層を含めることができます。

この例では,畳み込みニューラルネットワークアーキテクチャを構築し,ネットワークの学習を行い,学習済みネットワークを使用して手書きの数字の回転角度を予測します。このような予測は,光学式文字認識に役立ちます。

オプションで,imrotate(图像处理工具箱™)を使用してイメージを回転させ,箱线图(统计和机器学习的工具箱™)を使用して残差の箱ひげ図を作成できます。

データの読み込み

データセットには,手書きの数字の合成イメージと各イメージに対応する回転角度(度単位)が含まれています。

digitTrain4DArrayDatadigitTest4DArrayDataを使用して学習イメージと検証イメージを4次元配列として読み込みます。出力YTrainおよびYValidationは回転角度(度単位)です。学習データセットと検証データセットにはそれぞれ,5000枚のイメージが含まれています。

[XTrain ~, YTrain] = digitTrain4DArrayData;[XValidation ~, YValidation] = digitTest4DArrayData;

imshowを使用して,ランダムに選ばれた20枚の学習イメージを表示します。

numTrainImages =元素个数(YTrain);图idx = randperm(numTrainImages,20);i = 1:元素个数(idx)次要情节(4、5、i) imshow (XTrain (:,:,:, idx(我)))结束

データ正規化の確認

ニューラルネットワークに学習させるときは,ネットワークのすべての段階でデータが正規化されていることを確認すると,多くの場合役に立ちます。正規化は,勾配降下を使用したネットワークの学習の安定化と高速化に有効です。データが適切にスケーリングされていない場合,学習中に損失がになり,ネットワークパラメーターが発散する可能性があります。データを正規化する一般的な方法として,データの範囲が[0,1]になるように,または平均が0で標準偏差が1になるように,データを再スケーリングする方法があります。次のデータを正規化できます。

  • 入力データ。ネットワークに入力する前に予測子を正規化します。この例では,入力イメージは範囲[0,1]に既に正規化されています。

  • 層出力。バッチ正規化層を使用すると,畳み込み層と全結合層のそれぞれについて出力を正規化できます。

  • 応答。バッチ正規化層を使用してネットワークの最後で層出力を正規化する場合,学習の開始時にネットワークの予測が正規化されます。応答のスケールがこれらの予測と非常に異なる場合,ネットワークの学習が収束しないことがあります。応答が適切にスケーリングされていない場合は,正規化を試して,ネットワーク学習が改善されるか確認してください。学習の前に応答を正規化する場合,学習済みネットワークの予測を変換して,元の応答の予測を求めなければなりません。

応答の分布をプロットします。応答(度単位の回転角度)は,-45と45の間でほぼ一様分布しており,正規化しなくても問題ありません。分類問題では,出力はクラス確率であり,常に正規化されています。

图直方图(YTrain)轴ylabel (“计数”)包含(旋转角度的

一般的に,データを厳密に正規化する必要はありません。ただし,この例でYTrainではなく100 * YTrainまたはYTrain + 500を予測するためにネットワークに学習させる場合,学習を開始すると,損失がになり,ネットワークパラメーターが発散します。aY + bを予測するネットワークとYを予測するネットワークとが,最後の全結合層の重みとバイアスの単純な再スケーリングしか違わなくても,このような結果になります。

入力または応答の分布が非常に不均一な場合や偏っている場合は,ネットワークの学習前にデータを非線形変換(対数を取るなど)することもできます。

ネットワーク層の作成

回帰問題を解くには,ネットワークの層を作成し,ネットワークの最後に回帰層を含めます。

最初の層は,入力データのサイズとタイプを定義します。入力イメージは28 28 x 1です。学習イメージと同じサイズのイメージ入力層を作成します。

ネットワークの中間層は,計算と学習の大部分が行われる,ネットワークの中核を成すアーキテクチャを定義します。

最後の層は,出力データのサイズとタイプを定義します。回帰問題を解くには,ネットワークの最後の回帰層の前に全結合層を配置しなければなりません。サイズ1の全結合出力層,および回帰層を作成します。

配列ですべての層をまとめます。

layers = [imageInputLayer([28 28 1])]“填充”“相同”reluLayer averageepooling2dlayer (2,“步”2) convolution2dLayer(16日“填充”“相同”reluLayer averageepooling2dlayer (2,“步”32岁的,2)convolution2dLayer (3“填充”“相同”) batchNormalizationLayer reluLayer卷积2dlayer (3,32,“填充”“相同”) batchNormalizationLayer relullayer dropoutLayer(0.2) fulllyconnectedlayer (1) regressionLayer];

ネットワークの学習

ネットワーク学習オプションを作成します。学習を30エポック行います。初期学習率0.001をに設定し,20エポック後に学習率を下げます。検証データと検証頻度を指定して,学習中にネットワークの精度を監視します。学習データでネットワークに学習させ,学習中に一定の間隔で検証データに対してその精度を計算します。検証データは,ネットワークの重みの更新には使用されません。学習の進行状況プロットをオンにして,コマンドウィンドウの出力をオフにします。

miniBatchSize = 128;validationFrequency =地板(元素个数(YTrain) / miniBatchSize);选择= trainingOptions (“个”...“MiniBatchSize”miniBatchSize,...“MaxEpochs”30岁的...“InitialLearnRate”1 e - 3,...“LearnRateSchedule”“分段”...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”, 20岁,...“洗牌”“every-epoch”...“ValidationData”{XValidation, YValidation},...“ValidationFrequency”validationFrequency,...“阴谋”“训练进步”...“详细”、假);

trainNetworkを使用してネットワークを作成します。このコマンドでは,互換性のあるGPUが利用できる場合は,そのGPUが使用されます。そうでない場合,trainNetworkではCPUが使用されます。GPUで学習を行うには,以3.0计算能力上のCUDA®対応NVIDIA GPU®が必要です。

网= trainNetwork (XTrain、YTrain层,选择);

プロパティに含まれるネットワークアーキテクチャの詳細を確認します。

网。层
ans = 18×1 Layer array with layers:1“imageinput”图像输入28××28日1图像“zerocenter”正常化2 conv_1的卷积8 3×3×1的隆起与步幅[1]和填充“相同”3“batchnorm_1”批量标准化批量标准化8通道4的relu_1 ReLU ReLU 5‘avgpool2d_1平均池2×2平均池步(2 - 2)和填充[0 0 0 0]6“conv_2”Convolution 16 3×3×8 convolutions with stride [1 1] and padding 'same' 7 'batchnorm_2' Batch Normalization Batch normalization with 16 channels 8 'relu_2' ReLU ReLU 9 'avgpool2d_2' Average Pooling 2×2 average pooling with stride [2 2] and padding [0 0 0 0] 10 'conv_3' Convolution 32 3×3×16 convolutions with stride [1 1] and padding 'same' 11 'batchnorm_3' Batch Normalization Batch normalization with 32 channels 12 'relu_3' ReLU ReLU 13 'conv_4' Convolution 32 3×3×32 convolutions with stride [1 1] and padding 'same' 14 'batchnorm_4' Batch Normalization Batch normalization with 32 channels 15 'relu_4' ReLU ReLU 16 'dropout' Dropout 20% dropout 17 'fc' Fully Connected 1 fully connected layer 18 'regressionoutput' Regression Output mean-squared-error with response 'Response'

ネットワークのテスト

検証データに対する精度を評価することによって,ネットワーク性能をテストします。

预测を使用して,検証イメージの回転角度を予測します。

YPredicted =预测(净,XValidation);

性能の評価

次の計算を行って,モデルの性能を評価します。

  1. 許容誤差限界内にある予測の比率

  2. 回転角度の予測値と実際の値の平方根平均二乗誤差(RMSE)

回転角度の予測値と実際の値との間の予測誤差を計算します。

predictionError = YValidation - YPredicted;

真の角度から許容誤差限界内にある予測の数を計算します。しきい値を10度に設定します。このしきい値の範囲内にある予測の比率を計算します。

用力推= 10;numCorrect = sum(abs(predictionError) < thr);numValidationImages =元素个数(YValidation);= numCorrect / numValidationImages准确性
精度= 0.9690

平方根平均二乗誤差(RMSE)を使用して,回転角度の予測値と実際の値の差を測定します。

广场= predictionError。^ 2;rmse =√意味着(广场))
rmse =4.6062

予測の可視化

散布図で予測を可視化します。真の値に対する予測値をプロットします。

图散射(YPredicted YValidation,“+”)包含(“预测价值”) ylabel (“真正的价值”)举行Plot ([-60 60], [-60 60],“r——”

数字の回転補正

图像处理工具箱の関数を使用して,数字をまっすぐにし,まとめて表示できます。imrotate(图像处理工具箱)を使用して,49個の数字標本をそれぞれの予測回転角度に応じて回転させます。

idx = randperm (numValidationImages, 49);i = 1:元素个数(idx)图像= XValidation (:,:,:, idx(我));predictedAngle = YPredicted (idx (i));imagesRotated (::,:, i) = imrotate(形象,predictedAngle,“双三次的”“作物”);结束

元の数字と回転補正後の数字を表示します。蒙太奇(图像处理工具箱)を使用して,数字を1つのイメージにまとめて表示できます。

figure subplot(1,2,1) montage(XValidation(:,:,:,idx)) title(“原始”) subplot(1,2,2)蒙太奇(imagesrotate) title(“纠正”

参考

|

関連するトピック