2

双曲線正接 (シグモイド) カーネルを使用して、2 つの画像間のユークリッド距離を計算したいと考えています。Gaussian Kernel を使用した同じ問題について詳しく説明したこのリンクをたどってください。

x=(i,j)&y=(i1,j1)がイメージ内の任意の 2 ピクセルである場合、双曲線タンジェント カーネルの場合、 myは次 のようH(x,y)に定義され ます。パラメータは 1/N として取得できます。ここで、N は私の画像の寸法 (私の場合は 8192 x 200) であり、c は問題に応じて任意の値を取ることができます。双曲線正接カーネルの詳細については、こちらを参照してください。H(i,j) = tanh(alpha*(x'*y) + c)alphacx'xalpha

目標を達成し、実行時間を考慮に入れるために、以下の MATLAB スクリプトを作成しました。

gray1=zeros(8192,200);
gray2=zeros(8192,200);

s1 = 8192;
s2 = 200;

alpha = s1*s2;

perms = combvec(1:s2,1:s1);
perms = [perms(2,:);perms(1,:)]';
perms1 = perms;

gray1(4096,100) = 10;
gray2(10,100) = 10;
img_diff = gray1 - gray2;

display('Calculation of Sigmoid Kernel started');

for i = 1:length(perms1)
    kernel = sum(bsxfun(@times,perms,perms1(i,:))');
    kernel1 = tanh((1/alpha)*kernel + 1)';
    g_temp(i) = img_diff(:)'*kernel1;
end

temp = g_temp*img_diff(:);
ans = sqrt(temp);

あらゆる努力にもかかわらず、ランニング コストを削減するためにこれ以上ベクトル化することはできませんでした。現在、完了するのに約 29 時間かかります。これは、さまざまな異なる画像に対して実行したいので、私には長すぎます。Gaussian Kernel の場合に @dan-man が行ったように、組み込みの MATLAB 関数を使用して完全にベクトル化された形式にしたいと考えています。彼の助けにより、Gaussian バージョンは 1 ~ 2 秒で完了しました。この場合も同じ機能を使用するために最善を尽くしましたconv2fftが、それを達成する方法を見つけるのは難しいようです.

同じ問題のガウスバージョンと同じ割合でアルゴリズムのランニングコストを得るために、余分なforループを1つ削除するのを手伝ってくれませんか。

前もって感謝します。

4

2 に答える 2

1

厄介なループを取り除くmatrix-multiplication-

g_temp = img_diff(:).'*tanh((1/alpha)*(perms*perms.')+1)
于 2016-08-04T14:56:37.573 に答える
1

PC で 50 回の反復を実行しただけで、コードは次のようになります。2.07s

bsxfun行を次のように変更するだけです

kernel = sum(bsxfun(@times,perms,perms1(i,:)),2)';

警告が示すように、あなたはそれを手に入れることができます1.65s

Neural Network ツールボックスを使用して で置き換えるtanhtansig、時間は次のようになります。1.44s

自分tanhで次のように書く場合

kernel1= (2./(1+exp(-2.*((1/alpha)*kernel + 1)))-1)';

時間は 1.28s

29hこれらの変更だけで からへの改善を意味します18h


そして、事前に割り当てることを忘れないでください!

g_temp=zeros(length(perms1),1);
于 2016-08-05T08:52:08.113 に答える