这是初学者级别的问题。
我有二进制的几个训练输入和神经网络我使用sigmoid阈值函数SigmoidFn(Input1*Weights)
其中
SigmoidFn(x) = 1./(1+exp(-1.*x));
使用上述功能将给出连续的实数。但是,我希望输出是二进制的,因为网络是Hopfield神经网络(单层5输入节点和5个输出节点)。我面临的问题是我无法正确理解各种阈值功能的使用和实现。下面给出的权重是真实权重,并在论文中提供。所以,我使用权重生成几个训练样例,通过保持权重固定几个输出样本,即只运行神经网络几次。
Weights = [0.0 0.5 0.0 0.2 0.0
0.0 0.0 1.0 0.0 0.0
0.0 0.0 0.0 1.0 0.0
0.0 1.0 0.0 0.0 0.0
0.0 0.0 0.0 -0.6 0.0];
Input1 = [0,1,0,0,0]
x = Input1*Weights; % x = 0 0 1 0 0
可以看出,乘法的结果是权重的第二行。这只是一个巧合吗?
接下来,
SigmoidFn = 1./(1+exp(-1.*x))
SigmoidFn =
0.5000 0.5000 0.7311 0.5000 0.5000
round(SigmoidFn)
ans =
1 1 1 1 1
Input2 = [1,0,0,0,0]
x = Input2*Weights
x = 0 0.5000 0 0.2000 0
SigmoidFn = 1./(1+exp(-1.*x))
SigmoidFn = 0.5000 0.6225 0.5000 0.5498 0.5000
>> round(SigmoidFn)
ans =
1 1 1 1 1
使用圆函数round(SigmoidFn(x))
是一种好习惯。 ?获得的结果不正确。
或者当我使用任何阈值函数时,我应该如何获得二进制结果:
(a)HArd限制
(b)Logistic sigmoid
(c)Tanh
有人可以展示适当的阈值代码和简要说明何时使用哪种激活功能?我的意思是应该有一定的逻辑,否则为什么会有不同类型的功能? 编辑:实施Hopfield,通过保持权重固定,通过连续迭代重新调用输入模式。
Training1 = [1,0,0,0,0];
offset = 0;
t = 1;
X(t,:) = Training1;
err = 1;
while(err~=0)
Out = X(t,:)*Weights > offset;
err = ((Out - temp)*(Out - temp).')/numel(temp);
t = t+1
X(t,:) = temp;
end
答案 0 :(得分:2)
Hopfield networks不使用sigmoid非线性;节点的状态简单地更新为其加权输入是否大于或等于其偏移量。
你想要像
这样的东西output2 = Weights * Input1' >= offsets;
其中offsets
与Input1
的大小相同。我使用Weights * Input1'
而不是Input1 * Weights
,因为我见过的大多数示例都使用左乘法进行更新(也就是说,权重矩阵的行标记了输入节点,列标记了输出节点),但是你必须看看你的体重矩阵在哪里确定。
您应该知道,在收敛到表示存储模式的固定点之前,您必须多次执行此更新操作。
在回答您的其他问题时,您选择的权重矩阵不存储可以使用Hopfield网络调用的任何内存。它包含一个不允许网络收敛的周期2 -> 3 -> 4 -> 2 ...
。
通常,您将以与编辑中所写方式类似的方式恢复内存:
X = [1,0,0,0,0];
offset = 0;
t = 1;
err = 1;
nIter = 100;
while err ~= 0 && t <= nIter
prev = X;
X = X * Weights >= offset;
err = ~isequal(X, prev);
t = t + 1;
end
if ~err
disp(X);
end
如果您参考维基百科页面,这就是所谓的同步更新方法。