刚通过吴恩达老师的“深度学习”视频学完了Logistic Regression —— 逻辑回归,现在小试牛刀,看看如何实现“猫”图片的识别。

逻辑回归主要使用梯度下降法求出参数下降量来逐步减小成本函数,最终求得需要的模型。逻辑回归思路比较简单,实现的难度较小。主要流程如下:

  1. 初始化参数Wb
  2. 根据Wb、输入X求得输出A
  3. 根据输入X和输出A求得梯度下降量dWdb
  4. 使用dWdb来更新Wb
  5. 循环2-5直至满足学习终止条件,如迭代300次。

实现该算法使用的语言是python,因为python使用简单,而且它的库numpy可以极大的减少运行时间,加快迭代过程。

算法实现

假定训练集输入为X,训练集结果为Y
在实现流程之前首先得加载使用到的python

1
import numpy as np

初始化参数Wb

这部分的时候简单,只需根据输入的规模将Wb初始化全0即可

1
2
3
4
5
6
def initial(dim):
W = np.zeros((dim, 1))
b = 0
parameters = {"W": W,
"b": b}
return parameters

根据Wb、输入X求得输出A

根据下面公式求出A

正向公式
正向公式

首先实现激活函数sigmoid

1
2
3
def sigmoid(Z):
A = 1 / (1 + np.exp(Z))
return A

再来实现前向计算

1
2
3
4
5
6
7
def forward(parameters, X):
W = parameters['W']
b = parameters['b']

Z = np.dot(W.T, X) + b
A = sigmoid(Z)
return A

根据XYAdWdb

根据公式求dWdb

反向公式
反向公式
1
2
3
4
5
6
def back_progate(X, Y, A):
dW = X(A - Y)
db = np.sum(A - Y, axis = 1, keepdims = True) / m
grads = {"dW": dW,
"db": db}
return grads

使用dWdb来更新Wb

根据公式更新参数Wb

更新参数
更新参数
1
2
3
4
5
6
7
8
9
10
11
def update_parameters(parameters, grads, learning_rate=0.5):
W = parameters['W']
b = parameters['b']
dW = grads['dW']
db = grads['db']

W = W - learning_rate * dW
b = b - learning_rate * db
parameters = {"W": W,
"b": b}
return parameters

Logistic Regression模型的建立

将以上的函数进行组合完成Logistic Regression模型的建立

1
2
3
4
5
6
7
8
9
def lr_model(X, Y, iteration_times):
n_x = X.shape[0]
parameters = initial(n_x)
for i in range(0, iteration_times):
A = forward(parameters, X)
grads = back_progate(X, Y, A)
parameters = update_parameters(parameters, grads)

return parameters

最终,通过大量的学习过程,我们求出了所需的参数Wb,之后用于测试的时候只需要代入即可,Logistic Regression模型至此全部实现。

结果

经过209张图片的训练,最终Logistic Regression模型对图片的识别成功率大约为70%,对于一个这么简单的模型来说,已经足够了。如果想要继续提升准确率,可以加大训练的图片规模。