- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
过去两周我一直在学习反向传播,做了它背后的数学计算,并认为我对这个主题的理解足够好,可以自己实现(没有任何线性代数包等)。显然,我错了。您可以在下面找到我能想到的最简单的示例网络:2 个隐藏单元和 1 个输出单元。我尝试学习 XOR 函数。但是,这根本不起作用。预测始终在 0.5
左右。我不确定我在哪里搞砸了。也许有人可以提供帮助?
float sigmoid(float pX) {
return 1.0f/(1.0f+exp(-1.0f*pX));
}
int main(int argc, char const *argv[]) {
// DEFINE XOR problem
float examples[4][2] = { {0,0} , {0,1}, {1,0}, {1,1}};
float labels[4] = {0, 1, 1, 0};
/* I want to use a network with two hidden neurons and 1 output neuron
*/
// Weights from input to hidden neurons
float WInput[2][2];
float WInputBias[2];
// Weights from hidden to output neuron
float WOutput[2];
float WOutputBias;
// output of hidden layer to output neuron
float hidden[2];
// error for hidden layer
float error[2];
//output of network
float yPred;
// randomly init weights
std::random_device rd;
std::mt19937 gen(rd());
std::normal_distribution<float> d(0, 0.1);
WInput[0][0] = d(gen); WInput[0][1] = d(gen);
WInput[1][0] = d(gen); WInput[1][1] = d(gen);
WInputBias[0] = d(gen); WInputBias[1] = d(gen);
WOutput[0] = d(gen); WOutput[1] = d(gen); WOutputBias = d(gen);
// do the learning
for(unsigned int i = 0; i < 1000; ++i) {
for (unsigned int k = 0; k < 4; ++k) {
float * input = &examples[k][0];
float label = labels[k];
// Compute forward pass
hidden[0] = sigmoid(WInput[0][0]*input[0] + WInput[1][0]*input[1] + WInputBias[0]);
hidden[1] = sigmoid(WInput[0][1]*input[0] + WInput[1][1]*input[1] + WInputBias[1]);
yPred = sigmoid(WOutput[0]*hidden[0] + WOutput[1]*hidden[1] + WOutputBias);
std :: cout << "Target / Prediction: " << label << " / " << yPred << std :: endl;
// Backward pass with alpha = 0.1
float outputError = -(label - yPred)*yPred*(1-yPred);
WOutput[0] = WOutput[0] - 0.1f*outputError*hidden[0]; //hidden equals input from this layer
WOutput[1] = WOutput[1] - 0.1f*outputError*hidden[1];
WOutputBias = WOutputBias - 0.1f*outputError;
error[0] = (WOutput[0]*outputError)*hidden[0]*(1-hidden[0]);
error[1] = (WOutput[1]*outputError)*hidden[1]*(1-hidden[1]);
WInput[0][0] = WInput[0][0] - 0.1f*error[0]*input[0];
WInput[1][0] = WInput[1][0] - 0.1f*error[0]*input[1];
WInput[0][1] = WInput[0][1] - 0.1f*error[1]*input[0];
WInput[1][1] = WInput[1][1] - 0.1f*error[1]*input[1];
WInputBias[0] = WInputBias[0] - 0.1f*error[0];
WInputBias[1] = WInputBias[1] - 0.1f*error[1];
}
std :: cout << std :: endl;
// getch();
}
}
最佳答案
我又看了一遍代码,并尝试了一些参数,结果证明所有代码实际上都是正确的。
问题是,只有 2 个隐藏节点,这个问题很难学习,你使用的训练周期数 (1000) 与你使用的学习率 (0.1) 相结合意味着它还没有收敛。
尝试让它训练大约 4000-6000 个时期(或者,最好是,直到误差的绝对值降至某个阈值以下),并尝试将权重更新乘以 1.0 而不是 0.1。那么你应该会得到更好的结果。
它也可能有助于随机初始化权重位于 [-0.1, 0.1] 而不是 [0.0, 0.1]。不过,这应该不会有太大的不同。
关于c++ - 反向传播不适用于 XOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39663730/
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 -------
我是一名优秀的程序员,十分优秀!