Matlab 深層学習の紹介例: AlexNet に基づく信号機認識 (完全なコード付き)

AlexNet は 2012 年に ImageNet の画像分類コンペティションに登場し、その年のチャンピオンを獲得して以来、畳み込みニューラル ネットワークは人々から大きな注目を集めてきました。AlexNet は、深い畳み込みニューラル ネットワーク研究の急増の始まりであり、従来の視覚的手法から畳み込みニューラル ネットワークへの研究ホットスポットの移行の兆候でもあります。

AlexNet モデルは畳み込み層 5 層と全結合層 3 層の合計 8 層で構成されており、LeNet と比較して、畳み込み層ごとに RELU と局所応答正規化が含まれていることが AlexNet の特徴です。

データセット フォルダのアドレスは、ニューラル ネットワークの m ファイルのアドレスと同じに設定する必要があります. データセット フォルダの名前は TrafficLightSamples で、次のようなサブフォルダが含まれています. 各カテゴリには 500 枚の画像があります:

いくつかの写真は次のとおりです。

ネットワークを構築する一部の機能については詳しく説明しませんが、以前の記事 (LeNet) を参照してください。

コードの実装と詳細な説明:

1. 画像サンプルをロードします。

% 功能:对AlexNet用样本数据进行训练,实现对输入图像的识别
clear
close all
clc
% 加载图像数据
imds = imageDatastore('TrafficLightSamples', ...
       'IncludeSubfolders',true, ...
       'LabelSource','foldernames');

'IncludeSubfolders', true: 各フォルダーにすべてのファイルとサブフォルダーを含めます。

'LabelSource','foldernames': フォルダー名に基づいてラベルを割り当て、それらを Labels プロパティに格納します。

2. サンプルをトレーニング セットとテスト セットに分割し、カテゴリの数を数えます。

% 划分验证集和训练集
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

% 确定训练数据中需要分类的种类
numClasses = numel(categories(imdsTrain.Labels));

imdsTrain はトレーニング サンプル データ、imdsValidation は検証サンプル データ、0.7 はトレーニング サンプルの比率です。

3. AlexNet を構築し、視覚的な分析を実行します。

% AlexNet网络
alexnet = [
    imageInputLayer([60,20,3])
    convolution2dLayer([11,11],48,'Padding','same','Stride',4)
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(3,'Padding','same','Stride',2)
    convolution2dLayer([5,5],128,'Padding',2,'Stride',1)
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(3,'Padding','same','Stride',2)
    convolution2dLayer([3 3],192,'Padding',1,'Stride',1)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer([3 3],192,'Padding',1,'Stride',1)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer([3 3],128,'Stride',1,'Padding',1)
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(3,'Padding','same','Stride',2)
    fullyConnectedLayer(4096)
    reluLayer
    dropoutLayer(0.5)
    fullyConnectedLayer(numClasses)  % 将新的全连接层的输出设置为训练数据中的种类
    softmaxLayer                     % 添加新的Softmax层
    classificationLayer ];           % 添加新的分类层


% 对构建的网络进行可视化分析
lgraph = layerGraph(alexnet);
analyzeNetwork(lgraph)

batchNormalizationLayer: ローカル応答の正規化。

reluLayer: RELU 機能のアクティブ化;

dropoutLayer(0.5): ノードが削除されるため、過適合を防ぐために各ニューロンが削除される確率が 50% になります。

analyzeNetwork: ネットワークの視覚的分析、その操作結果は次のとおりです。

4. トレーニング セットと入力ステージの画像サイズを AlexNet 入力レイヤーと同じになるように調整します。

%% 调整数据集

% 网络输入层的大小和通道数
inputSize = [60,20,3];

% 将批量训练图像的大小调整为与输入层的大小相同
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
% 将批量验证图像的大小调整为与输入层的大小相同
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

5. トレーニング オプションを構成し、ネットワークをトレーニングします。

%% 对网络进行训练

% 对训练参数进行设置
options = trainingOptions('sgdm', ...
    'MiniBatchSize',15, ...
    'MaxEpochs',3, ...
    'InitialLearnRate',0.0003, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',true, ...
    'Plots','training-progress');

% 用训练图像对网络进行训练
net = trainNetwork(augimdsTrain,alexnet,options);

トレーニングのオプションは次のとおりです。

「sgdm」: トレーニング方法は sgdm です。

'MiniBatchSize',15: 小さいバッチ サンプルの数は 15 です。

'MaxEpochs',3: ラウンドの最大数は 3 です。

'InitialLearnRate',0.0003: 初期学習率は 0.0003 です。

'Shuffle','every-epoch': トレーニングの各ラウンドの前にデータをシャッフルします。

「ValidationData」、augimdsValidation: トレーニング中に使用されるデータは augimdsValidation です。

 'ValidationFrequency', 3: 検証頻度は 3 回/ラウンドです。

  'Verbose', true: 開いているコマンド ウィンドウの出力を設定します。

 'Plots','training-progress': トレーニングの進行状況グラフを開くように設定すると、コードの実行結果は次のようになります。

 最終的な検証精度は 99.22% という非常に高い値に達しました。

6. トレーニング済みの画像を使用して新しい入力画像を分類し、精度を計算します。

%% 验证并显示结果

% 对训练好的网络采用验证数据集进行验证
[YPred,scores] = classify(net,augimdsValidation);

%% 计算分类准确率
YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)

%% 创建并显示混淆矩阵
figure
confusionchart(YValidation,YPred)

混乱チャートは混同行列を生成できるので、AlexNet 検証の結果をより直感的に見ることができます. このコードの結果は次のとおりです:

 トレーニング精度は非常に高い 99.22% に達し、ネットワークが優れたトレーニング結果を達成し、入力画像を正確に分類したことを示しています。

完全なコードは次のとおりです。

% 功能:对AlexNet用样本数据进行训练,实现对输入图像的识别
clear
close all
clc
% 加载图像数据
imds = imageDatastore('TrafficLightSamples', ...
       'IncludeSubfolders',true, ...
       'LabelSource','foldernames');

% 划分验证集和训练集
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

% 确定训练数据中需要分类的种类
numClasses = numel(categories(imdsTrain.Labels));

% AlexNet网络
alexnet = [
    imageInputLayer([60,20,3])
    convolution2dLayer([11,11],48,'Padding','same','Stride',4)
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(3,'Padding','same','Stride',2)
    convolution2dLayer([5,5],128,'Padding',2,'Stride',1)
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(3,'Padding','same','Stride',2)
    convolution2dLayer([3 3],192,'Padding',1,'Stride',1)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer([3 3],192,'Padding',1,'Stride',1)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer([3 3],128,'Stride',1,'Padding',1)
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(3,'Padding','same','Stride',2)
    fullyConnectedLayer(4096)
    reluLayer
    dropoutLayer(0.5)
    fullyConnectedLayer(numClasses)  % 将新的全连接层的输出设置为训练数据中的种类
    softmaxLayer                     % 添加新的Softmax层
    classificationLayer ];           % 添加新的分类层


% 对构建的网络进行可视化分析
lgraph = layerGraph(alexnet);
analyzeNetwork(lgraph)
%% 调整数据集

% 网络输入层的大小和通道数
inputSize = [60,20,3];

% 将批量训练图像的大小调整为与输入层的大小相同
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
% 将批量验证图像的大小调整为与输入层的大小相同
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

%% 对网络进行训练

% 对训练参数进行设置
options = trainingOptions('sgdm', ...
    'MiniBatchSize',15, ...
    'MaxEpochs',3, ...
    'InitialLearnRate',0.0003, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',true, ...
    'Plots','training-progress');

% 用训练图像对网络进行训练
net = trainNetwork(augimdsTrain,alexnet,options);

%% 验证并显示结果

% 对训练好的网络采用验证数据集进行验证
[YPred,scores] = classify(net,augimdsValidation);

%% 计算分类准确率
YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)

%% 创建并显示混淆矩阵
figure
confusionchart(YValidation,YPred)

おすすめ

転載: blog.csdn.net/qq_51942551/article/details/128028245