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

6 ビュー (過去 30 日間)
MASAYUKI EGUCHI
MASAYUKI EGUCHI 2018 年 4 月 7 日
コメント済み: MASAYUKI EGUCHI 2018 年 5 月 26 日
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 日
入力画像のサイズを変えるのが良いかと思います。とはいえ、事前にすべての画像サイズを変更して保存しておく必要はなく、imageDatastore では、ReadFcn プロパティーを設定することで、画像を読み込むと同時にそのサイズ変更処理を実行させることができます。
ここでは読み込む際に画像のサイズを 227 x 227 に変更する処理を行う関数を添付しました。ダウンロードして
dsflowers = imageDatastore('C:\Flowers','IncludeSubfolders',true,'LabelSource','foldernames')
の後に
dsflowers.ReadFcn = @(filename)readAndPreprocessImage(filename);
と加えて、ReadFcn を設定してみてください。これで alexnet の入力層は変更せずに実行できるかと思います。
  3 件のコメント
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 日

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

フォルダ「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 とは直接的に関係しないんですね。 勉強になります。 ありがとうございました。

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeDeep Learning Toolbox についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!