CNNのパラメータへの書き込みが行えない。

4 ビュー (過去 30 日間)
Yuto Omae
Yuto Omae 2017 年 8 月 30 日
回答済み: Naoya 2017 年 8 月 30 日
下記のようにCNNを定義し、
if true
% code
CS=30;
NumAxis=6;
layers = [imageInputLayer([WinLen NumAxis 1])
convolution2dLayer([CS,1],1) % <- フィルタサイズ, フィルタ枚数
reluLayer
convolution2dLayer([CS,1],1)
reluLayer
fullyConnectedLayer(10)
reluLayer
fullyConnectedLayer(2)
reluLayer
fullyConnectedLayer(2)
softmaxLayer
classificationLayer()];
opt = trainingOptions('sgdm','MaxEpochs',1, 'InitialLearnRate',0.01);
Net = trainNetwork(DX,DY,layers,opt);
end
任意のコスト関数でCNNのモデルパラメータを最適化のために、8層目の数値微分を行おうとし、下記の書き込みを行おうとしました。
if true
Net.Layers(8,1).Weights(i,j)=TempNet.Layers(8,1).Weights(i,j)+0.000001;
end
すると、
SeriesNetwork の読み取り専用プロパティ 'Layers' を設定できません。
と出力されてしまい、CNNのモデルパラメータを変更させることができず、困っています。 書き込むための方法を教えていただきたいです。

採用された回答

Naoya
Naoya 2017 年 8 月 30 日
現状、SeriesNetwork オブジェクトから直接重みを編集することができません。
一旦、
Layers_tmp = Net.Layers;
のように Layers オブジェクトを取得してから、
Layers_tmp(8).Weights(1,1) = 1;
のように、重みを編集することができます。
※ SeriesNetwork につきましては、現状、 trainNetwork より作成されるネットワークのみの使用がサポートされていることになります。 SeriesNetwork オブジェクトは、学習時において、ユーザ側では意識されないフェーズで幾つかのオペレーションが含まれおり、基本的には、重みの変更は許可できないような仕様となっております。
なお、predict や classify, activations を実行させるためには、必ず、trainNetwork で学習済のような Series Network オブジェクトとして持っていく必要がございます。 上記例のLayers_tmp を 一旦、 trainNetwork 関数で 1epoch分のみ学習させる必要があります。 但し、1epoch はどうしても必要としてしまいますので、trainingOptions で、 学習率を非常に小さな値(微小な値)に設定することで、Series Network オブジェクトを生成する方法での代替案となります。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchange深層学習データの前処理 についてさらに検索

Community Treasure Hunt

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

Start Hunting!