标签:dout 实现 self Affine 动手 shape dx np
传送门: https://www.cnblogs.com/greentomlee/p/12314064.html
github: Leezhen2014: https://github.com/Leezhen2014/python_deep_learning
我们已经可以实现一些简单的节点(比如, 加法,乘法等),以及 激活函数;
并且已经知道了 backward() 函数的实现的方法:只要计算偏导数即可,将偏导数公式的实现放到 对应节点的backward函数中即可;
在本章中会介绍一些复杂的层,比如affine, Softmax-with-Loss ; 本章比较考验数学功底、对梯度求导的理解、对计算图的理解;
话不多说,开始....
Affine 层其实是全连接层,Affine的名字来源于斯坦福的C231, 网上也很多实现: https://blog.csdn.net/achcxchca/article/details/80959735
Affine(仿射)的意思可以理解为前面一层中的每一个神经元都连接到当前层中的每一个神经元,加入仿射层输出的形状和数值都有所改变,这点类似于图像处理的仿射变换。在许多情况下,这是神经网络的「标准」层。仿射层通常被加在卷积神经网络或循环神经网络做出最终预测前的输出的顶层。
PS: Affine层的输出X是需要考虑到输入是以单个数据为对象的,还是以多个输入为对象的。
Forward的计算图:
Backward计算图:
1 class Affine: 2 def __init__(self, W, b): 3 self.W = W 4 self.b = b 5 6 self.x = None 7 self.original_x_shape = None 8 # 计算微分 9 self.dW = None 10 self.db = None 11 12 def forward(self, x): 13 # 为了支持支持张量的计算,将x先做形状修改 相当于transOp 14 self.original_x_shape = x.shape 15 x = x.reshape(x.shape[0], -1) 16 17 # out = w*x+b 18 self.x = x 19 out = np.dot(self.x, self.W) + self.b 20 21 return out 22 23 def backward(self, dout): 24 25 dx = np.dot(dout, self.W.T) 26 self.dW = np.dot(self.x.T, dout) 27 self.db = np.sum(dout, axis=0) 28 29 # 将dx形状trans回去(张量支持) 30 dx = dx.reshape(*self.original_x_shape) 31 return dx
标签:dout,实现,self,Affine,动手,shape,dx,np 来源: https://www.cnblogs.com/greentomlee/p/16686743.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。