Matlab 神经网络激活函数

Matlab 神经网络激活函数,matlab,neural-network,Matlab,Neural Network,这是初学者水平的问题。 我有几个二进制的训练输入,对于神经网络,我使用了一个sigmoid阈值函数SigmoidFn(Input1*权重)where SigmoidFn(x) = 1./(1+exp(-1.*x)); 使用上述函数将给出连续实数。但是,我希望输出是二进制的,因为网络是Hopfield神经网络(单层5个输入节点和5个输出节点)。我面临的问题是无法正确理解各种阈值功能的使用和实现。下面给出的权重是本文提供的真实权重。因此,我使用权重生成几个训练示例,通过保持权重固定,生成几个输出

这是初学者水平的问题。 我有几个二进制的训练输入,对于神经网络,我使用了一个sigmoid阈值函数
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函数
    round(SigmoidFn(x))
    是否是一种良好的做法?所得结果不正确。 或者,当我使用任何阈值函数时,我应该如何获得二进制结果: (a) 硬限制 (b) 逻辑乙状结肠 (c) 谭

  • 有人能告诉我阈值设置的正确代码,并简要说明什么时候使用哪个激活函数吗?我的意思是应该有一定的逻辑,否则为什么会有不同类型的函数? 编辑:通过保持权重固定,实现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
    
    不要使用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