今天在做吴恩达的深度学习专项课程的第一节课,第二周的课程作业时,遇到以下一个有意思的问题。
作业要求实现一个简单的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也是需要注意的:
- 如果需要创建一个列向量(column array),用reshape(dim,1)来写,不要省略1
- do not be shy 去用reshape() 和 assert断言 去保证自己的矩阵拥有你想要的维度。
这里分享一下自己这几天复习吴老板课程的感受:真的很通俗易懂!!很多复杂的知识一点就通,从最简单的运算开始带着你,重新学一遍又觉得学到不少东西。