쌍곡선 접선 (Sigmoid) 커널을 사용하여 두 이미지 사이의 유클리드 거리를 계산하고 싶습니다. this 링크를 따라 가면서 Gaussian Kernel을 사용하여 동일한 문제에 대해 자세히 논의했습니다. H(i,j) = tanh(alpha*(x'*y) + c)
곳 alpha
및 c
매개 변수이며, x'
는 x
의 전치 : & y=(i1,j1)
x=(i,j)
는 쌍곡선 탄젠트 커널 다음 우리의 이미지에서 두 픽셀이 경우큰 데이터를위한 루프 최적화 for matlab
, 내 H(x,y)
는 다음과 같이 정의됩니다. 매개 변수 alpha
은 1/N으로 취할 수 있습니다. 여기서 N은 내 이미지 크기 (8192 x 200)이며 문제에 따라 c 값을 취할 수 있습니다. 쌍곡선 탄젠트 커널에 대한 더 자세한 설명은 here입니다.
내 목표 인 &을 실행 시간을 유지하기 위해 아래 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 Version은 1-2 초가 걸렸습니다. 이 경우에도 동일한 conv2fft
기능을 사용하기 위해 최선을 다했지만 그 방법을 찾기가 어려워 보입니다.
누군가가 알고리즘에 대한 실행 비용을 Gaussian 버전의 동일한 문제와 동일한 비율로 얻으려면 루프 용 extra for 루프를 제거 할 수 있습니까?
미리 감사드립니다.
프로파일을 만들었습니까? –
와우, 당신의 for 루프는'1638400'입니다. 많이 그렇습니다 –
@Ander 예 .. 제가 프로파일 링했습니다. 단지 780 반복에 대해 약 50 초 걸립니다. 따라서 1638400 회 반복의 경우 약 29 시간이 소요됩니다. – nagarwal