我正在尝试制作一个数字识别程序。我会输入一个数字的黑白图像,我的输出层会触发相应的数字(在输出层的0到9个神经元中,只有一个神经元会激活)。我已经完成了一个二维反向传播神经网络的实现。我的拓扑结构大小是[5][3] -> [3][3] -> 1[10]。所以它是一个二维输入层,一个二维隐藏层和一个一维输出层。然而,我得到了奇怪且错误的结果(平均误差和输出值)。
在这个阶段调试相当耗时。因此,我很想知道这是否是正确的设计,以便我继续调试。以下是我实现的流程步骤:
-
构建网络:除了输出层(没有偏置)之外,每层都有一个偏置。偏置的输出值总是等于1.0,但其连接权重像网络中的其他神经元一样在每次传递中更新。所有权重范围为0.000 -> 1.000(没有负数)
-
获取输入数据(0 | 或 | 1),并将第n个值设置为输入层中第n个神经元的输出值。
-
前馈:在每一层(除了输入层)中的每个神经元’n’上:
- 获取从前一层连接到这个第n个神经元的连接神经元的(输出值 * 连接权重)的总和结果。
- 获取这个总和的双曲正切 – 传输函数 – 作为结果
- 将结果设置为这个第n个神经元的输出值
-
获取结果:获取输出层中神经元的输出值
-
反向传播:
- 计算网络误差:在输出层上,获取神经元的(目标值 – 输出值)^2的总和。将这个总和除以输出层的大小。获取其平方根作为结果。计算平均误差 = (旧平均误差 * 平滑因子 * 结果)/ (平滑因子 + 1.00)
- 计算输出层梯度:对于每个输出神经元’n’,第n个梯度 = (第n个目标值 – 第n个输出值)* 第n个输出值的双曲正切导数
- 计算隐藏层梯度:对于每个神经元’n’,获取从这个第n个神经元出发的权重的双曲正切导数 * 目标神经元的梯度的总和作为结果。将(结果 * 这个第n个输出值)赋值为梯度。
- 更新所有权重:从隐藏层开始,回到输入层,对于第n个神经元:计算新权重变化 = (网络学习率 * 第n个输出值 * 第n个梯度 + 动量 * 旧权重变化)。然后将新权重赋值为(旧权重 + 新权重变化)
- 重复过程。
这是我对数字七的尝试。输出是神经元#零和神经元#六。神经元六应该携带1,而神经元#零应该携带0。在我的结果中,除了六号神经元之外的所有神经元都携带相同的值(#零是一个样本)。
抱歉这篇文章很长。如果你知道这个,你可能会知道它有多酷,以及在一个帖子中包含它有多大。提前感谢你
回答:
Softmax与对数损失通常用于多类输出层的激活函数。你有多个类/多项式:10个可能的数字构成了10个类别。
所以你可以尝试将你的输出层激活函数改为softmax
http://en.wikipedia.org/wiki/Softmax_function
人工神经网络
在神经网络模拟中,softmax函数通常在用于分类的网络的最后一层实现。这些网络然后在对数损失(或交叉熵)制度下进行训练,提供多项逻辑回归的非线性变体。
让我们知道这有什么效果。 –