我的单层感知器不工作

My single layer perceptrone is not working

这是代码。

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 这很奇怪,因为算法没有任何问题。 权重越来越大。我哪里弄错了?

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

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

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;
}