【问题标题】:java simple neural network setupjava简单的神经网络设置
【发布时间】:2011-06-10 19:35:36
【问题描述】:

我决定在 Java 中尝试一些涉及神经网络的简单概念,并且通过修改我在论坛上找到的一些无用的代码,我已经能够为典型的初学者 XOR 模拟创建一个非常简单的模型:


public class MainApp {
    public static void main (String [] args) {
        Neuron xor = new Neuron(0.5f);
        Neuron left = new Neuron(1.5f);
        Neuron right = new Neuron(0.5f);
        left.setWeight(-1.0f);
        right.setWeight(1.0f);
        xor.connect(left, right);

        for (String val : args) {
            Neuron op = new Neuron(0.0f);
            op.setWeight(Boolean.parseBoolean(val));
            left.connect(op);
            right.connect(op);
        }

        xor.fire();

        System.out.println("Result: " + xor.isFired());

    }
}

public class Neuron {
    private ArrayList inputs;
    private float weight;
    private float threshhold;
    private boolean fired;

    public Neuron (float t) {
        threshhold = t;
        fired = false;
        inputs = new ArrayList();
    }

    public void connect (Neuron ... ns) {
        for (Neuron n : ns) inputs.add(n);
    }

    public void setWeight (float newWeight) {
        weight = newWeight;
    }

    public void setWeight (boolean newWeight) {
        weight = newWeight ? 1.0f : 0.0f;
    }

    public float getWeight () {
        return weight;
    }

    public float fire () {
        if (inputs.size() > 0) {
            float totalWeight = 0.0f;
            for (Neuron n : inputs) {
                n.fire();
                totalWeight += (n.isFired()) ? n.getWeight() : 0.0f;
            }
            fired = totalWeight > threshhold;
            return totalWeight;
        }
        else if (weight != 0.0f) {
            fired = weight > threshhold;
            return weight;
        }
        else {
            return 0.0f;
        }
    }

    public boolean isFired () {
        return fired;
    }
}

在我的主课中,我在 Jeff Heaton 的图表建模中创建了简单的模拟:

但是,我想确保我对 Neuron 类的实现是正确的。我已经测试了所有可能的输入([true true]、[true false]、[false true]、[false false]),并且他们都通过了我的手动验证。此外,由于这个程序接受输入作为参数,它似乎也通过了手动验证,例如 [true false false]、[true true false] 等。

但从概念上讲,这种实现是否正确?或者在我开始进一步开发和研究这个主题之前,我该如何改进它?

谢谢!

【问题讨论】:

  • 只是为了在具有必要 CPU 的大型应用程序中节省内存,添加衰减率可能会更好,其值可以在第二个构造函数中定义

标签: java artificial-intelligence neural-network simulation


【解决方案1】:

这看起来是一个很好的起点。我确实有一些建议:

  1. 为了可扩展性,应该对 fire() 进行重组,以便已经使用当前输入集触发的神经元不必每次都重新计算。如果您有另一个隐藏层或多个输出节点,就会出现这种情况。

  2. 考虑将阈值计算拆分为自己的方法。然后,您可以将 Neuron 子类化并使用不同类型的激活函数(双极 sigmoid、RBF、线性等)。

  3. 要学习更复杂的函数,请为每个神经元添加一个偏置输入。它基本上就像另一个输入,具有自己的权重值,但输入始终固定为 1(或 -1)。

  4. 不要忘记允许训练方法。反向传播需要类似于 fire() 的逆函数,以获取目标输出并在每一层中波动权重变化。

【讨论】:

  • 感谢您的建议!但是,我需要对这个主题做更多的研究,因为我觉得你所建议的大部分内容是什么意思,哈哈
【解决方案2】:

从我对神经网络所做的(有限的)工作来看,该实现和模型对我来说看起来是正确的 - 输出是我所期望的,源代码看起来很可靠。

【讨论】:

  • 感谢您的回复,从您的任何经验来看,您在这个 Neuron 类的可扩展性方面有什么问题吗?从我的角度来看,我已尝试使其具有足够的可扩展性以适应多个内层神经元,但两种观点都比一种观点要好。
猜你喜欢
  • 2017-12-30
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2018-04-10
  • 2017-02-09
  • 2013-03-02
相关资源
最近更新 更多