numpy reshape在做多维矩阵flatten时,-1应该置在后面的参数上

今天在做吴恩达的深度学习专项课程的第一节课,第二周的课程作业时,遇到以下一个有意思的问题。
作业要求实现一个简单的Logistic Regression的模型,用于实现图片的二元分类问题。图片是RGB格式的,所以channel是3。train的原始输入数据进来的是一个(209,64,64,3)的四维矩阵,209代表的是训练样本数,每一个图片长和宽都是64 pixel。
那么在将该数据feed到LR模型中时,需要进行flatten的操作,也就是将每一张图片由原来的(64,64,3)维变成(64✖64✖3,1)的列向量,这时我编写的代码是下面这样的:

train_set_x_flatten = train_set_x_orig.reshape(-1,train_set_x_orig.shape[0])

上面的train_set_x_orig就是原始导入进来的数据,shape是(209,64,64,3)
正确的写法应该是:

train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0],-1).T

两种写法最后得出的ndarry其实都是(64✖64✖3,209),但我做到后面才发现这俩矩阵里面的值不一样。
也就是正确写法才是我们需要实现的需求,也就是每一列都是一个图片的数据,然后一共是209(样本数量)列。而我如果将-1写在第一个shape的位置,就彻底打乱了每一张图片的数据。虽然能保证第二维是209,但每一列并不是某一张图片的数据了。

numpy中有很多容易用错矩阵维度的地方,吴老板在课程中分享的两个tricks也是需要注意的:

  1. 如果需要创建一个列向量(column array),用reshape(dim,1)来写,不要省略1
  2. do not be shy 去用reshape() 和 assert断言 去保证自己的矩阵拥有你想要的维度。

这里分享一下自己这几天复习吴老板课程的感受:真的很通俗易懂!!很多复杂的知识一点就通,从最简单的运算开始带着你,重新学一遍又觉得学到不少东西。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容