首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >反向传播二维神经元网络C++

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

Stack Overflow用户
提问于 2015-12-17 21:32:04
回答 1查看 201关注 0票数 1

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

我的计划是:做一个二维神经网络来识别数字图像.图像是5乘3网格,我准备了10张从0到9的图像。例如,这将是数字7:

数字7的索引为0,1,2,5,8,11,14作为1s (或3,4,6,7,9,10,12,13作为0不重要)等等。因此,我的输入层将是一个5乘3的神经元层,我将只向它提供零1(而不是介于两者之间,而索引取决于我要给该层提供的图像)。

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

我已经完成了所有的实现,我在计算方面有一个问题,我真的很希望得到任何帮助。我得到了一个非常高的错误率和极低(负)输出值对所有输出神经元和值(错误和输出)不改变,甚至在10,000次通过。

我想更进一步,并张贴我的反向传播方法,因为我相信问题在其中。然而,为了分解我的工作,我想首先听到一些评论,我想知道我的设计是否平易近人。

  • 我的计划有意义吗?
  • 所有的帖子都在谈论范围( { 0 |-1 ->+10.01 -> 0.5等),它是否适用于输出层上的0->1 .OR. | 1 },而不是范围?如果是的话,我该怎么控制呢?
  • 我使用TanHyperbolic作为我的传递函数。它与sigmoid,其他函数之间有什么区别吗?等?

如有任何意见/意见/指导,请提前表示感谢和感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 22:49:56

嗯,通过上面的描述,我认为设计和方法是正确的!关于激活函数的选择,请记住,这些函数有助于得到激活数最大的神经元,以及它们的代数性质,如一个简单的导数,有助于反向传播的定义。考虑到这一点,您不应该担心您对激活函数的选择。

上面提到的范围对应于输入的缩放过程,最好是输入图像在0到1之间。这有助于缩小误差面,并有助于优化过程的速度和收敛性。因为您的输入集是由图像组成的,而且每个图像都由像素组成,因此像素所能达到的最小值和最大值分别为0和255。要在本例中扩展输入,必须将每个值除以255。

现在,关于训练问题,你有没有试过检查你的梯度计算程序是否正确?即利用成本函数,对成本函数进行评价,J?如果没有,请尝试生成一个包含神经网络中所有权重矩阵的玩具向量theta,并通过使用梯度的定义在每一点上评估梯度,对Matlab示例表示遗憾,但是应该很容易移植到C++:

代码语言:javascript
运行
复制
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教程,在那里你可以找到很多与神经网络及其范式相关的信息,值得一看!

Page

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34344619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档