【问题标题】:My single layer perceptrone is not working我的单层感知器不工作
【发布时间】:2016-11-11 21:42:07
【问题描述】:

这是代码。

public class Adaline
{
    private int _layer;
    public int Layer { get { return _layer; } }
    private int _epoch;
    public int Epoch { get { return _epoch; } }
    private double _error;
    public double Error { get { return _error; } }

    private double[] _weights;

    public Adaline(int layer)
    {
        _layer = layer;
        _weights = new double[layer];
        Reset();
    }

    public void Reset()
    {
        Random r = new Random();
        for (int i = 0; i < _layer; i++)
            _weights[i] = r.NextDouble() - 0.5;
        _error = 1;
    }

    public void Train(BasicTrainSet<double> trainset, double learnRate)
    {
        double ers = 0;
        for(int p = 0; p < trainset.DataCount; p++)
        {
            double result = Compute(trainset.Input[p], true);
            double error = trainset.Output[p] - result;

            for (int i = 0; i < _weights.Length; i++)
            {
                _weights[i] += error * trainset.Input[p][i] * learnRate;
            }

            ers += Math.Abs(error);
        }
        _epoch++;
        _error = ers;
    }

    public double Compute(double[] input, bool quan)
    {
        double result = 0;
        for (int i = 0; i < _layer; i++)
            result += Math.Tanh(_weights[i] * input[i]);
        //double result = _weights.Zip(input, (a, b) => Math.Tanh(a * b)).Sum();
        return quan ? (result >= 0 ? 1 : 0) : result;
    }
}

当我尝试像这样训练和门控时,它的工作原理是这样的。 Up four results are from this code 这很奇怪,因为算法没有任何问题。 权重越来越大。我哪里弄错了?

【问题讨论】:

  • 你能展示你是如何训练你的感知器的吗?我的意思是执行你的训练逻辑的代码。
  • 您在每次累积操作后应用 tanh。您需要先累积,然后再应用 tanh。
  • @rayryeng 谢谢,现在工作得很好。 :)

标签: c# machine-learning neural-network perceptron


【解决方案1】:

在您计算每个神经元输出的代码中,您没有正确应用激活函数。您需要找到每个神经元的权重和输入之间的点积然后应用激活函数。您在每次加权累加后应用激活函数,这是不正确的。

累积,然后应用激活函数:

public double Compute(double[] input, bool quan)
{
    double result = 0;
    for (int i = 0; i < _layer; i++)
        result += _weights[i] * input[i]; // Change - accumulate first
    result = Math.Tanh(result); // Change - now apply activation function

    return quan ? (result >= 0 ? 1 : 0) : result;
}

【讨论】:

  • 我使用 linq 来编写更短的代码。 double result = Sigmoid.LogSigmoid(_weights.Zip(input, (a, b) =&gt; (a * b)).Sum() + _biasWeight);
猜你喜欢
  • 2020-11-04
  • 2012-04-30
  • 2015-08-14
  • 2013-08-20
  • 2014-12-06
  • 2023-03-03
  • 2015-08-05
  • 2014-11-04
相关资源
最近更新 更多