CS231n 两层神经网络反向传播实现
今天写了cs231n 作业1的两层神经网络的部分,听视频和看讲义的时候觉得挺简单的没在意,后来真正写的时候发现了问题,而且也领悟到了新的东西,反向传播代码实现的奥妙之处。
同时也把之前的loss函数梯度计算给复习加深理解。
因为怕以后忘了,特来记录一下。
1 简单的线性的前向传播算法forward
这里比较简单,但比较烦的是x不是(N,d1,d2,d3,d4,dn)维的,需要转换乘二维的进行处理。
x_temp = np.reshape(x, (x.shape[0], -1))
然后直接线性计算就行了,注意一下各个变量的维度
对于每个样本,有 x1*wc1+[b1,bc]=out1
out = x_temp.dot(w)+b #这里运用了numpy加法的特殊处理 不等于矩阵加法
2 反向求导 backward ------这里是重点
最开始我以为这里是矩阵的求导,然后把矩阵拆开算了一下,发现与神经网络传播梯度是不一样的含义。因为矩阵求导中,比如AX+B=Y,DY/DX=A的含义其实是y中的元素对x中的元素分别求偏导的结果,比如x,y是2*1的向量,求导结果A则是全部的偏导结果2*2=4.
2.1 求dx
而神经网络中并不是这么一个含义,而且直接用N个样本的X矩阵可能比较难理解,我们先对X[N,D]进行一个样本一个样本的计算。X[1,D]*W+b = out[1,C]
---这里[a,b] 指矩阵规模不是索引。
求dx,dw,db,最开始刚看这个误解了dx的意思,以为是求矩阵导数那样求out对x的偏导,后来发现维数根本就对不上,联想到这个反向传播梯度的思想,很快明白了,dx的意思是,然后就很快明白这个dout的含义了。我们要 求出全部的dx,对给个dx的求法如下:
这不就是向量【dout1,dout2,dout3】与W矩阵中一列向量,两个向量的点积么,再扩展到x2,x3,x4,再再扩展到全部的N个样本,其实就是矩阵乘法。
这样就轻松的得到了全部的dx
2.2 求dw
因为w不是节点,是线,用刚才的网络图不好看出来,但可以通过每个矩阵的维度猜到最终答案,毕竟X和W是相乘的关系,dw【D,C】=X.T【D,N】* dout【N,C】
2.3 求db
db与上面两个有些不用,但也不叫简单,(我开始甚至以为简单到直接得1就行)。
首先我们还是看每一个样本,通过XW想乘之后,得到3个节点,b1就对应out1,b2就对应out2,b3就对应out3,所以这里就是一元的链式法则就行,db[i]=dout[i,:]。最后因为有n个样本,累加起来就可以。注意dout[i,:] 每一行是不同的,不是乘个N倍就行。
2.4 最后
感觉我一会矩阵,一会向量的, 下标啥的说的有点乱,大家尽量领会。。。。。
3 激活函数 relu_forward & backward
这里比较简单,但你总不能每个元素遍历去跑吧,有点小技巧,放个链接
numpy矩阵中令小于0的元素改为0_pythonplusvabel的博客-CSDN博客_numpy 将大于某个值设置为0
forward : out = (x+abs(x) )/2
backward: dx = dout*(x>0)
4 损失函数 svm & softmax || forward & backward
之前的作业,直接放代码吧,重要点在于要用矩阵的形式解决,不然运行太慢了
1 SVM
SVM num_train = x.shape[0]scores = x# 1 forward----------------------------------------------------------margin = np.maximum(0, scores.T - scores[range(num_train), y] + 1).Tmargin[range(num_train), y] = 0data_loss = np.sum(margin) * 1.0 / num_trainreg_loss = 0loss = data_loss + reg_loss# 2 backward--------------------------------------------------------X_effect = (margin > 0).astype('float') # 每个样本i在非y[i]的类上产生X[i]的梯度 ,si的梯度为1X_effect[range(num_train), y] -= np.sum(X_effect, axis=1) # 每个样本i在y[i]的类上产生sigma(margin gt 0)*X[i](除y[i]的margin)的梯度dx = X_effect/num_train
2 softmax
softmaxnum_train = x.shape[0]# 1 forward--------------------------------------------------------------scores = xright_score = scores[range(num_train),y]p = np.exp(right_score) / np.sum( np.exp(scores),axis=1 )loss = np.sum( -np.log(p) )loss /= num_train# 2 backword-------------------------------------------------dx = ( np.exp(scores).T / np.sum( np.exp(scores),axis=1) ).T #这里不转置不能减、除dx[range(num_train),y] -= 1dx /= num_train
有时间再补充具体的吧
就这三大块内容,线性计算、激活函数、损失函数,然后全部融合到一起就是整个神经网络啦,汇总到一个模板中调用呗。
CS231n 两层神经网络反向传播实现相关推荐
- 两层全连接网络反向传播梯度推导(矩阵形式、sigmoid、最小均方差MSE)
Solving for Derivatives 虽然正文用了英文(写正文和敲公式的中英文输入法互换太折磨了-_-),但是都是贼简单的表述,希望能读下去,更希望能对您有帮助! h=XW1+b1hsigm ...
- 学习笔记84—[深度学习]神经网络反向传播(BackPropagation)
神经网络反向传播实例推导过程: 说到神经网络,大家看到这个图应该不陌生: 这是典型的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层,Layer L3是隐含层,我们现在手里有 ...
- python 神经网络工具_神经网络15分钟入门!使用python从零开始写一个两层神经网络...
本篇是该系列的第三篇,建议在阅读本篇文章之前先看前两篇文章. 在本文中将使用python实现之前描述的两层神经网络,并完成所提出的"象限分类"的问题. 需要注意的是,虽然标题叫做神 ...
- batchnomal_反向传播之七:BatchNormal层的反向传播
最好的学习方法就是把内容给其他人讲明白. 如果你看了我的文章感觉一头雾水,那是因为我还没学透. BatchNormal的有效性.重要性就无需多言,起码是残差神经网络(ResNet)至关重要的一层,没有 ...
- 神经网络反向传播的作用,双向传播的神经网络
如何理解神经网络里面的反向传播算法 反向传播算法(Backpropagation)是目前用来训练人工神经网络(ArtificialNeuralNetwork,ANN)的最常用且最有效的算法. 其主要思 ...
- # cs231n (四)反向传播
cs231n (四)反向传播 标签(空格分隔): 神经网络 文章目录 cs231n (四)反向传播 0.回顾 1.引言 2. 通过简单表达式理解梯度 3. 链式法则计算复合函数 4. 如何理解反向传播 ...
- 神经网络前向传播过程,神经网络反向传播
正向传播反向传播是什么? 题主问的应该是神经网络中的问题.正向传播是指数据从X传入到神经网络,经过各个隐藏层得到最终损失的过程. 反向传播主要是针对神经网络优化的过程中进行,在L端计算总的损失函数,然 ...
- cnn卷积神经网络反向传播,cnn正向传播和反向传播
如何对CNN网络的卷积层进行反向传播 在多分类中,CNN的输出层一般都是Softmax.RBF在我的接触中如果没有特殊情况的话应该是"径向基函数"(RadialBasisFunct ...
- 用numpy、PyTorch自动求导、torch.nn库实现两层神经网络
用numpy.PyTorch自动求导.torch.nn库实现两层神经网络 1 用numpy实现两层神经网络 2 用PyTorch自动求导实现两层神经网络 2.1 手动求导 2.2 gradient自动 ...
最新文章
- C#-几个STL相关
- 51NOD 1001 数组中和等于K的数对
- ffmpeg为AVPacket添加解码头信息
- 秘密武器 | 看AnalyticDB如何强力支撑双十一
- Java8 Stream Collectors groupingBy使用
- 系统设计知识:系统设计的基本原理介绍
- “财务自由的15个阶段!说说你到哪个阶段了?”
- 在雅加达EE TCK中使用Arquillian的可能方法
- 蓝桥杯嵌入式第七届模拟题 代码
- 同步数据流语言代码生成工具的研究进展
- 【转】“正由另一进程使用,因此该进程无法访问该文件”的问题解决方法
- Qt QDataVisualization 三维图 坐标轴 显示比例
- learun敏捷框架工作流:企业效率助推神器
- L1-039 古风排版 (Java)
- android内存显示修改,涨姿势:修改这个系统选项Android手机再也不用清内存!速度飞起...
- 企业面临大危机,CRM崩溃告急,程序员竟用特殊手段化解危机!
- 大流量的网站如何解决访问量的问题
- linux指令lpr,linux命令 test/lpr
- 2017年第3届上海国际零售业设计与设备展会刊(参展商名录)
- 实训五:交换机配置文件备份
热门文章
- [wxWidgets]XRC和动态子菜单
- 模板数值工具包(Template Numerical Toolkit, NTT)
- 安装博图V15时出现缺少.net3.5sp1解决办法
- 夏敏捷第29本著作《Python课程设计》(微课视频版)
- 米思齐学习例程(八):声控灯
- PhotoEnhancer老照片修复,旧照修复,图像去噪,黑白照上色,AI图像修复,AI图像去噪,一键自动修复照片,附下载链接
- 福建职称计算机高级工程师评审,福建土建类评高级职称评审论文要求
- 5月刊推荐:ML语言之父——罗宾·米尔纳
- 基于STM32的A2B音频信号发生器开发
- 高数部分常用公式整理(扫描版——个人整理)