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)