このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,畳み込みニューラルネットワークを使用して回帰モデルにあてはめ,手書きの数字の回転角度を予測する方法を示します。
畳み込みニューラルネットワーク(CNNまたは事先)は深層学習に不可欠なツールであり,特にイメージデータの解析に適しています。たとえば,CNNを使用してイメージを分類できます。角度や距離などの連続データを予測するために,ネットワークの最後に回帰層を含めることができます。
この例では,畳み込みニューラルネットワークアーキテクチャを構築し,ネットワークの学習を行い,学習済みネットワークを使用して手書きの数字の回転角度を予測します。このような予測は,光学式文字認識に役立ちます。
オプションで,imrotate
(图像处理工具箱™)を使用してイメージを回転させ,箱线图
(统计和机器学习的工具箱™)を使用して残差の箱ひげ図を作成できます。
データセットには,手書きの数字の合成イメージと各イメージに対応する回転角度(度単位)が含まれています。
digitTrain4DArrayData
とdigitTest4DArrayData
を使用して学習イメージと検証イメージを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);
性能の評価
次の計算を行って,モデルの性能を評価します。
許容誤差限界内にある予測の比率
回転角度の予測値と実際の値の平方根平均二乗誤差(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(“纠正”)
classificationLayer
|regressionLayer