今天写了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 两层神经网络反向传播实现相关推荐

  1. 两层全连接网络反向传播梯度推导(矩阵形式、sigmoid、最小均方差MSE)

    Solving for Derivatives 虽然正文用了英文(写正文和敲公式的中英文输入法互换太折磨了-_-),但是都是贼简单的表述,希望能读下去,更希望能对您有帮助! h=XW1+b1hsigm ...

  2. 学习笔记84—[深度学习]神经网络反向传播(BackPropagation)

    神经网络反向传播实例推导过程: 说到神经网络,大家看到这个图应该不陌生: 这是典型的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层,Layer L3是隐含层,我们现在手里有 ...

  3. python 神经网络工具_神经网络15分钟入门!使用python从零开始写一个两层神经网络...

    本篇是该系列的第三篇,建议在阅读本篇文章之前先看前两篇文章. 在本文中将使用python实现之前描述的两层神经网络,并完成所提出的"象限分类"的问题. 需要注意的是,虽然标题叫做神 ...

  4. batchnomal_反向传播之七:BatchNormal层的反向传播

    最好的学习方法就是把内容给其他人讲明白. 如果你看了我的文章感觉一头雾水,那是因为我还没学透. BatchNormal的有效性.重要性就无需多言,起码是残差神经网络(ResNet)至关重要的一层,没有 ...

  5. 神经网络反向传播的作用,双向传播的神经网络

    如何理解神经网络里面的反向传播算法 反向传播算法(Backpropagation)是目前用来训练人工神经网络(ArtificialNeuralNetwork,ANN)的最常用且最有效的算法. 其主要思 ...

  6. # cs231n (四)反向传播

    cs231n (四)反向传播 标签(空格分隔): 神经网络 文章目录 cs231n (四)反向传播 0.回顾 1.引言 2. 通过简单表达式理解梯度 3. 链式法则计算复合函数 4. 如何理解反向传播 ...

  7. 神经网络前向传播过程,神经网络反向传播

    正向传播反向传播是什么? 题主问的应该是神经网络中的问题.正向传播是指数据从X传入到神经网络,经过各个隐藏层得到最终损失的过程. 反向传播主要是针对神经网络优化的过程中进行,在L端计算总的损失函数,然 ...

  8. cnn卷积神经网络反向传播,cnn正向传播和反向传播

    如何对CNN网络的卷积层进行反向传播 在多分类中,CNN的输出层一般都是Softmax.RBF在我的接触中如果没有特殊情况的话应该是"径向基函数"(RadialBasisFunct ...

  9. 用numpy、PyTorch自动求导、torch.nn库实现两层神经网络

    用numpy.PyTorch自动求导.torch.nn库实现两层神经网络 1 用numpy实现两层神经网络 2 用PyTorch自动求导实现两层神经网络 2.1 手动求导 2.2 gradient自动 ...

最新文章

  1. C#-几个STL相关
  2. 51NOD 1001 数组中和等于K的数对
  3. ffmpeg为AVPacket添加解码头信息
  4. 秘密武器 | 看AnalyticDB如何强力支撑双十一
  5. Java8 Stream Collectors groupingBy使用
  6. 系统设计知识:系统设计的基本原理介绍
  7. “财务自由的15个阶段!说说你到哪个阶段了?”
  8. 在雅加达EE TCK中使用Arquillian的可能方法
  9. 蓝桥杯嵌入式第七届模拟题 代码
  10. 同步数据流语言代码生成工具的研究进展
  11. 【转】“正由另一进程使用,因此该进程无法访问该文件”的问题解决方法
  12. Qt QDataVisualization 三维图 坐标轴 显示比例
  13. learun敏捷框架工作流:企业效率助推神器
  14. L1-039 古风排版 (Java)
  15. android内存显示修改,涨姿势:修改这个系统选项Android手机再也不用清内存!速度飞起...
  16. 企业面临大危机,CRM崩溃告急,程序员竟用特殊手段化解危机!
  17. 大流量的网站如何解决访问量的问题
  18. linux指令lpr,linux命令 test/lpr
  19. 2017年第3届上海国际零售业设计与设备展会刊(参展商名录)
  20. 实训五:交换机配置文件备份

热门文章

  1. [wxWidgets]XRC和动态子菜单
  2. 模板数值工具包(Template Numerical Toolkit, NTT)
  3. 安装博图V15时出现缺少.net3.5sp1解决办法
  4. 夏敏捷第29本著作《Python课程设计》(微课视频版)
  5. 米思齐学习例程(八):声控灯
  6. PhotoEnhancer老照片修复,旧照修复,图像去噪,黑白照上色,AI图像修复,AI图像去噪,一键自动修复照片,附下载链接
  7. 福建职称计算机高级工程师评审,福建土建类评高级职称评审论文要求
  8. 5月刊推荐:ML语言之父——罗宾·米尔纳
  9. 基于STM32的A2B音频信号发生器开发
  10. 高数部分常用公式整理(扫描版——个人整理)