【发布时间】:2019-09-19 16:05:11
【问题描述】:
我正在使用 sigmoid 激活函数创建神经网络,但我的权重调整函数不起作用。权重从 -1 随机初始化到 1,随着网络训练,这些值超出范围。
权重存储在邻接矩阵中,每个权重都通过循环调整,我的教授给了我这个公式来计算权重的变化(deltaW)。当将 deltaW 添加到当前重量时,我尝试将其设为负值,因为我的教授建议尝试这样做,但没有这样的运气。我已经测试了所有其他功能并且它们工作正常,所以我的问题必须在这里。
void adjustWeights(struct neuralNetwork* network_ptr, struct dataSet data){
float stepsize = 0.1,
summation = 0,
deltaW = 0;
for(int i=0; i<2; i++){//adjust weights between intermediate and output
for(int j=0; j<3; j++){
deltaW =stepsize*(network_ptr->outputNodes[i] - data.target[i]) * network_ptr->outputNodes[i]* (1 -network_ptr->outputNodes[i]) * network_ptr->intermediateNodes[j];
//cout << "weight: " << network_ptr->intermediateToOutput[j][i] << " deltaW: " << deltaW;
network_ptr->intermediateToOutput[j][i] += deltaW;
//cout << " new weight: " << network_ptr->intermediateToOutput[j][i] << endl;
}
}
for(int i=0;i<3; i++){ //adjust weights between input and intermediate
for(int j=0;j<3; j++){
for(int k=0; k<2; k++)//this does the summation portion of the weight adjusment.
summation =(network_ptr->outputNodes[k] - data.target[k]) * network_ptr->outputNodes[k]* (1 -network_ptr->outputNodes[k]) * network_ptr->intermediateNodes[j]*network_ptr->intermediateToOutput[j][k]
* network_ptr->intermediateNodes[j]* (1- network_ptr->intermediateNodes[j]) * network_ptr->inputNodes[i];
network_ptr->inputToIntermediate[i][j] += stepsize*summation;
}
}
}
随着权重的调整,它们只是出于某种原因不断增长。有一次我跑它,体重上升到 7.8。 我把整个项目发给了我的教授,他说一切似乎都是正确的。所以我完全傻眼了。
非常感谢任何建议!
【问题讨论】:
-
不相关:考虑将
data作为const引用传递,const dataSet & data,以防止可避免的复制。另请注意,C++ 很聪明。它知道struct是struct,所以你不必一直告诉它。 -
建议:将其中一些巨型行拆分为多个计算。您可以更轻松地窥探使用调试器或打印语句发生的事情。如果您担心性能,请不要。通过优化编译,您为使代码更容易适应人脑所做的所有事情都将被打包成更严格的高速难以辨认形式。让您轻松编写代码,让编译器将其变成计算机乱码。
标签: c++ machine-learning neural-network backpropagation