Hopfield Network





1. Pengertian [Kembali]

Jaringan Hopfield adalah bentuk jaringan saraf tiruan berulang yang dipopulerkan oleh John Hopfield pada tahun 1982, tetapi dijelaskan sebelumnya oleh Little pada tahun 1974. Jaringan Hopfield berfungsi sebagai sistem memori yang dapat dialamati konten dengan node ambang batas biner
2. Binary Hopfield [kembali]






Unit dalam jaring Hopfield adalah unit ambang biner, yaitu unit hanya mengambil dua nilai berbeda untuk statusnya dan nilainya ditentukan oleh apakah input unit melebihi ambangnya atau tidak. Jaring Hopfield biasanya memiliki unit yang mengambil nilai 1 atau -1, dan konvensi ini akan digunakan di seluruh artikel ini. Namun, literatur lain mungkin menggunakan unit yang mengambil nilai 0 dan 1.

Setiap pasangan unit i dan j dalam jaringan Hopfield memiliki koneksi yang dijelaskan oleh bobot konektivitas w i j . Dalam pengertian ini, jaringan Hopfield dapat secara resmi digambarkan sebagai grafik lengkap yang tidak diarahkan G = ⟨V, f⟩ , di mana V  adalah seperangkat neuron McCulloch-Pitts dan f: V V→ R  adalah fungsi yang menghubungkan pasangan unit dengan nilai riil, bobot konektivitas.

Koneksi di jaring Hopfield biasanya memiliki batasan berikut:

    w i i = 0, ∀ i      (tidak ada unit yang memiliki koneksi dengan dirinya sendiri)
    wij = wji, ∀ i, j  (koneksi simetris )

Batasan yang menjadi bobot adalah jaminan simetris bahwa fungsi energi berkurang secara monoton saat mengikuti aturan aktivasi. Jaringan dengan bobot asimetris dapat menunjukkan perilaku periodik atau kacau; Namun, Hopfield menemukan bahwa perilaku ini terbatas pada bagian yang relatif kecil dari ruang fase dan tidak mengganggu kemampuan jaringan untuk bertindak sebagai sistem memori asosiatif yang dapat diatasi konten.


3. Kesimpulan [kembali]
         Jaringan saraf Hopfield diimplementasikan untuk menyelesaikan deteksi kontur masalah. Itu membuktikan kemampuannya untuk memecahkan masalah meniru algoritma ular. Jaringan saraf backpropagation tambahan telah diuji dan terbukti berguna untuk meningkatkan tahap preprocessing. Ada beberapa implementasi dari algoritma ular. Motivasi asli untuk mencoba pendekatan jaringan saraf adalah potensinya untuk diimplementasikan di paralel.

4. Kode MatLab  [kembali]

file snakes.m
% Implementation of snakes algorithm using
% a 2-D binary Hopfield network
clear all; clc;
IM = imread('snap4_contour_edited.bmp','bmp');
IM1 = imread('snap4.bmp','bmp');
% number of iterations
ITER = 8;
% vector for storing energy values
% at the end of each iteration
E = zeros(ITER,1);
% Parameters of the snake
alpha = 1;
beta = 1;
gamma = 100000;
% Number of nodes of the snake
N = 16
% Number of points in the searching grid
% for each snake node
M = 50;
% Matrix containing the outputs of each neuron
u = zeros(N,M);
% Matrix containing the maximum evolution function
v = zeros(N,M);
% 4D arrangement containing interconnection weights
% T(i,k,j,l)
T = zeros(N,M,N,M);
% Matrix containing bias term
% I(i,k)
I = zeros(N,M);
% X-coordinates of point represented by each network
% x(i,k) or x(j,l)
x = zeros(N,M);
% Y-coordinates of point represented by each network
% y(i,k) or y(j,l)
y = zeros(N,M);
% Normalized values of the gradient of the image
% at each point of interest
% g(i,k)
g = zeros(N,M);
% Compute x and y positions represented by each neuron
% compute g from edge image
%96 119
% SNAP1
% xo = 98;
% yo = 140;
% radius =60;
xo = 96;
yo = 119;
radius =50;
step = radius/M;
x = zeros(N,M);
y = zeros(N,M);
%imshow(IM);hold on;
for i=1:N
for j=1:M
x(i,j) = round(xo+j*step*cos((i-1)*22.5*pi/180));
y(i,j) = round(yo+j*step*sin((i-1)*22.5*pi/180));
%plot(y(i,j),x(i,j),’*’);hold on;
g(i,j) = (IM(x(i,j),y(i,j)) == 1);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % Compute interconnection weights
T = interc_weights( alpha,beta,x,y,N,M );
%
% % Compute bias term
I = gamma*g;
%load TI;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Initialization of snake
% initial position of snake in outer points
v(:,M) = ones(N,1);
k_ = M*ones(N,1);
imshow(IM1);hold on;
% Plot snake points
for i=1:N
plot(y(i,:)*v(i,:)',x(i,:)*v(i,:)','*r');hold on;
end
% initialization of corresponding elements of u
k=M;
for i=1:N
u(i,k) = prop( T,I,N,M,i,k,v );
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Iterate the network
%stats = zeros(N,M);
%v
%E = energy( v,T,I,N,M )
for iter=1:ITER
iter
for k=1:M
for i=1:N
%iter=iter+1
%E
% for iter=1:ITER
% iter
% i = 1+round(rand(1)*(N-1));
% k = 1+round(rand(1)*(M-1));
%stats(i,k) = stats(i,k)+1;
% obtain u(i,k’) of current point
u_ = u(i,:)*v(i,:)';
% compute output of neuron i,k
u(i,k) = prop( T,I,N,M,i,k,v );
% compute variation of energy
dE = ( u_ - u(i,k) ) - 1/2* ( T(i,k,i,k) + T(i,k_(i),i,k_(i)) ) + T(i,k,i,k_(i));
% maximum evolution function
if ( u(i,k) > u_ && dE < 0 )
v(i,k) = 1;
v(i,k_(i)) = 0;
k_(i) = k;
fprintf('change in %f %f \n',i,k);
end
end
end
figure
imshow(IM1);hold on;
% Plot snake points
for i=1:N
plot(y(i,:)*v(i,:)',x(i,:)*v(i,:)','*r');hold on;
end
%E(iter,1)=energy( v,T,I,N,M );
end
file prop.m
function [ u ] = prop( T,I,N,M,i,k,v )
% propagate forward
% u scalar
% v vector
u = 0;
for j=1:N
for l=1:M
u = u + T(i,k,j,l)*v(j,l);
end
end
u = u + I(i,k);
file interc_weights.m
function [ T ] = interc_weights( alpha,beta,x,y,N,M )
% Compute interconnection weights
T = zeros(N,M,N,M);
% case i = 1
% circular indexing property
% i-1 ---> N
% i-2 ---> N-1
i=1;
for k=1:M
for j=1:N
for l=1:M
T(i,k,j,l) = -((4*alpha+12*beta)*(i==j)-(2*alpha+8*beta)*((i+1)==j) - ...
(2*alpha+8*beta)*(N==j)+2*beta*((i+2)==j)+2*beta*((N-1)==j)) * ...
(x(i,k)*x(j,l)+y(i,k)*y(j,l));
end
end
end
% case i = 2
% circular indexing property
% i-1 ---> 1
% i-2 ---> N
i=2;
for k=1:M
for j=1:N
for l=1:M
T(i,k,j,l) = -((4*alpha+12*beta)*(i==j)-(2*alpha+8*beta)*(i+1==j) - ...
(2*alpha+8*beta)*(1==j)+2*beta*(i+2==j)+2*beta*(N==j)) * ...
(x(i,k)*x(j,l)+y(i,k)*y(j,l));
end
end
end
% case i=2:N-2
for i=3:N-2
for k=1:M
for j=1:N
for l=1:M
T(i,k,j,l) = -((4*alpha+12*beta)*(i==j)-(2*alpha+8*beta)*(i+1==j) - ...
(2*alpha+8*beta)*(i-1==j)+2*beta*(i+2==j)+2*beta*(i-2==j)) * ...
(x(i,k)*x(j,l)+y(i,k)*y(j,l));
end
end
end
end
% case i = N-1
% circular indexing property
% i+1 ---> N
% i+2 ---> 1
i=N-1;
for k=1:M
for j=1:N
for l=1:M
T(i,k,j,l) = -((4*alpha+12*beta)*(i==j)-(2*alpha+8*beta)*(N==j) - ...
(2*alpha+8*beta)*(i-1==j)+2*beta*(1==j)+2*beta*(i-2==j)) * ...
(x(i,k)*x(j,l)+y(i,k)*y(j,l));
end
end
end
% case i = N
% circular indexing property
% i+1 ---> 1
% i+2 ---> 2
i=N;
for k=1:M
for j=1:N
for l=1:M
T(i,k,j,l) = -((4*alpha+12*beta)*(i==j)-(2*alpha+8*beta)*(1==j) - ...
(2*alpha+8*beta)*(i-1==j)+2*beta*(2==j)+2*beta*(i-2==j)) * ...
(x(i,k)*x(j,l)+y(i,k)*y(j,l));
end
end
end
% % zero elements to avoid self-feedback
% for i=1:N
% for k=1:M
% T(i,k,i,k) = 0;
% end
% end
file energy.m
function [ E ] = energy( v,T,I,N,M )
% Compute Energy function of the 2-D Hopfield network
E = 0;
for i=1:N
for k=1:M
for j=1:N
for l=1:M
E = E - 1/2 * T(i,k,j,l)*v(i,k)*v(j,l);
end
end
end
end
for i=1:N
for k=1:M
E = E - I(i,k)*v(i,k);
end
end
end
end
end

Tidak ada komentar:

Posting Komentar