反向传播二维神经元网络C ++

时间:2015-12-17 21:32:04

标签: c++ image-processing machine-learning neural-network

我正在学习二维神经网络,所以我面临很多障碍,但我相信这是值得的,我真的很喜欢这个学习过程。

这是我的计划:使2-D NN能够识别数字图像。图像是5乘3网格,我准备了从0到9的10个图像。例如,这将是数字7:

Number Seven

7号指数0,1,2,5,8,11,14为1(或3,4,6,7,9,10,12,13为0并不重要)所以上。因此,我的输入图层将是一个5乘3的神经元层,我将只给它加零 OR 一个(不在它们之间,索引取决于我为图层提供的图像)。

然而,我的输出层将是10个神经元的一维层。取决于识别哪个数字,某个神经元将触发一个值,其余的应该为零(不应该触发)。

我完成了所有的工作,我在计算方面遇到了问题,我真的很感激任何帮助。我在所有输出神经元上获得了极高的错误率和极低(负)输出值,并且即使在第10,000次传递中,值(错误和输出)也不会改变。

我希望更进一步发布我的反向传播方法,因为我相信问题就在其中。然而,为了打破我的工作,我很想先听一些评论,我想知道我的设计是否平易近人。

  • 我的计划有意义吗?

  • 所有帖子都在谈论范围(0->1-1 ->+10.01 -> 0.5等),它是否适用于 { 0 | .OR。输出图层上的 | 1 } 而不是范围?如果是的话,我该如何控制呢?

  • 我使用 TanHyperbolic 作为我的转会功能。它和 sigmoid ,其他函数等有什么区别吗?

任何想法/意见/指导都会受到赞赏,并提前致谢

1 个答案:

答案 0 :(得分:0)

嗯,通过上面的描述,我认为设计和方法是正确的!关于激活函数的选择,请记住这些函数有助于获得具有最大激活数的神经元,它们的代数属性,例如易导数,有助于反向传播的定义。考虑到这一点,您不必担心您选择激活功能。

上面提到的范围对应于输入缩放的过程,最好让输入图像的范围为0到1.这有助于缩放误差表面并帮助提高速度和收敛速度。优化过程。由于输入集由图像组成,并且每个图像由像素组成,因此像素可以达到的最小值和最大值分别为0和255。要在此示例中缩放输入,必须将每个值除以255。

现在,关于训练问题,您是否尝试检查渐变计算程序是否正确? 即。使用成本函数,并评估成本函数J?如果没有,尝试生成一个玩具向量theta,其中包含神经网络中涉及的所有权重矩阵,并使用渐变的定义评估每个点的渐变,对不起Matlab示例,但它应该是易于移植到C ++:

perturb = zeros(size(theta));
e = 1e-4;
for p = 1:numel(theta)
    % Set perturbation vector
    perturb(p) = e;
    loss1 = J(theta - perturb);
    loss2 = J(theta + perturb);
    % Compute Numerical Gradient
    numgrad(p) = (loss2 - loss1) / (2*e);
    perturb(p) = 0;
end

评估函数后,将数值梯度与使用反向传播计算的梯度进行比较。如果每次计算之间的差异小于3e-9,那么您的实施应该是正确的。

我建议您查看斯坦福人工智能实验室提供的UFLDL教程,在那里您可以找到很多与神经网络及其范例相关的信息,值得一看!

http://ufldl.stanford.edu/wiki/index.php/Main_Page

http://ufldl.stanford.edu/tutorial/