cellに格納された​すべての配列にGra​d-camを適用する​方法

現在、1000*1のcell配列の中に、120*180 doubleのデータが1000個格納されており、そのデータそれぞれにGrad-camを適用させる方法を模索しています。
1つのデータに対してであれば以下のコードでできるのですが、1000個もあるため、一括でできる方法をご教授いただきたいです。
[class,score] = classify(net,data);
map = gradCAM(net,data,class);
可能であれば、それぞれの結果(map)も元データと同様に1000*1のcell配列に格納したいです。
よろしくお願い申し上げます。

 Accepted Answer

Hernia Baby
Hernia Baby on 17 Nov 2022
Edited: Hernia Baby on 17 Nov 2022
cellfun をご使用ください
YourCell = ...  % ここに1000×1のcell配列
net = ... % ここに使用するnet
C_map = cellfun(@(x) MyGradCam(net,x),YourCell,'UniformOutput',false);
function map = MyGradCam(net,data)
[class,score] = classify(net,data);
map = gradCAM(net,data,class);
end

4 Comments

簡単な使用例で見るとこんな感じです
% データ生成
for ii = 1:10
C{ii} = rand(10,10) + ii;
end
size(C{1})
ans = 1×2
10 10
% 定数
t = 10;
以下で計算を行います
C1 = cellfun(@(x) testFcn(t,x),C,'UniformOutput',false);
% 中身確認
C1{1}
ans = 1×10
19.6519 19.9636 18.9551 17.3645 19.1232 19.4356 18.3670 19.4465 19.9286 19.6364
使用した関数
function y = testFcn(t,x)
y = max(t.*x);
end
KM
KM on 17 Nov 2022
Edited: KM on 17 Nov 2022
ご回答いただきありがとうございます。
やってみたのですが、以下のようになってしまいました。
YourCell = XTest
net = netCNN
C_map = cellfun(@(x) MyGradCam(net,x),YourCell,'UniformOutput',false);
function map = MyGradCam(net,data)
[class,score] = classify(net,data);
map = gradCAM(net,data,class);
end
関数または変数 'MyGradCam' が認識されません。
エラー: @(x)MyGradCam(net,x)
また、gradCAMには3つの入力引数がいるようなので、以下のコードも試したのですが、こちらもエラーでした。classifyの際はcell配列が対応していないため変換しています。XTestは各cellに120*180 doubleのデータが格納された1000*1のcell配列です。
XTest4D = cat(4, XTest{:});
[class,score] = classify(netCNN,XTest4D);
C_map = cellfun(@(x) gradCAM(netCNN,x,class),XTest,'UniformOutput',false);
エラー: gradCAM (125)
特徴層の活性化についてのリダクション層の活性化の勾配がすべてゼロです。ネットワーク内で、特徴層がリダクション層の前にあることを確認してくださ
い。
エラー: gradCAM (125)
以下のようにcell配列から1つ取り出してやる分にはエラーは出ないです。
[class,score] = classify(netCNN,XTest{1,1});
map = gradCAM(netCNN,XTest{1,1},class);
どのようにすればよろしいでしょうか。
申し訳ございませんが、よろしくお願い致します。
Hernia Baby
Hernia Baby on 17 Nov 2022
一点、確認させてください
netCNNもcell型で格納されていますか?
お返事大変遅くなり申し訳ございません。
ご回答いただきありがとうございました。
試行錯誤してみたところ、
C_map = cellfun(@(x) gradCAM(netCNN,x,class, ...
'ReductionLayer',reductionLayer, ...
'FeatureLayer',featureLayer),data,'UniformOutput',false)
で解決しました。
netCNNはcellではなくLayerで定義されています。

Sign in to comment.

More Answers (0)

Categories

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

Products

Release

R2021b

Asked:

KM
on 17 Nov 2022

Commented:

KM
on 30 Nov 2022

Community Treasure Hunt

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

Start Hunting!