跟随鼠标光标AI的神经网络输入异常问题排查求助
神经网络输入节点失效问题排查与修复
问题描述
开发了一款跟随鼠标光标的AI,初始设置mouseX和mouseY两个输入节点,但神经网络始终忽略mouseX的位置数据。尝试新增一个mouseX输入节点(输入节点变为:1: mouseX、2: mouseY、3: mouseX)后,神经网络转而忽略mouseY,仅使用mouseX数据。推测问题出在负责数值运算的compute()函数中,函数代码如下:
#brains: amount of AIs #hiddenLayerAmount: amount of hidden layers (in this case 1) #hiddenNodes[j]: Amount of nodes (2) def compute(): for i in range(brains): #INPUT LAYER TO FIRST HIDDEN LAYER for j in range(hiddenLayerAmount): for k in range(hiddenNodes[j]): if j == 0: for l in range(inputNodes): #OUTPUT #INPUT #WEIGHT #BIAS hiddenLayers[i][j][k][2] = inputLayer[i][l]*hiddenLayers[i][j][k][0][l]+hiddenLayers[i][j][k][1] #HIDDEN LAYER TO NEXT HIDDEN LAYER else: for l in range(hiddenNodes[j-1]): #OUTPUT #INPUT #WEIGHT #BIAS hiddenLayers[i][j][k][2] = hiddenLayers[i][j-1][k][2]*hiddenLayers[i][j][k][0][l]+hiddenLayers[i][j][k][1] #LAST HIDDEN LAYER TO OUTPUT LAYER for j in range(outputNodes): for k in range(hiddenNodes[-1]): #OUTPUT #INPUT #WEIGHT #BIAS outputLayer[i][j][2] = hiddenLayers[i][-1][k][2]*outputLayer[i][j][0][k]+outputLayer[i][j][1]
问题根源
代码的核心错误是每次循环输入节点时直接覆盖输出值,而非累加所有输入的加权贡献:
- 在输入层到隐藏层的计算中,每遍历一个输入节点
l,就会用当前输入的加权值+偏置直接替换节点输出,最终只保留了最后一个输入节点的计算结果 - 当输入为2个节点时,最后执行的是
l=1(对应mouseY),所以看起来忽略了mouseX;当输入为3个节点时,最后执行的是l=2(对应第三个mouseX),所以看起来忽略了mouseY
修复后的代码
修改计算逻辑,先初始化节点输出为偏置,再累加所有输入的加权值:
#brains: amount of AIs #hiddenLayerAmount: amount of hidden layers (in this case 1) #hiddenNodes[j]: Amount of nodes (2) def compute(): for i in range(brains): #INPUT LAYER TO FIRST HIDDEN LAYER for j in range(hiddenLayerAmount): for k in range(hiddenNodes[j]): if j == 0: # 初始化输出为偏置 hiddenLayers[i][j][k][2] = hiddenLayers[i][j][k][1] # 累加所有输入节点的加权贡献 for l in range(inputNodes): hiddenLayers[i][j][k][2] += inputLayer[i][l] * hiddenLayers[i][j][k][0][l] #HIDDEN LAYER TO NEXT HIDDEN LAYER else: # 初始化输出为偏置 hiddenLayers[i][j][k][2] = hiddenLayers[i][j][k][1] # 累加前一层所有节点的加权贡献 for l in range(hiddenNodes[j-1]): hiddenLayers[i][j][k][2] += hiddenLayers[i][j-1][k][2] * hiddenLayers[i][j][k][0][l] #LAST HIDDEN LAYER TO OUTPUT LAYER for j in range(outputNodes): # 初始化输出为偏置 outputLayer[i][j][2] = outputLayer[i][j][1] # 累加最后一层隐藏节点的加权贡献 for k in range(hiddenNodes[-1]): outputLayer[i][j][2] += hiddenLayers[i][-1][k][2] * outputLayer[i][j][0][k]
修复说明
- 所有层的节点输出先初始化为对应偏置值,确保偏置被正确纳入计算
- 通过循环累加每个输入源的加权值,保证所有输入节点的信息都被神经网络接收,不会被后续输入覆盖
- 修改后,神经网络会同时处理
mouseX和mouseY的输入数据,不会再出现忽略单个输入的情况
内容的提问来源于stack exchange,提问作者just_banana3
相关产品推荐
相关产品推荐

