Basics of Neural Network Programming——Binary Classification
(一)Logistic regression as a Neural Network
一、Logistic regression为例
1. 输入一张图片,希望输出是1/0,1代表图片识别结果是一只猫,0代表不是一直猫
一张图片在计算机中的存储形式为矩阵,如果是一张64*64的图片,则存储为3个64*64的实数矩阵,分别代表红、绿、蓝三个通道的值。
将三个矩阵中的元素组成一个整体的向量,对于一个64*64的图片来说,最后形成的矩阵维度为64*64*3=12288
2.标注
(x,y)表示一个样本,x是N维实向量中的一个样本,y是标签,取值为1或0
m是训练集的样本总个数,m(test)表示测试集的样本总个数
X表示训练集中的总样本X,X.shape=nx*m
Y表示标签的集合,Y.shape=1*m
二、Logistic Regression
在这里作为一个二分类问题的算法
主要参数是给定的特征向量X,预测标签γ=P(y=1|x)
w是一个Nx维的向量,b是一个实数
最后的结果因为要是一个概率,因此取值在0到1之间,使用sigmoid函数进行值变换
三、Logistic Regression cost function
四、Gradient Descent
五、Derivation
六、More Derivative Examples
七、Computation graph
八、Derivatives with a Computation Graph
九、Logistic Regression Gradient Descent
BP网络链式求导,分别求出w,b改变时对L的影响
loss值是对于一个样本而言的,cost function是对于多个样本的数据集而言的
在这里,L对于z求偏导的结果为a-y
十、Gradient Descent on m Examples
在第九部分描述了如何计算单个样本的链式求导后,这部分介绍的是m个样本的求导案例
a(i)是训练样本的预测值
在这里要实现两个或多个for 循环,特征越多,所用的for循环越多,所以会造成很大不便,使用Vectorization。
(二)Python and Vectorizaton
一、Vectorization
numpy中的dot是指矩阵乘法,即np.dot(w,x),表示矩阵w与x相乘
用Jupyter notebook进行代码计算:
结果表明向量化比非向量化的运行时间降低了100多倍
另:numpy中的time是以秒为单位的
GPU和CPU→SIMD(single instruction multiple data)单指令数据流
二、More Vectorizaition Examples
要注意避免明显地使用for循环
除了之前的矩阵乘法外,还有求e的幂次方、对数运算、绝对值、最大值等
因此每次在想写for循环时,可以考虑是否可以调用numpy中的内置函数
对该逻辑回归算法进行向量化
三、Vectorizing Logistic Regression
四、Vectorizing Logistic Regression's Gradient Output
五、Broadcasting in Python
不幸:Jupyter再次死掉,,,
问题:这里为什么不能直接除呢?加reshape(1,4)的意义是什么?
用Linux试了一下,结果是阔以滴
A.sum(axis=0)表示按列相加,垂直求和
A.sum(axis=1)表示按行相加,水平求和
疑惑解答了!:当确定矩阵的维度时可以不用加reshape,若不确定则加,以确保它是正确的列向量或行向量
广播适用于行列向量
六、A note on python/numpy vectors
排除其他奇怪的bug的技巧:
七、Explanation of logistic regression cost function
来吧,先复习一下Logistic Regression
将线性函数分类,hx=g(wTx),将函数值置于0到1之间,既叫sigmoid函数,也叫logistic函数
即hx=1/1+e-wTx
函数图像为:
决策边界:确定参数集,整个y函数大于0,归为第一类,小于零,归为第二