C++从零实现反向传播神经网络训练XOR不收敛问题求助
问题根因定位
你代码的bug出在activate函数的加权求和逻辑里,累加前层输出时没有乘对应神经元的权重,相当于所有权重都被强制固定为1使用,网络自然无法学到输入和输出之间的映射关系。
修复后的activate函数代码
std::vector<float> activate(std::vector<float> inputs) { outputs[0] = inputs; /* the "outputs" of the first layer are the inputs */ for(int l = 1; l < layers.size(); l++) for(int n = 0; n < layers[l]; n++) { float sum = weights[l][n][layers[l-1]]; // bias for(int w = 0; w < layers[l-1]; w++) { // 原错误写法:sum += outputs[l-1][w]; sum += weights[l][n][w] * outputs[l-1][w]; // 修复后:累加时乘对应权重 } outputs[l][n] = transfer(sum); } return outputs[layers.size()-1]; }
验证建议
- XOR任务可选择
{2, 2, 1}的网络配置(2输入、2个隐藏层神经元、1输出),学习率设置为0.10.5,训练1万10万轮即可正常收敛。 - 权重随机化范围建议选
(-1, 1),避免初始值过大导致sigmoid函数进入饱和区影响训练效率。
内容的提问来源于stack exchange,提问作者Paweł Lis
相关产品推荐
相关产品推荐

