trainNetworkを使用し「入力イメージは4チャネル未満でなければなりません。」と出た時の対処法
Show older comments
imds=imageDatastore('Oguma_TestImages_Copy','IncludeSubfolder',true,'LabelSource','foldernames');
[imdsTrain,imdsValidation]=splitEachLabel(imds,0.7);
numTrainImages = numel(imdsTrain.Labels);
net=squeezenet;
inputSize = net.Layers(1).InputSize
lgraph = layerGraph(net);
[learnableLayer,classLayer] = findLayersToReplace(lgraph);
[learnableLayer,classLayer]
numClasses = numel(categories(imdsTrain.Labels))
newConvLayer = convolution2dLayer([1, 1],numClasses,'WeightLearnRateFactor',10,'BiasLearnRateFactor',10,"Name",'new_conv');
lgraph = replaceLayer(lgraph,'conv10',newConvLayer);
newClassificatonLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassificatonLayer);
pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
'RandXReflection',true, ...
'RandXTranslation',pixelRange, ...
'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore([227 227 3],imdsTrain,'ColorPreprocessing','gray2rgb', ...
'DataAugmentation',imageAugmenter);
augimdsValidation = augmentedImageDatastore([227 227 3],imdsValidation,'ColorPreprocessing','gray2rgb');
options = trainingOptions('sgdm', ...
'MiniBatchSize',11, ...
'MaxEpochs',7, ...
'InitialLearnRate',2e-4, ...
'Shuffle','every-epoch', ...
'ValidationData',augimdsValidation, ...
'ValidationFrequency',3, ...
'Verbose',false, ...
'Plots','training-progress');
netTransfer = trainNetwork(augimdsTrain,lgraph,options);
[YPred,scores] = classify(netTransfer,augimdsValidation);
idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
subplot(2,2,i)
I = readimage(imdsValidation,idx(i));
imshow(I)
label = YPred(idx(i));
title(string(label));
end
YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
SqueezNetによる画像の転移学習をしようと思ったのですが、
エラー: trainNetwork (line 170)
入力イメージは数値で、4 チャネル未満でなければなりません。
エラー: Oguma_SqueezeNet_Code_03 (line 38)
netTransfer = trainNetwork(augimdsTrain,lgraph,options);
原因:
エラー: imageDataAugmenter/augment (line 596)
入力イメージは数値で、4 チャネル未満でなければなりません。
と出て、うまくいきません。
24、26行目でイメージデータストアは[227 227 3]として3チャネルになるように指定しているにも関わらず、なぜtrainNetwork内では4チャネルと認識されているのでしょうか?
対処法をご存知の方がいれば教えていただきたいです。
製品は MATLAB R2020a です。
よろしくお願いいたします。
17 Comments
Shunichi Kusano
on 1 Jul 2021
直接の原因は分かりませんが、エラーはaugmenter内で出ているので、augmenterに入力しているデータが4チャンネル以上になっているのかなと思います。いったんread関数を使ってimdsTrainからいくつか画像を読み込んでみて、チャンネル数を見てみてはいかがでしょうか。
塁 小熊
on 5 Jul 2021
Shunichi Kusano
on 5 Jul 2021
検証ありがとうございます。
しかし、原因がわかりません…。入力画像も問題無いように見えます。他にレスがつかないようでしたら、エラーが再現するスクリプトと訓練用の画像(数枚)をこちらに共有いただければ、何らか深堀りできるかなとは思います。
塁 小熊
on 5 Jul 2021
Shunichi Kusano
on 5 Jul 2021
コードの共有ありがとうございます。
画像は1カテゴリにつき数枚にダウンサイズしたうえでzipファイル化などして共有することは可能でしょうか。実データが無いとやはり検証が難しく…。
塁 小熊
on 6 Jul 2021
Shunichi Kusano
on 6 Jul 2021
データ共有いただき、ありがとうございました。
こちらでテストしてみたのですが、エラーは再現しませんでした。小熊さんの環境ではこちらのコードとデータでエラーが出るということでよろしいでしょうか。
念のため、私のコード添付します(整形しただけで、内容は一緒です)。
塁 小熊
on 12 Jul 2021
Shunichi Kusano
on 12 Jul 2021
そうですか、何か特定の画像が悪さをしている可能性もあるかと思ったのですが。
他にできることとしまして、
dbstop if error
と、エラーが出るコード(今回ですとtrainNetworkの一文)の前に挿入して実行すると、エラーが出た時点でデバッグモードに入ります。エラー時点でのワークスペースが見れますので、変数の次元などを調べることで、何か手がかりが得られるかもしれません。ですが、コードの深い部分の探索も必要になる可能性もありますので、中級者以上向けの方法です。本当は私がこれをするつもりだったのですが、エラーが出なかったので何もできず、でした。
その他に原因や対処で思い当たることが無いので、一度再インストールするのも手かもしれません。
作成したデータはMATLABのインストールフォルダ以外に置いておけば、再インストールしても大丈夫です。
塁 小熊
on 13 Jul 2021
Shunichi Kusano
on 13 Jul 2021
とりあえず原因がわかったようでよかったです。どの画像が原因かはファイルサイズで分かったりしませんでしょうか。エラー内容から察するに、原因となるファイルは画像サイズが他と比べて大きく異なるのでは、と推測します。
塁 小熊
on 15 Jul 2021
Shunichi Kusano
on 15 Jul 2021
そうでしたか。見当違いでした。
そうするともう一枚ずつ調べるしかありませんが、上記dbstop if error使えばおそらく、エラーとなった時のワークスペースを見れますので、どの画像かもわかりそうです。ご参考まで。
塁 小熊
on 16 Jul 2021
Kenta
on 16 Jul 2021
allIm=readall(augimdsTrain);
こんにちは、途中で割りこんですいません。興味深いご質問で、私の方でも試してみました。Windows、matlab2021aで実行しましたが問題なく、Kusanoさまのコードで動きました。
私もどこか画像がいけないのかなあと思いました。例えば上のようにreadallしたり、
for i=1:(画像の枚数ぶん)
im=read(augimdsTrain);
end
などとして、エラーが出ないでしょうか。また、毎回、size(im)などとして、チャンネルの数を見てみてもよさそうだとおもいました。
塁 小熊
on 19 Jul 2021
Kenta
on 20 Jul 2021
なるほど!小熊さんありがとうございます。データストアにGIFも格納されてしまうのですね、、、私もGIFはよく使うので参考になります。原因がわかったようでよかったです。
「タグ」のところにimageDataAugmenterなど、今回のご質問で関連していそうな単語をいれておくと、今後似た問題が検索されたときに引っかかる確率があがりそうです。
Answers (0)
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!
