1.logistics regression model
y' = σ(WTx+b)
激活函数:sigmoid函数
损失函数:L(y',y) = -[y·log(y')+(1-y)·log(1-y')](二分类)
代价函数:损失均值,J(W,b) = 1/m·Σmi=1/m·ΣL(y'(i),y(i)),是W和b的函数
训练模型的步骤:
初始化W和b,指定learning rate和迭代次数
每次迭代,根据当前W和b计算对应的梯度(J对W,b的偏导数),然后更新W和b,w := w - α(dJ/dw)
迭代结束,学得W和b,带入模型进行预测,分别测试在训练集合测试集上的准确率,从而评价模型
2.向量化
只要阔能,就不要使用显示for循环(explicit for-loop),而是尽可能采用矢量化技术(Vectorization)
深度学习中的数据量往往巨大,用for循环去跑的话效率会非常低下,相比之下,矩阵运算就会快得多。而python的矩阵“传播机制(broadcasting)”和专门用于矩阵计算的numpy包更是给了我们使用矩阵运算的理由。
所谓的Vectorization,就是把我们需要用for-loop来对那些只有上标或者下标变化的变量,放进一个向量或者矩阵中,让他们所有变量同时计算!
因此,Logistic regression算法向量化的过程,就是:
1.把m个样本,同时算出它们的z(i),也就是直接算Z这个m维行向量
2.同时把Z的m维都激活,得到m维行向量A
3.得到A和Z之后,就可以直接计算J对Z的梯度dZ了,得到dZ之后,也就可以直接算出W和b的梯度了
4.同时更新所有的w(i)和b(i)
3.算法步骤
(一)数据预处理
1)搞清楚数据的形状、维度
(209, 64, 64, 3),第一维代表m,即样本数量,第二维第三维分别是图片的长和宽,第四维代表图片的RGB三个通道
2)将数据(例如图片)转化成向量(image to vector)方便处理
3)将数据标准化(standardize),这样更好训练
每个特征都转化成了同样的分布,不管原来的范围是什么,现在都基本限定在同样的范围内了。原数据的不同特征的范围可能会有很大差别,比如一批数据中“年龄”的范围就比较小,可能20岁 ~ 60岁之间,但是另一个特征“年收入”可能波动范围就很大,也许0.5万 ~ 1000万,这种情况下会导致我们的 等高线图变得十分“扁平”,在梯度下降的时候会很 容易走弯路,因此 梯度下降会比较慢,精度也不高。但是经过标准化(也称归一化)之后,等高线就变规矩了,就很容易梯度下降了。
另外,对于图片数据的话,进行标准化很简单,因为RGB三个通道的范围都是255,我们对图片的处理就是直接除以255即可。
(二)构造各种辅助函数
1)激活函数(此处我们使用sigmoid函数)--activation function
2)参数初始化函数(用来初始化W和b)--initialization
3)传播函数(这里是用来求损失cost并对W、b求导,即dW、db)--propagate
包含了forward-propagate和backward-propagate,即正向传播和反向传播。
正向传播求的是cost,反向传播是从cost的表达式倒推W和b的偏导数
4)优化函数(迭代更新W和b,来最小化cost)--optimize
5)预测函数(根据学习到的W和b来进行预测)--predict
(三)综合上面的辅助函数,结合成一个模型
可以直接输入训练集、预测集、超参数,然后给出模型参数和准确率