(Hebbian学习)
我的任务是在Matlab中编写Oja学习规则和Sanger学习规则,以训练一个神经网络。这个神经网络有6个输入和4个输出,我的训练集来自多元均匀分布,例如Xi ~ U(-ai,ai)和ai≠aj,对于所有的i≠j。
这些是最相关的文件(大多数评论和oja.m不包括在内)
main.m
TS = generarVectoresUnif(6, [1, 4, 9, 36, 25, 16], 512);
TS = TS';
W = unifrnd(0,1,[4,6]);
% it not very fast. That's why I put 500 iterations
W_sanger = sanger(W,TS,500, 0.05)generarVectoresUnif.m
function [ TS ] = generarVectoresUnif( dim, rangos, n )
dimensiones = int8(dim);
tamanio = int32(n);
TS = [];
for i = 1:dimensiones
TS = [TS, unifrnd(-rangos(i), rangos(i), [tamanio, 1]) ];
endsanger.m
(注:W是一个4×6大小的矩阵。Wi是第一输出的权向量.Wij = (Wi)j.在这个例子中,TS是一个6x512大小的矩阵)
function [ W ] = sanger( W_init, trainingset, iteraciones , eta)
W = W_init;
% obtiene los tamaños desde los parametros de entrada
size_input = size(W,2);
size_output = size(W,1);
n_patterns = size(trainingset, 2);
% one-tenth part
diezmo = iteraciones/10;
for it = 1:iteraciones
if 0 == mod(it, diezmo)
disp(horzcat('Iteracion numero ', num2str(it), ' de ',num2str(iteraciones)));
end
% for each pattern
for u = 1:n_patrones
DeltaW = zeros(size(W));
% Vi = sum{j=1...N} Wij * Xj
V = W * trainingset(:,u);
% sumatorias(i,j) is going to replace sum{k=1..i} Vk*Wkj
sumatorias = zeros(size_output,size_input);
for j = 1:size_input
for k = 1:size_output
% sumar de 1 hasta i, sin hacer otro ciclo
sumatorias(k,j) = (V' .* [ones(1,k), zeros(1,size_output-k)]) * W(:,j);
end
end
% calcula la variacion
for i = 1:size_output
for j=1:size_input
% Delta Wij = eta * Vi * ( xj - sum{k=1..i} Vk*Wkj )
DeltaW(i,j) = eta * V(i,1) * (trainingset(j,u) - sumatorias(i,j));
end
end
W = W + DeltaW;
%W = 1/norm(W) * W; %<---is it necessary? [Hertz] doesn't mention it
end
end你能告诉我我做错了什么吗?矩阵的值增长得非常快。我对oja.m也有同样的问题。
我试过:
用迭代次数的指数函数(->ok)代替eta ( 1/it --->NaN
发布于 2011-10-25 18:56:50
好的。在几次尝试之后,我让它成功了。
我选择一个相对较小的eta值: 0.00001。
W_sanger = sanger(W,TS,1000, 0.00001) 由于没有充分利用矩阵乘法的优点,利用Matlab对矩阵乘法进行了优化,使得计算速度仍然很慢。
我希望它能帮助别人不要重复同样的错误。
致以问候!
https://stackoverflow.com/questions/7868984
复制相似问题