Clear Filters
Clear Filters

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

7 views (last 30 days)
MASAYUKI EGUCHI
MASAYUKI EGUCHI on 7 Apr 2018
Commented: MASAYUKI EGUCHI on 26 May 2018
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 出力)

Accepted Answer

michio
michio on 8 Apr 2018
Edited: michio on 8 Apr 2018
入力画像のサイズを変えるのが良いかと思います。とはいえ、事前にすべての画像サイズを変更して保存しておく必要はなく、imageDatastore では、ReadFcn プロパティーを設定することで、画像を読み込むと同時にそのサイズ変更処理を実行させることができます。
ここでは読み込む際に画像のサイズを 227 x 227 に変更する処理を行う関数を添付しました。ダウンロードして
dsflowers = imageDatastore('C:\Flowers','IncludeSubfolders',true,'LabelSource','foldernames')
の後に
dsflowers.ReadFcn = @(filename)readAndPreprocessImage(filename);
と加えて、ReadFcn を設定してみてください。これで alexnet の入力層は変更せずに実行できるかと思います。
  3 Comments
michio
michio on 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 on 16 Apr 2018
今回実施されたいことの具体的な例として
がありますので、ぜひ確認してみてください。
また、下記 Webinar の 20分~ も内容を理解するうえでお勧めです。

Sign in to comment.

More Answers (1)

MASAYUKI EGUCHI
MASAYUKI EGUCHI on 22 Apr 2018
Edited: michio on 23 Apr 2018

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

フォルダ「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 Comments
michio
michio on 23 Apr 2018

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

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

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

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

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

参考URL: 無名関数

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

Sign in to comment.

Categories

Find more on Deep Learning Toolbox in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!