Matlab 神经网络激活函数
这是初学者水平的问题。 我有几个二进制的训练输入,对于神经网络,我使用了一个sigmoid阈值函数Matlab 神经网络激活函数,matlab,neural-network,Matlab,Neural Network,这是初学者水平的问题。 我有几个二进制的训练输入,对于神经网络,我使用了一个sigmoid阈值函数SigmoidFn(Input1*权重)where SigmoidFn(x) = 1./(1+exp(-1.*x)); 使用上述函数将给出连续实数。但是,我希望输出是二进制的,因为网络是Hopfield神经网络(单层5个输入节点和5个输出节点)。我面临的问题是无法正确理解各种阈值功能的使用和实现。下面给出的权重是本文提供的真实权重。因此,我使用权重生成几个训练示例,通过保持权重固定,生成几个输出
SigmoidFn(Input1*权重)
where
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(x))
是否是一种良好的做法?所得结果不正确。
或者,当我使用任何阈值函数时,我应该如何获得二进制结果:
(a) 硬限制
(b) 逻辑乙状结肠
(c) 谭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
不要使用S形非线性;节点的状态只需更新为其加权输入是否大于或等于其偏移量
你想要什么
output2 = Weights * Input1' >= offsets;
其中偏移量
与输入1
的大小相同。我使用了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
X=[1,0,0,0];
偏移量=0;
t=1;
误差=1;
硝酸盐=100;
而err~=0&&t=offset;
err=~isequal(X,上一个);
t=t+1;
结束
如果~出错
disp(X);
结束
如果您参考维基百科页面,这就是所谓的同步更新方法。谢谢您的回复。我不太明白补偿的含义。如果输入是说p_1=[1-1-1-1-1-1]和output2=Weights*p_1,那么我应该做ind1=output2 1;输出2(ind1)=-1;输出2(ind2)=1;我不确定我是否理解你的要求。。。Hopfield网络中的每个节点都有一个相关的偏移量,即其输入在打开之前必须达到的高度。如果你不知道偏移量,你将无法从权重矩阵中获得正确的记忆,但也许你可以假设所有偏移量都为零。在这种情况下,您需要的代码只是
output2=(Weights*p_1>=0)代码>。我在上面的例子中使用的论文是(基于模糊认知图的面向目标的决策支持),尽管我使用了不同的权重矩阵,这与pg2中的权重矩阵不同。模糊认知图与Hopfield相似,不同之处在于可以使用其他激活函数。因此,我无法模拟示例中描述的结果。这就是为什么我问作者如何使用逻辑函数的问题,论文充满了错误,因此我发现他们的例子更可能是错误的,而不是他们想说他们使用了一个sigmoid函数f
,这样f([0 0-1 0 1])=[1 0 0 0 1]
,他们在例子中似乎声称。。。除此之外,他们使用的模型并不局限于二进制值,因此当您获得非二进制输出时,您不应该担心。使用sigmoid产生二进制输出是不明智的;你只需要使用阶跃函数。啊,我明白了,所以为了产生二进制输出,应该直接使用阶跃函数。那么,从您的答案来看,为了从存储的模式中调用输入,迭代应该继续多少次?它应该是一个单一的迭代吗?请编辑您的回复,包括如何调用存储模式?我提供了一个代码来展示Hopfield的实现。但它并没有收敛,因为我所做的100%是错误的。最后,谢谢你看完那篇论文,感谢你的努力和时间。关于问题1:不,这绝对不是巧合。这就是工作原理。
output2 = Weights * Input1' >= offsets;
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