本篇是该系列的第三篇,建议在阅读本篇⽂章之前先看前两篇⽂章。
Mr.括号:神经⽹络15分钟⼊门!⾜够通俗易懂了吧
Mr.括号:神经⽹络15分钟⼊门!——反向传播到底是怎么传播的?
在本⽂中将使⽤python实现之前描述的两层神经⽹络,并完成所提出的“象限分类”的问题。
需要注意的是,虽然标题叫做神经⽹络15分钟⼊门,但是到这篇⽂章,对于没接触过python的同学,15分钟怕是不太够。好在python本⾝不算太难,如果你有其他语⾔的基础,结合本⽂尽量详细的讲解,对于算法层⾯的理解应该还是可以做到的。如果还是不能理解,建议先⼊门python再来看本⽂,毕竟想做深度学习,对语⾔的掌握是基本要求。backgroundimage自适应
另外,这篇⽂章的正确⾷⽤⽅法是将代码搞到⾃⼰的电脑上,然后单步调试逐⾏看参数的变化,如有不明⽩的地⽅再对照⽂章中的讲解来理
第四句Y,cachey = affine_forward(H,W2,b2),完成了第⼆层⽹络的矩阵线性代数运算。
不过在实际应⽤中会存在⼀个问题,⽐如i的值等于1000时,e^1000在计算机中会变成⽆穷⼤的inf,后续计算将⽆法完成,所以程序中会在指数上减去常数C不影响最终结果(证明略),⽽这个常数C通常取i中的最⼤值。
③计算loss值
php什么时候出现的# ③计算loss值
python入门教程 非常详细 pdf对数的负数。
复习⼀下:交叉熵损失的求法是求对数的负数
第⼀句N = Y.shape[0]取了最终输出的维度,这个例⼦中为4,即四个象限。
第⼆句打印各个数据的正确解标签对应的神经⽹络的输出。
其中probs[np.arange(N), t]讲解⼀下:
N为4时,np.arange(N)会⽣成⼀个Numpy数组[0,1,2,3]。t中标签是以[0,1,2,3]的形式储存的,所以pro
bs[np.arange(N), t]能抽出各个数据的正确解标签对应的神经⽹络输出,在这个例⼦中,probs[np.arange(N), t]会成成numpy数组[probs[0,0], probs[1,1],
probs[2,2], probs[3,3]]。
generic硬盘第三句loss = -np.sum(np.log(probs[np.arange(N), t])) / N中先求了N维数据中的交叉熵损失,然后对这N个交叉熵损失求平均值,作为最终loss值。
④反向传播
# ④反向传播
移动空气压缩机什么容器类别反向传播计算是从Softmax层的输出开始的。你是不是想问为什么不是从loss值开始算?
回看上⼀篇⽂章的2.5节,你会发现Softmax-with-Loss层的反向传播结果计算,本⾝就是与loss⽆关的。⽽只与Softmax层输出结果和教师标签有关。换句话说,即使是从loss开始计算反向传播,经过⼀系列化简之后,这个loss值也会被化简掉,化简后的结果只包括Softmax 层的输出和教师标签。
第⼀句代码很简单,就是将Softmax的输出值赋给dx, 这⾥dx代表反向传播的主线值。dx[np.arange(N), t]-=1这句代码
阿司匹林肠溶片多少钱一盒第⼆句代码是实现上⼀篇⽂章中y-t的操作(y就是Softmax层的输出)。dx[np.arange(N), t]-=1这句代码中,dx是⼀个4*4的数组,⽽t 是⼀个内容为[0,1,2,3]的数组(见其初始化),N的值为4。np.arrange(N)会⽣成⼀个从0到3的数组[0,1,2,3],因为t中的标签是以[0,1,2,3]的形式存储的,所以dx[np.arange(N), t]能抽出各个数据的正确解标签对应的神经⽹络的输出。在这个例⼦中dx[np.arange(N), t]会成成NumPy数组[dx[0,0],dx[1,1],dx[2,2],dx[3,3]。
第四、六句试⼀次仿射变幻的反向传播,上边说过了,不在具体解释了。
第五句是ReLU激活层的反向传播,⾄于为什么这样写,也去看上⼀篇⽂章吧~
⑤参数更新
# ⑤参数更新
前两⾏是引⼊正则化惩罚项更新dW,后四⾏是引⼊学习率更新W和b。这部分理解起来⽐较简单,如果有疑问可以参考上篇⽂章的第3节。
6.验证
test
给出了⼀组数据test,对已经训练好的⽹络进⾏验证。
其实验证的⽅法和训练时的正向传播的过程基本⼀致,即第⼀层⽹络线性计算→激活→第⼆层⽹络线性计算→Softmax→得到分类结果。这部分代码在之前也⼤多讲过,不再详述。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论