吴恩达老师DeepLearning系列课程最详细学习笔记之21—python中的广播

 教程是本人学习吴恩达老师DeepLearing系列课程中整理的最为详细的学习笔记。学习视频主要来自B站[双语字幕]吴恩达深度学习deeplearning.ai_哔哩哔哩_bilibili?,以及DeepLearning官方网站Deep Learning by deeplearning.ai | Coursera。该系列课程总共有180多个,我会将学习笔记陆续分享出来,为有兴趣深度学习的同仁提供便利。再次由衷感谢吴恩达老师的精彩讲解和无私奉献!

特别说明:图片来源于吴恩达老师视频截图。

 

 

 

 

 

 

 

 

 

 附文本:


  在前面的视频中,我们提到过广播是一种手段,可以让你的python代码执行得更快。在这个视频中,我们深入研究一下python中的广播是如何实际运作。
  假设我们用一个例子来讲广播。在这个矩阵中,我们列出了来自100克碳水化合物、蛋白质和脂肪的卡路里数量。这四种不同食物的卡路里,比如说,100克苹果的热量有56卡来自碳水化合物,远远少于蛋白质和脂肪。而相反,100克的牛肉,有104卡来自蛋白质和135卡来自脂肪。现在,比如说你的目标是计算四种食物中,卡路里有多少百分比来自碳水化合物、蛋白质和脂肪。比如,你看到这一列,将整列数字加起来就得到100克苹果有56+1.2+1.8,总共是59卡。然后苹果中来自碳水化合物卡路里的百分比是56/59,大概是94.9%。所以苹果中大部分热量都来自碳水化合物。而相比之下,大多数牛肉的热量来自蛋白质和脂肪。你要做的计算其实是对矩阵这四列求和,得到100克以下食物的卡路里总量:苹果、牛肉、鸡蛋和土豆。最后让整个矩阵各列除以总量,得到卡路里占的百分比。四种食物中,来自碳水化合物、蛋白质和脂肪热量的百分比各占多少。所以,问题是,你可以不用显示for循环做吗?我们只要给你介绍的是如何设置,比如令这个矩阵等于3*4矩阵A,然后用一行python代码,我们会对各列求和。我们得到四个数字,对应四种不同食物的卡路里总量,这100克四种不同类型食物的热量总量。然后我们用第二行python代码,让四列每一列都除以对应的和。如果口头描述你们听得不太清楚,希望当你看到Python代码时,马上就懂了。下面是我们的Jupyter笔记本,我们写了第一段代码了。把我们刚才的数字填入矩阵A,然后Shift+Enter那矩阵A就准备好了(并且打印出来了)。然后这是两行Python代码,首先要计算cal=A.sum(axis=0)意味着竖直相加(我们稍后会讲),然后print(cal)。我们会在竖直方向求和。现在59是苹果中的总卡路里数,239是牛肉中国的总卡路里数,还有鸡蛋和马铃薯之类的。然后我们要计算百分比:percentage= 100*A/cal.reshape(1,4),然后print(percentage)。我们跑一下代码。所以这个命令()我们用了矩阵A,让它除以这个1×4矩阵,然后得到了百分比矩阵。我们(前面)手算出了苹果的情况,第一列有94.9%卡路里来自碳水化合物。我们回到幻灯片上来。这两行代码,就是(上面)在jupyter笔记本里写的。这里参数还要加一些细节。 axis=0意味着我们希望python在竖直方向求和,而水平轴则是轴1。我们可以写成是axis=1,这样就可以水平求和而不是竖直求和。A/cal.reshape(1,4)这是python广播的另一个例子。当你取矩阵A,这是一个3×4矩阵,你让它除以一个1×4矩阵。技术上,在这第一行代码之后,变量cal已经是一个1×4矩阵了。所以技术上,你不需要调用reshape(1,4),这实际上有点多余。但是当我们编写python代码时,如果不完全确定用什么矩阵,不确定矩阵的尺寸,我们经常会调用reshape命令确保它是正确的列向量或行向量,或者你想要的任何形式。reshape命令经常会用到,这是o(1)操作,成本很低.所以你不要害怕使用reshape命令来确保你的矩阵形状是你想要的。
  
  现在我们详细解释一下,这种运算是怎么执行的。我们有一个3×4矩阵,我们让它除以一个1×4矩阵,如何除以1×4矩阵呢?这个1×4向量。
  我们再来看几个广播的例子,如何你取一个4×1向量,让它和一个数字相加,那么python会做的是,将这个数字自动展开变为一个4×1向量,就像这样,所以最终等于右边这个向量,你就往每个元素加上100。事实上,我们使用这种形式的广播,其中常数是之前视频里的参数b。而这种广播对列向量和行向量一样有用。事实上,我们之前已经使用了类似的广播形式,就是我们往向量加上一个常数的时候,在logistic回归中就是参数b。
  这里是另一个例子,我们有一个2×3矩阵,然后让你加上一个1×n矩阵。那么一般情况下,如果这里你有个m×n矩阵,并将它加上1×n矩阵,python做法是复制1×n矩阵m次,把它变成m×n矩阵。所以,这不再是一个1×3矩阵,python会复制一次,把它变成这个2×3矩阵形式,然后我们让它们相加,最后得到右边的和。所以让第一列加上了100,第二列加上了200,第三列加上了300。这基本上是我们第一张幻灯中所做的,不过(第一章幻灯片)我们用了一个除法运算,而不是加法运算。
  所以最后一个例子,无论你有没有m×n矩阵,你都让它加上一个m×1向量或者m×1矩阵,然后水平复制n次,最后得到一个m×n矩阵。你可以想象一下水平复制三次,然后加起来。当你让它们相加的时候,就会得到(右边)这个矩阵。所以你往第一行加了100,第二行加了200。
  在python广播中有一些通用规则。如果你有一个m×n矩阵,然后你加上或者减去,乘以或者除以一个1×n矩阵,那么python会把它复制m次变成m×n矩阵,然后逐元素做加、减法、乘法和除法。如果相反,你拿一个m×n矩阵加上、减去、乘以或者除以m×1矩阵,那么这也会复制n次,把它变成一个m×n矩阵,然后逐元素应用操作。这是其中一种广播,就是如果你有个m×1矩阵,这其实是个列向量,然后你让它加上、减去、乘以或者除以一个实数,所以也许是1×1矩阵,所以这样加上100,最后你就是把这个实数赋值n次,直到你得到另一个m×1矩阵,然后执行运算,比如说这个例子中逐元素做加法。类似的东西也适用于行向量。所以广播的一般版本还可以做到更多。如果你有兴趣可以阅读Numpy的文档,并在文档里搜索broadcasting,这也许是更广义的广播。上面讲到的这些是在你实现神经网络算法时,主要用到的广播形式。在结束之前,最后讲一句,对于你们习惯用Matlab或Octave编程的同学,如果你曾经使用matlab或Ocatave函数bsxfun,在神经网络编程中,bsxfun做的事情很类似,但不完全相同,但它通常用于类似的目的,就像我们在python中使用广播一样,但这函数真的只是非常厉害的matlab和Octave用户才会用到,如果你还没听说过,则不用担心,因为你不需要知道那些,用Python编码神经网络就好了。
  
  这就是Python中的广播。我希望你们在做编程作业时,广播能够让你的代码运行速度更快,也希望能帮到你写更少的代码来实现你的目标。在你进行编程练习之前,我想和大家分享一套想法,就是我发现的一些技巧,可以减少Python代码中的错误数量,我希望也会帮助你。所以我们在下一个视频中谈谈这个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值