反向传播神经元网络方法 - 设计
BackPropagation Neuron Network Approach - Design
我正在尝试制作一个数字识别程序。我将输入一个数字的 white/black 图像,我的输出层将触发相应的数字(输出层的 0 -> 9 个神经元中的一个神经元将触发)。我完成了二维反向传播神经元网络的实现。我的拓扑大小是 [5][3] -> [3][3] -> 1[10]。所以它是一个二维输入层、一个二维隐藏层和一个一维输出层。但是我得到了奇怪和错误的结果(平均误差和输出值)。
这个阶段调试有点费时间。因此,我很想知道这是否是正确的设计,所以我会继续调试。以下是我实现的流程步骤:
构建网络:除输出层外,每一层都有一个偏置(无偏置)。偏差的输出值始终为 1.0,但是它的连接权重会像网络中的所有其他神经元一样在每次传递时得到更新。所有权重范围 0.000 -> 1.000(无负值)
获取输入数据(0 | OR | 1)并将第n个值设置为输入层中的第n个神经元输出值。
前馈:在每一层(输入层除外)的每个神经元'n'上:
- 获取已连接神经元的 SUM(输出值 * 连接权重)的结果
从上一层到第 n 个神经元。
- 获取此 SUM 的 TanHyperbolic - 传递函数作为结果
- 将结果设置为第n个神经元的输出值
获取结果:取输出层神经元的输出值
反向传播:
- 计算网络误差:在输出层上,获取 SUM Neurons'(目标值 - 输出值)^2。将此 SUM 除以输出层的大小。获取其 SquareRoot 作为结果。计算平均误差 = (OldAverageError * SmoothingFactor * 结果) / (SmoothingFactor + 1.00)
- 计算输出层梯度:对于每个输出神经元'n',第n个梯度=(第n个目标值-第n个输出值)*第n个输出值TanHyperbolic Derivative
- 计算隐藏层梯度:对于每个神经元 'n',得到 SUM(从第 n 个神经元开始的权重的 TanHyperbolic 导数 * 目标神经元的梯度)作为结果。将(结果 * 第 n 个输出值)指定为梯度。
- 更新所有权重:从隐藏层开始回到输入层,对于第n个神经元:计算NewDeltaWeight = (NetLearningRate * nth Output Value * nth Gradient + Momentum * OldDeltaWeight)。然后将新权重分配为 (OldWeight + NewDeltaWeight)
- 重复过程。
这是我对数字七的尝试。输出是神经元 # 0 和神经元 # 6。神经元 6 应该携带 1,神经元 # 0 应该携带 0。在我的结果中,除了 6 之外的所有神经元都携带相同的值(# 0 是一个样本)。
抱歉这么久了 post。如果你知道这一点,那么你可能知道它有多酷,它有多大,可以放在一个 post 中。提前谢谢你
具有对数损失的 Softmax 通常用于多类输出层激活函数。你有 multiclass/multinomial: 10 个可能的数字组成 10 类。
所以您可以尝试将输出层激活函数更改为 softmax
http://en.wikipedia.org/wiki/Softmax_function
Artificial neural networks
In neural network simulations, the
softmax function is often implemented at the final layer of a network
used for classification. Such networks are then trained under a log
loss (or cross-entropy) regime, giving a non-linear variant of
multinomial logistic regression.
让我们知道这有什么影响。 –
我正在尝试制作一个数字识别程序。我将输入一个数字的 white/black 图像,我的输出层将触发相应的数字(输出层的 0 -> 9 个神经元中的一个神经元将触发)。我完成了二维反向传播神经元网络的实现。我的拓扑大小是 [5][3] -> [3][3] -> 1[10]。所以它是一个二维输入层、一个二维隐藏层和一个一维输出层。但是我得到了奇怪和错误的结果(平均误差和输出值)。
这个阶段调试有点费时间。因此,我很想知道这是否是正确的设计,所以我会继续调试。以下是我实现的流程步骤:
构建网络:除输出层外,每一层都有一个偏置(无偏置)。偏差的输出值始终为 1.0,但是它的连接权重会像网络中的所有其他神经元一样在每次传递时得到更新。所有权重范围 0.000 -> 1.000(无负值)
获取输入数据(0 | OR | 1)并将第n个值设置为输入层中的第n个神经元输出值。
前馈:在每一层(输入层除外)的每个神经元'n'上:
- 获取已连接神经元的 SUM(输出值 * 连接权重)的结果 从上一层到第 n 个神经元。
- 获取此 SUM 的 TanHyperbolic - 传递函数作为结果
- 将结果设置为第n个神经元的输出值
获取结果:取输出层神经元的输出值
反向传播:
- 计算网络误差:在输出层上,获取 SUM Neurons'(目标值 - 输出值)^2。将此 SUM 除以输出层的大小。获取其 SquareRoot 作为结果。计算平均误差 = (OldAverageError * SmoothingFactor * 结果) / (SmoothingFactor + 1.00)
- 计算输出层梯度:对于每个输出神经元'n',第n个梯度=(第n个目标值-第n个输出值)*第n个输出值TanHyperbolic Derivative
- 计算隐藏层梯度:对于每个神经元 'n',得到 SUM(从第 n 个神经元开始的权重的 TanHyperbolic 导数 * 目标神经元的梯度)作为结果。将(结果 * 第 n 个输出值)指定为梯度。
- 更新所有权重:从隐藏层开始回到输入层,对于第n个神经元:计算NewDeltaWeight = (NetLearningRate * nth Output Value * nth Gradient + Momentum * OldDeltaWeight)。然后将新权重分配为 (OldWeight + NewDeltaWeight)
- 重复过程。
这是我对数字七的尝试。输出是神经元 # 0 和神经元 # 6。神经元 6 应该携带 1,神经元 # 0 应该携带 0。在我的结果中,除了 6 之外的所有神经元都携带相同的值(# 0 是一个样本)。
抱歉这么久了 post。如果你知道这一点,那么你可能知道它有多酷,它有多大,可以放在一个 post 中。提前谢谢你
具有对数损失的 Softmax 通常用于多类输出层激活函数。你有 multiclass/multinomial: 10 个可能的数字组成 10 类。
所以您可以尝试将输出层激活函数更改为 softmax
http://en.wikipedia.org/wiki/Softmax_function
Artificial neural networks
In neural network simulations, the softmax function is often implemented at the final layer of a network used for classification. Such networks are then trained under a log loss (or cross-entropy) regime, giving a non-linear variant of multinomial logistic regression.
让我们知道这有什么影响。 –