MATLAB 使用CNN拟合回归模型预测手写数字的旋转角度(卷积神经网络)
學習來源自mathworks的官方范例,個人學習使用,在個人項目上可以按照需求變化數據集來實現CNN回歸計算
數據集生成方法可以參考:https://blog.csdn.net/qingfengxd1/article/details/105931988
%% 加載數據 %% 數據集包含手寫數字的合成圖像,以及每幅圖像旋轉的對應角度(以角度為單位)。 %% 使用digitTrain4DArrayData和digitTest4DArrayData將訓練和驗證圖像加載為4D數組。 %% 輸出YTrain和YValidation是以角度為單位的旋轉角度。每個訓練和驗證數據集包含5000張圖像。 [XTrain, ~, Ytrain] = digitTrain4DArrayData; [XValidation, ~, YValidation] = digitTest4DArrayData; %% 隨機顯示20張訓練圖像 numTrainImages = numel(YTrrain); figure; idx = randperm(numTrainImages, 20); for i = 1 : numel(idx)subplot(4, 5, i);imshow(XTrain(:, :, :, idx(i)))drawnow end%% 數據歸一化處理
%% 當訓練神經網絡時,確保你的數據在網絡的所有階段都是標準化的通常是有幫助的。
%% 歸一化有助于使用梯度下降來穩定和加速網絡訓練。
%% 如果您的數據規模太小,那么損失可能會變成NaN,并且在培訓期間網絡參數可能會出現分歧。
%% 標準化數據的常用方法包括重新標定數據,使其范圍變為[0,1]或使其均值為0,標準差為1。
%{
你可以標準化以下數據:
1、輸入數據。在將預測器輸入到網絡之前對它們進行規范化。在本例中,輸入圖像已經標準化為[0,1]范圍。
2、層輸出。您可以使用批處理規范化層對每個卷積和完全連接層的輸出進行規范化。
3、響應。如果使用批處理規范化層對網絡末端的層輸出進行規范化,則在開始訓練時對網絡的預測進行規范化。
????????如果響應的規模與這些預測非常不同,那么網絡訓練可能無法收斂。
????????如果你的回答沒有得到很好的擴展,那么試著將其標準化,看看網絡培訓是否有所改善。
????????如果在訓練前對響應進行規范化,則必須轉換訓練網絡的預測,以獲得原始響應的預測。
%}
%% 一般來說,數據不必完全標準化。
%% 但是,如果在本例中訓練網絡來預測100*YTrain或YTrain+500而不是YTrain,那么損失就變成NaN,
%% 當訓練開始時,網絡參數就會出現分歧。
%% 即使網絡預測aY + b和網絡預測Y之間的唯一區別是重新調整最終完全連接層的權重和偏差,這些結果仍然會出現。
%% 如果輸入或響應的分布非常不均勻或傾斜,還可以執行非線性轉換(例如,取對數)
通常,數據不必完全歸一化。但是,如果在此示例中訓練網絡來預測?100*YTrain?或?YTrain+500?而不是?YTrain,則損失將變為?NaN,并且網絡參數在訓練開始時會發生偏離。即使預測?aY + b?的網絡與預測?Y?的網絡之間的唯一差異是對最終全連接層的權重和偏置的簡單重新縮放,也會出現這些結果。
如果輸入或響應的分布非常不均勻或偏斜,您還可以在訓練網絡之前對數據執行非線性變換(例如,取其對數)。
%% 創建網絡層 %% 第一層定義輸入數據的大小和類型。輸入的圖像大小為28×28×1。創建與訓練圖像大小相同的圖像輸入層。 %% 網絡的中間層定義了網絡的核心架構,大部分計算和學習都在這個架構中進行。 %% 最后一層定義輸出數據的大小和類型。對于回歸問題,全連接層必須先于網絡末端的回歸層。 layers = [imageInputLayer([28 28 1])batchNormalizationLayerreluLayeraveragePooling2dLayer(2, 'Stride', 2)convolution2dLayer(3, 16, 'Padding', 'same')batchNormalizationLayerreluLayeraveragePooling2dLayer(2, 'Stride', 2)convolution2dLayer(3, 32, 'Padding', 'same')batchNormalizationLayerreluLayerconcolution2dLayer(3, 32, 'Padding', 'same')batchNormalizationLayerreluLayerdropoutLayer(0.2)fullyConnectedLayer(1)regressionLayer]; %% 訓練網絡——Options %% Train for 30 epochs 學習率0.001 在20個epoch后降低學習率。 %% 通過指定驗證數據和驗證頻率,監控培訓過程中的網絡準確性。 %% 根據訓練數據對網絡進行訓練,并在訓練過程中定期對驗證數據進行精度計算。 %% 驗證數據不用于更新網絡權重。打開訓練進度圖,并關閉命令窗口輸出。 miniBatchSize = 128; validationFrequency = floor(numel(YTrain) / miniBatchSize); options = trainingOptions('sgdm', ...'MiniBatchSize', miniBatchSize, ...'MaxEpochs', 30, ...'InitialLearnRate', 1e-3, ...'LearnRateSchedule', 'piecewise', ...'LearnRateDropFactor', 0.1, ...'LearnRateDropPeriod', 20, ...'Shuffle', 'every-epoch', ...'ValidationData', {XValidation, YValidation}, ...'ValidationFrequency', validationFrequency, ...'Plots', 'training-progress', ...'Verbose', false); net = trainNetwork(XTrain, YTrain, layer, options)使用?trainNetwork?創建網絡。如果存在兼容的 GPU,此命令會使用 GPU。否則,trainNetwork?將使用 CPU。在 GPU 上進行訓練需要具有 3.0 或更高計算能力的支持 CUDA? 的 NVIDIA? GPU。
檢查?net?的?Layers?屬性中包含的網絡架構的詳細信息。
net.Layers基于驗證數據評估準確度來測試網絡性能。使用?predict?預測驗證圖像的旋轉角度。
YPredicted = predict(net,XValidation);評估性能
通過計算以下值來評估模型性能:
在可接受誤差界限內的預測值的百分比
預測旋轉角度和實際旋轉角度的均方根誤差 (RMSE)
計算預測旋轉角度和實際旋轉角度之間的預測誤差。
predictionError = YValidation - YPredicted;計算在實際角度的可接受誤差界限內的預測值的數量。將閾值設置為 10 度。計算此閾值范圍內的預測值的百分比。
thr = 10; numCorrect = sum(abs(predictionError) < thr); numValidationImages = numel(YValidation);accuracy = numCorrect/numValidationImages使用均方根誤差 (RMSE) 來衡量預測旋轉角度和實際旋轉角度之間的差異。
squares = predictionError.^2; rmse = sqrt(mean(squares))顯示每個數字類的殘差箱線圖
boxplot?函數需要一個矩陣,其中各個列對應于各個數字類的殘差。
驗證數據按數字類 0-9 對圖像進行分組,每組包含 500 個樣本。使用?reshape?按數字類對殘差進行分組。
residualMatrix = reshape(predictionError,500,10);residualMatrix?的每列對應于每個數字的殘差。使用?boxplot?(Statistics and Machine Learning Toolbox) 為每個數字創建殘差箱線圖。
figure boxplot(residualMatrix,...'Labels',{'0','1','2','3','4','5','6','7','8','9'}) xlabel('Digit Class') ylabel('Degrees Error') title('Residuals')準確度最高的數字類具有接近于零的均值和很小的方差。
您可以使用 Image Processing Toolbox 中的函數來擺正數字并將它們顯示在一起。使用?imrotate?(Image Processing Toolbox) 根據預測的旋轉角度旋轉 49 個樣本數字。
idx = randperm(numValidationImages,49); for i = 1:numel(idx)image = XValidation(:,:,:,idx(i));predictedAngle = YPredicted(idx(i)); imagesRotated(:,:,:,i) = imrotate(image,predictedAngle,'bicubic','crop'); end顯示原始數字以及校正旋轉后的數字。您可以使用?montage?(Image Processing Toolbox) 將數字顯示在同一個圖像上。
figure subplot(1,2,1) montage(XValidation(:,:,:,idx)) title('Original')subplot(1,2,2) montage(imagesRotated) title('Corrected')?
?
總結
以上是生活随笔為你收集整理的MATLAB 使用CNN拟合回归模型预测手写数字的旋转角度(卷积神经网络)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 神经网络ann用于分类方法
- 下一篇: MATLAB Simulink 做BP