分類用のシンプルな深層学習ネットワークの作成
Show older comments
「分類用のシンプルな深層学習ネットワークの作成」をMATLAB公式サンプルコードを用いてます。
画像ファイルの自前の画像にし、野菜の画像分類を行いたいです。
データのみオリジナルに変更し、試みていますが入力層の部分でエラーが発生しました。
下記は全てのコードです。
自前の画像データをサイズ変更すれば問題ないかと思いますが、サイズ変更の仕方やその他考えられる原因を特定したいです。
%digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
%'nndatasets','DigitDataset');
%imds = imageDatastore(digitDatasetPath, ...
%'IncludeSubfolders',true,'LabelSource','foldernames');
unzip('Negi.zip');
imds = imageDatastore('Negi', ...
'IncludeSubfolders',true, ...
'LabelSource','foldernames');
figure;
perm = randperm(306,20);
for i = 1:20
subplot(4,5,i);
imshow(imds.Files{perm(i)});
end
labelCount = countEachLabel(imds)
img = readimage(imds,1);
%ans=1*3
% 1411 2124 3
numTrainFiles = 87;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(3,8,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(3,16,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(3,32,'Padding','same')
batchNormalizationLayer
reluLayer
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
options = trainingOptions('sgdm', ...
'InitialLearnRate',0.01, ...
'MaxEpochs',4, ...
'Shuffle','every-epoch', ...
'ValidationData',imdsValidation, ...
'ValidationFrequency',30, ...
'Verbose',false, ...
'Plots','training-progress');
net = trainNetwork(imdsTrain,layers,options);
次を使用中:trainNetwork
画像のイメージサイズは1411*2124*3ですが、入力層にはサイズ28*28*1のイメージが必要です。
YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = sum(YPred == YValidation)/numel(YValidation)
Accepted Answer
More Answers (1)
Atsushi Ueno
on 26 Oct 2022
imageInputLayer([28 28 1])
このCNNの入力層は28*28のグレースケールイメージを受け付けます。先日の質問と逆の('gray2rgb'でなく'rgb2gray')変換が必要です。
画像のイメージサイズは1411*2124*3ですが
上記エラーメッセージはサイズの大きなRGBカラーイメージを入力しようとしている事を意味します。
augimdsTrain = augmentedImageDatastore([28 28],imdsTrain,'ColorPreprocessing','rgb2gray');
% (中略)
net = trainNetwork(augimdsTrain,layers,options);
2 Comments
陸
on 26 Oct 2022
Atsushi Ueno
on 28 Oct 2022
augimdsTrain = augmentedImageDatastore([28 28],imdsTrain, ...
'ColorPreprocessing','rgb2gray');
augimdsValidation = augmentedImageDatastore([28 28],imdsValidation, ...
'ColorPreprocessing','rgb2gray');
% (中略)
%'ValidationData',imdsValidation, ... % 【変更前】
'ValidationData',augimdsValidation, ... % 【変更後】
%net = trainNetwork(imdsTrain,layers,options); % 【変更前】
net = trainNetwork(augimdsTrain,layers,options); % 【変更後】
回答で言っている事を反映するには上記の様な変更が必要ですが、ちょっと自分の勘違いがあるかもしれません。もう一つの回答の方をご確認ください。例題(数字の分類)におけるCNNの入力層サイズと野菜画像のサイズがかけ離れているのでこのまま出はうまく学習されないと思います。
また、そもそもなぜaugmentedImageSource関数の利用を提案したかというと、前の質問においてカラー/モノクロ画像が混在しているおそれがあった為です。野菜の画像が全てカラー/モノクロのいずれかに統一されているのであれば'ColorPreprocessing'オプションの指定は不要ですし、野菜画像のサイズが全て同一であれば augmentedImageSource関数自体も不要になります。
Categories
Find more on Deep Learning Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!