【Alexnet】i​nputLayerに​対するイメージサイズ​の変更について

MATLAB初心者の学生です。 Alexnetを用いた転移学習をしたいのですが、学習元のイメージサイズが、83×83です。 そのため、入力層を変えてみたのですが、下記のとおり、Layer'fc6 でエラーが生じました。
 ①Alexnetをどのように変更すればよいのでしょうか? 
 ②また、Alexnetの変更で対応が困難な場合、学習元のイメージサイズを227×227 に変換する方法はありますでしょうか?
②の場合、大量のデータを扱っているので、簡易にできる方法があると助かります。 よろしくお願いいたします。
dsflowers=imageDatastore('C:\Flowers','IncludeSubfolders',true)
flowernames = dsflowers.Labels
dsflowers = imageDatastore('C:\Flowers','IncludeSubfolders',true,'LabelSource','foldernames')
[flwrTrain,flwrTest] = splitEachLabel(dsflowers,100)
anet=alexnet;
layers=anet.Layers
inputLayer = imageInputLayer([83 83 3]);
layers(1)=inputLayer
fc = fullyConnectedLayer(4)
layers(23) = fc
layers(end) = classificationLayer
opts = trainingOptions('sgdm','InitialLearnRate',0.001)
[flowernet,info]=trainNetwork(flwrTrain,layers,opts);
エラー:trainNetwork(line154)
無効なネットワーク
原因:Layer'fc6Input size mismatch,Size of input to this layer is different from the expected input size.
この層の入力:from layer 'pool5'(1×1×256 出力)

 채택된 답변

michio
michio 2018년 4월 8일
편집: michio 2018년 4월 8일

3 개 추천

入力画像のサイズを変えるのが良いかと思います。とはいえ、事前にすべての画像サイズを変更して保存しておく必要はなく、imageDatastore では、ReadFcn プロパティーを設定することで、画像を読み込むと同時にそのサイズ変更処理を実行させることができます。
ここでは読み込む際に画像のサイズを 227 x 227 に変更する処理を行う関数を添付しました。ダウンロードして
dsflowers = imageDatastore('C:\Flowers','IncludeSubfolders',true,'LabelSource','foldernames')
の後に
dsflowers.ReadFcn = @(filename)readAndPreprocessImage(filename);
と加えて、ReadFcn を設定してみてください。これで alexnet の入力層は変更せずに実行できるかと思います。

댓글 수: 3

MASAYUKI EGUCHI
MASAYUKI EGUCHI 2018년 4월 15일
편집: michio 2018년 4월 16일
ご連絡ありがとうございます。 ReadFcnの設定方法がわかりません。 dsflowers以降の設定を下記の2パターンで試したのですが、エラーが出てしまいます。ご教示いただけないでしょうか? よろしくお願いいたします。
①dsflowers をfilename 部にdsflowersをいれる。 エラー:trainNetwork(line 140) Invalid training data.The output size(4) of the last layer doesn't match the number of classes (1).
②filename部分にfileのリンク先を入れる('C:\Flower','IncludeSubfolders') 関数 'readAndPreprocessImage'(タイプ'char'の入力引数)が未定義です。
①のコード
dsflowers=imageDatastore('C:\Flowers\*.jpg')
flowernames=dsflowers.Labels
dsflowers=imageDatastore('C:\Flowers\*.jpg','LabelSource','foldernames')
dsflowers.ReadFcn = @(dsflowers)readAndPreprocessImage(dsflowers);
[flwrTrain,flwrTest]=splitEachLabel(dsflowers,1)
anet=alexnet;
layers=anet.Layers
fc = fullyConnectedLayer(4)
layers(23)=fc
layers(end)=classificationLayer
opts=trainingOptions('sgdm','InitialLearnRate',0.001)
[flowernet,info]=trainNetwork(flwrTrain,layers,opts);
function Iout=readAndPreprocessImage(dsflowers)
I=imread(dsflowers);
Iout=imresize(I, [227 227]);
end
②のコード
dsflowers=imageDatastore('C:\Flower','IncludeSubfolders',true)
flowernames=dsflowers.Labels
dsflowers=imageDatastore('C:\Flower','IncludeSubfolders',true,'LabelSource','foldernames')
dsflowers.ReadFcn=@(dsflowers)readAndPreprocessImage('C:\Flower','IncludeSubfolders');
Iout=readAndPreprocessImage('C:\Flower','IncludeSubfolders')
I=imread('C:\Flower','IncludeSubfolders');
Iout=imresize(I, [227 227]);
[flwrTrain,flwrTest]=splitEachLabel(dsflowers,100)
anet=alexnet;
layers=anet.Layers
fc = fullyConnectedLayer(4)
layers(23)=fc
layers(end)=classificationLayer
opts=trainingOptions('sgdm','InitialLearnRate',0.001)
[flowernet,info]=trainNetwork(flwrTrain,layers,opts);
michio
michio 2018년 4월 16일
①の方を改善した方が近道である気がしますので、こちらのエラーをまず見てみましょう。
エラー:trainNetwork(line 140) Invalid training data.The output size(4) of the last layer doesn't match the number of classes (1).
このエラーからは、4 つのラベルを分類させるネットワークを構築することを想定したネットワークでありながら、学習データに 1 つのラベルしか含まれていないことが推察されます。
dsflowers=imageDatastore('C:\Flowers\*.jpg','LabelSource','foldernames')
unique(dsflowers.Labels)
と実行してラベルの種類数を確認して頂けますか?
michio
michio 2018년 4월 16일
今回実施されたいことの具体的な例として
がありますので、ぜひ確認してみてください。
また、下記 Webinar の 20分~ も内容を理解するうえでお勧めです。

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

MASAYUKI EGUCHI
MASAYUKI EGUCHI 2018년 4월 22일
편집: michio 2018년 4월 23일

1 개 추천

ご連絡ありがとうございました。 具体例は見たのですが、複数のラベルの設定方法がなかなか理解できず、ご質問しました。

フォルダ「Flower」の直下に各ラベルのフォルダを4つ作成した上で、①を下記のとおり記載したところ無事に稼働することができました。ありがとうございました。

dsflowers=imageDatastore('C:\Flower','IncludeSubfolders',true)
flowernames=dsflowers.Labels
dsflowers=imageDatastore('C:\Flower','IncludeSubfolders',true,'LabelSource','foldernames')
dsflowers.ReadFcn=@(dsflowers)readAndPreprocessImage(dsflowers);

댓글 수: 2

michio
michio 2018년 4월 23일

解決されたとのことよかったです。参考まで、ですが、

 dsflowers.ReadFcn=@(dsflowers)readAndPreprocessImage(dsflowers);

の右辺は「無名関数」を定義しておりまして、@ の後に続く部分は readAndPreprocessImage 関数に対する入力引数を意味します。dsflowers である必要はありません。例えば

 dsflowers.ReadFcn=@(x)readAndPreprocessImage(x);

でも同じ処理となります。

参考URL: 無名関数

MASAYUKI EGUCHI
MASAYUKI EGUCHI 2018년 5월 26일
dsflowers とは直接的に関係しないんですね。 勉強になります。 ありがとうございました。

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Deep Learning Toolbox에 대해 자세히 알아보기

제품

질문:

2018년 4월 7일

댓글:

2018년 5월 26일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!