- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含 2 个输入、2 个隐藏神经元和 1 个输出神经元的神经网络来解决 xor
问题。我在 0 和 1 之间随机初始化权重,我使用 0.1
的学习率和 sigmoid
激活函数。
当我只训练一个选项时,例如目标为 1 的 1 和 0,它工作正常并给出了适当的猜测。但是,当我尝试一起训练所有可能的输入时,输出收敛在 0.5-0.6
附近。
我试过改变学习率、随机初始化权重的范围和网络训练的次数,但这对最终输出没有影响。
这是我在 GitHub 上的代码的链接.
关于如何解决这个问题有什么想法吗?
最佳答案
我怀疑反向传播没有正确实现。例如,给出了概述。 http://users.pja.edu.pl/~msyd/wyk-nai/multiLayerNN-en.pdf 特别是第 17 到 20 页。
tuneWeigths
- 和 delta_weights
- Output_Neuron
类的方法已正确实现。但是,在此步骤中,必须确定数组 weightDeltaHidden
(请参阅代码中的注释),稍后在调整 Hidden_Neuron
类的权重时将需要它。
tuneWeigths
- 和 delta_weights
- Hidden_Neuron
类的方法似乎没有正确实现。在这里,除其他事项外,必须使用先前确定的数组 weightDeltaHidden
。
在下面的代码中,我进行了必要的更改,但并未从根本上更改代码的设计。但也许重构是有意义的。
Output_Neuron
类的变化:
...
private double[] weightedDeltaHidden;
...
Output_Neuron(int hiddenNeurons) {
...
this.weightedDeltaHidden = new double[hiddenNeurons];
}
...
void tuneWeights(double LR, double[] hidden_output, int target) {
double delta = (target - output) * f.dSigmoid(output);
for (int i = 0; i < weights.length; i++) {
weights[i] += delta_weights(i, LR, delta, hidden_output);
}
}
double delta_weights(int i, double LR, double delta, double[] hidden_output) {
weightedDeltaHidden[i] = delta * weights[i]; // weightedDeltaHidden is the product of delta of this output neuron and the weight of the i-th hidden neuron.
// That value is needed when the weights of the hidden neurons are tuned...
return LR * delta * hidden_output[i];
}
...
double[] getWeightedDeltaHidden() {
return weightedDeltaHidden;
}
Hidden_Neuron
类的变化:
...
void tuneWeights(double LR, int[] inputs, double weightedDeltaHiddenTotal) {
for (int i = 0; i < weights.length; i++) {
weights[i] += delta_weights(LR, inputs[i], weightedDeltaHiddenTotal);
}
}
private double delta_weights(double LR, double input, double weightedDeltaHiddenTotal) {
double deltaOutput = f.dSigmoid(output) * weightedDeltaHiddenTotal;
return LR * deltaOutput * input;
}
...
Network
中的变化 - train
内的类 - 调整隐藏权重的方法:
void train(int[] inputs, int target) {
...
//tune Hidden weights
for (int i = 0; i < numOfHiddenNeurons; i++) {
double weightedDeltaHiddenTotal = 0;
for (int j = 0; j < numOfOutputNeurons; j++) {
weightedDeltaHiddenTotal += output_neurons[j].getWeightedDeltaHidden()[i]; // weightedDeltaHiddenTotal is the sum of the weightedDeltaHidden over all output neurons. Each weightedDeltaHidden
} // is the product of delta of the j-th output neuron and the weight of the i-th hidden neuron.
hidden_neurons[i].tuneWeights(LR, inputs, weightedDeltaHiddenTotal);
}
}
通过这些更改,1_000_000 个train
调用(2 个隐藏神经元)的典型输出是
Error: 1.9212e-01 in cycle 0
Error: 8.9284e-03 in cycle 100000
Error: 1.5049e-03 in cycle 200000
Error: 4.7214e-03 in cycle 300000
Error: 4.4727e-03 in cycle 400000
Error: 2.1179e-03 in cycle 500000
Error: 2.9165e-04 in cycle 600000
Error: 2.0655e-03 in cycle 700000
Error: 1.5381e-03 in cycle 800000
Error: 1.0440e-03 in cycle 900000
0 0: 0.0170
1 0: 0.9616
0 1: 0.9612
1 1: 0.0597
对于 100_000_000 个train
-调用(2 个隐藏神经元)
Error: 2.4755e-01 in cycle 0
Error: 2.7771e-04 in cycle 5000000
Error: 6.8378e-06 in cycle 10000000
Error: 5.4317e-05 in cycle 15000000
Error: 6.8956e-05 in cycle 20000000
Error: 2.1072e-06 in cycle 25000000
Error: 2.6281e-05 in cycle 30000000
Error: 2.1630e-05 in cycle 35000000
Error: 1.1546e-06 in cycle 40000000
Error: 1.7690e-05 in cycle 45000000
Error: 8.6837e-07 in cycle 50000000
Error: 1.3603e-05 in cycle 55000000
Error: 1.2905e-05 in cycle 60000000
Error: 2.1657e-05 in cycle 65000000
Error: 1.1594e-05 in cycle 70000000
Error: 1.9191e-05 in cycle 75000000
Error: 1.7273e-05 in cycle 80000000
Error: 9.1364e-06 in cycle 85000000
Error: 1.5221e-05 in cycle 90000000
Error: 1.4501e-05 in cycle 95000000
0 0: 0.0008
1 0: 0.9961
0 1: 0.9961
1 1: 0.0053
隐藏神经元的增加提高了性能。下面显示了 1_000_000 次 train
调用(4 个隐藏神经元)的典型输出:
Error: 1.2617e-02 in cycle 0
Error: 7.9950e-04 in cycle 100000
Error: 4.2567e-04 in cycle 200000
Error: 1.7279e-04 in cycle 300000
Error: 1.2246e-04 in cycle 400000
Error: 1.0456e-04 in cycle 500000
Error: 6.9140e-05 in cycle 600000
Error: 6.8698e-05 in cycle 700000
Error: 5.1640e-05 in cycle 800000
Error: 4.4534e-05 in cycle 900000
0 0: 0.0092
1 0: 0.9905
0 1: 0.9912
1 1: 0.0089
关于Java XOR 神经网络训练不当,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54837078/
XOR 的各个部分如何命名? A xor B = C A和B叫什么 对于分部,它是: A / B = C A = 除数,B = 被除数,C = 商 对于和(和 XOR 与和一样对称)它是 A + B
我在算法方面遇到了问题。 我有一个用于 IO 的字节,可以使用称为 XorAndXor 的方法设置其中的某些位。该算法的工作原理如下: newValue = (((currentValue XOR x
我很惊讶地看到一个 BPMN 图,其中一个异或决策(“XOR-Split”)用相同的网关符号“关闭”。 我真的想知道证明这种方法合理的原因是什么。在我看来,这是多余的。 事实似乎是,XOR-Join
我在查看 XOR 链接列表的实现时多次遇到这段代码,但似乎没有一个人正确解释了这一行(或者也许我错过了一些东西) - struct node* XOR (struct node *a, struct
这应该是一个简单的问题。我是 Coq 的新手。 我想在 Coq 中定义exclusive or in Coq(据我所知,这不是预定义的)。重要的部分是允许多个命题(例如 Xor A B C D)。 我
我试图记住数学是如何计算出来的,以计算循环冗余检查中 XOR 算法的剩余部分,以验证网络消息的剩余位。 我不应该扔掉那本教科书。 这在代码中很容易完成,但是如何手工完成呢? 我知道它看起来有点像标准除
给定一个数字 N 和一个整数数组(所有整数都小于 2^15)。 (A 是数组 100000 的大小) 从数组中找到 N 和整数的最大 XOR 值。 Q是查询次数(50000)和开始,停止是数组中的范围
这更像是一个有趣的问题。我正在研究 SC61860 CPU,它是 8 位 CPU,用于 1987 年的 Sharp PC-1360 掌上电脑(也用于 PC-1401 和 1403)。它的指令集实际上并
我正在尝试在 c 中进行某种异或文件加密,并在 javascript 中进行解密(使用 this 作为基础,现在我遇到了以下问题: 例如我想在 C 中执行 73^122,结果是 57,但在 javas
我的任务是计算数组中字节的异或和: X = char1 XOR char2 XOR char3 ... charN; 我正在尝试将其并行化,改为对 __m128 进行异或运算。这应该提供加速因子 4。
我有一系列错误或 View ( Seq[Xor[Error,View]] ) 我想将其映射到第一个错误(如果有)或 View 序列的异或 ( Xor[Error, Seq[View]] ) 或者可能只
这是我想做的一个例子:假设我有 5 个类,我想表达这样的约束,即我们可以将类“B”或/和“C”的实例链接到“A”,如果是这样,我们就不能拥有其他任何东西,如果我们不这样做没有这些类的任何实例,我们只能
因此我们可以确定异或距离度量是一个真实的度量(它是对称的,满足三角不等式等) 在阅读 Kademlia 及其 k-buckets 之前,我在想每个节点都会简单地找到自己的 id 并存储其最近的 k 个
该函数用于计算一个32位整数的异或 int xor32int(int x, int y) { int res = 0; // Initialize result // Assuming
我是加密新手,我正在尝试解释以下代码。即, 是什么?什么意思? 我有一个 secret_key key 。我也有一个 unique_id。我使用下面的代码创建垫。 pad = hmac.new(sec
我正在尝试将一些 javascript 代码复制到 python 中,由于某种原因,javascript 中的 XOR 运算符 (^) 给我的值与 python 中的 XOR 运算符 (^) 不同。我
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
这个问题在这里已经有了答案: Does Typescript support mutually exclusive types? (7 个答案) 关闭 3 年前。 我怎么说我希望一个接口(inter
我有一些未知的 C++ 代码是在发布版本中编译的,因此对其进行了优化。我正在努力解决的问题是: xor al, al add esp, 8 cmp byte ptr [ebp+
我得到了以下卡诺图,但我仍然无法从每个表中计算 XOR 的表达式。 Table 1 -------
我是一名优秀的程序员,十分优秀!