jer*_*luc 23 java simulation artificial-intelligence neural-network
我决定在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());
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的主要课程中,我在Jeff Heaton的图表建模中创建了简单的模拟:
但是,我想确保我对Neuron类的实现是正确的..我已经测试了所有可能的输入([true true],[true false],[false true],[false false]),它们都通过了我的手动验证.此外,由于此程序接受输入作为参数,它似乎也通过手动验证输入,如[true false false],[true true false]等.
但从概念上讲,这种实施是否正确?或者在我开始进一步开发和研究这个主题之前,我该如何改进呢?
谢谢!
小智 9
这看起来是一个很好的起点.我有一些建议:
对于可伸缩性,应该重构fire(),以便已经使用当前输入集触发的神经元不必每次都重新计算.如果您有另一个隐藏层或多个输出节点,则会出现这种情况.
考虑将阈值calc分割为自己的方法.然后你可以继承Neuron并使用不同类型的激活函数(双极sigmoid,RBF,线性等).
要学习更复杂的函数,请为每个神经元添加偏置输入.它基本上像另一个带有自身权重值的输入,但输入始终固定为1(或-1).
不要忘记允许训练方法.反向传播需要类似于fire()的反转,以获取目标输出并通过每个层来模拟重量变化.
归档时间: |
|
查看次数: |
32124 次 |
最近记录: |