反向传播神经网络设计

我正在尝试制作一个数字识别程序。我会输入一个数字的黑白图像,我的输出层会触发相应的数字(在输出层的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函数通常在用于分类的网络的最后一层实现。这些网络然后在对数损失(或交叉熵)制度下进行训练,提供多项逻辑回归的非线性变体。

让我们知道这有什么效果。 –

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注