神经网络激活功能

时间:2014-03-31 17:42:30

标签: matlab neural-network

这是初学者级别的问题。 我有二进制的几个训练输入和神经网络我使用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
  1. 可以看出,乘法的结果是权重的第二行。这只是一个巧合吗?

  2. 接下来,

    SigmoidFn  =  1./(1+exp(-1.*x))
    
    SigmoidFn =
    
    0.5000    0.5000    0.7311    0.5000    0.5000
    
  3. round(SigmoidFn)
    
    ans =
    
         1     1     1     1     1
    
  4. 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

  5. 有人可以展示适当的阈值代码和简要说明何时使用哪种激活功能?我的意思是应该有一定的逻辑,否则为什么会有不同类型的功能? 编辑:实施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
    

1 个答案:

答案 0 :(得分:2)

Hopfield networks不使用sigmoid非线性;节点的状态简单地更新为其加权输入是否大于或等于其偏移量。

你想要像

这样的东西
output2 = Weights * Input1' >= offsets;

其中offsetsInput1的大小相同。我使用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

如果您参考维基百科页面,这就是所谓的同步更新方法。