【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 出力)

 Akzeptierte Antwort

michio
michio am 8 Apr. 2018
Bearbeitet: michio am 8 Apr. 2018

3 Stimmen

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

3 Kommentare

MASAYUKI EGUCHI
MASAYUKI EGUCHI am 15 Apr. 2018
Bearbeitet: michio am 16 Apr. 2018
ご連絡ありがとうございます。 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 am 16 Apr. 2018
①の方を改善した方が近道である気がしますので、こちらのエラーをまず見てみましょう。
エラー: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 am 16 Apr. 2018
今回実施されたいことの具体的な例として
がありますので、ぜひ確認してみてください。
また、下記 Webinar の 20分~ も内容を理解するうえでお勧めです。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

MASAYUKI EGUCHI
MASAYUKI EGUCHI am 22 Apr. 2018
Bearbeitet: michio am 23 Apr. 2018

1 Stimme

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

フォルダ「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 Kommentare

michio
michio am 23 Apr. 2018

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

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

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

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

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

参考URL: 無名関数

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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Deep Learning Toolbox finden Sie in Hilfe-Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!