我正在尝试制作一个数字识别程序。我将输入一个数字的白色/黑色图像,我的输出层将触发相应的数字(一个神经元将触发,输出层中的 0 -> 9 个神经元)。我完成了二维反向传播神经元网络的实现。我的拓扑大小是 [5][3] -> [3][3] -> 1 [10]。所以它是一个二维输入层、一个二维隐藏层和一个一维输出层。但是我得到了奇怪和错误的结果(平均错误和输出值)。
在这个阶段进行调试有点费时。因此,我很想知道这是否是正确的设计,所以我继续调试。以下是我实施的流程步骤:
构建网络:除输出层外,每一层都有一个偏差(无偏差)。Bias 的输出值始终为 = 1.0,但其连接权重在每次传递时都会像网络中的所有其他神经元一样更新。所有权重范围 0.000 -> 1.000(无负数)
获取输入数据 (0 | OR | 1) 并将第 n 个值设置为输入层中的第 n 个神经元输出值。
前馈:在每一层的每个神经元“n”上(输入层除外):
- 获取从前一层到第 n 个神经元的连接神经元的 SUM(输出值 * 连接权重)的结果。
- 获取此 SUM 的 TanHyperbolic - 传递函数 - 作为结果
- 将结果设置为第 n 个神经元的输出值
获取结果:获取输出层中神经元的输出值
反向传播:
- 计算网络误差:在输出层,得到 SUM 神经元(目标值 - 输出值)^2。将此 SUM 除以输出层的大小。得到它的平方根作为结果。计算平均误差 = (OldAverageError * SmoothingFactor * Result) / (SmoothingFactor + 1.00)
- 计算输出层梯度:对于每个输出神经元 'n',第 n 个梯度 = (nth Target Value - nth Output Value) * nth Output Value TanHyperbolic Derivative
- 计算隐藏层梯度:对于每个神经元“n”,获取 SUM(来自第 n 个神经元的权重的 Tan 双曲导数 * 目标神经元的梯度)作为结果。将 (Results * this nth Output Value) 指定为梯度。
- 更新所有权重:从隐藏层开始,回到输入层,对于第 n 个神经元:计算 NewDeltaWeight = (NetLearningRate * nth Output Value * nth Gradient + Momentum * OldDeltaWeight)。然后将新权重分配为 (OldWeight + NewDeltaWeight)
- 重复过程。
这是我对数字七的尝试。输出是神经元 # 零和神经元 # 6。神经元 6 应该携带 1,神经元 # 零应该携带 0。在我的结果中,除 6 之外的所有神经元都携带相同的值(#零是样本)。
对不起,很长的帖子。如果您知道这一点,那么您可能知道它有多酷以及它在单个帖子中的大小。先感谢您