通过简单神经网络识别猫图片

代码位置:https://github.com/lilihongjava/deep_learning/tree/master/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E8%AF%86%E5%88%AB%E7%8C%AB

数据预处理:

数据为H5文件,保存训练集有209张64x64的图像,训练集的图像对应的分类值(【0 | 1】,0表示不是猫,1表示是猫)

测试集里面的图像数据(本训练集有50张64x64的图像),测试集的图像对应的分类值(【0 | 1】,0表示不是猫,1表示是猫)

训练集_图片的维数 : (209, 64, 64, 3),每个像素点由(R,G,B)三原色构成的,所以要乘以3

训练集_标签的维数 : (1, 209)

测试集_图片的维数: (50, 64, 64, 3)

测试集_标签的维数: (1, 50)

预处理将训练和测试数据压缩为一个平坦的图像方便处理

训练集降维最后的维度: (12288, 209)
训练集_标签的维数 : (1, 209)
测试集降维之后的维度: (12288, 50)
测试集_标签的维数 : (1, 50)

逻辑回归公式介绍

识别猫项目本质上为逻辑回归,只不过通过神经网络来实现,公式为

通过简单神经网络识别猫图片_第1张图片

python代码激活函数为,此项目中,训练集X维度为(12288, 209)209个样本,w为(12288,1),w^{T}为(1,12288),b维度为(1, 209),但在python中可以为一个实数,python会自动转换为(1, 209)--python广播。计算完A的维度为(1,209)

A = sigmoid(np.dot(w.T, X) + b)

所有训练样例求和来计算成本,为什么L损失函数是\mathcal{L}(a^{(i)}, y^{(i)}) = - y^{(i)} \log(a^{(i)}) - (1-y^{(i)} ) \log(1-a^{(i)})\tag{3},而不是\mathcal{L}(a^{(i)}, y^{(i)}) = \frac{1}{2}(a^{(i)}-y^{(i)})^{2},因为后面这个函数是非凸函数,可能找不到全局最优值

python代码为:

J = (- 1 / m) * np.sum(Y * np.log(A) + (1 - Y) * (np.log(1 - A))) 

逻辑回归的反向传播,关于w和b的偏导数,全局成本函数J是1到m损失函数求和的平均,所以J对w和b的求导也同样是各项损失函数对w和b导数的平均,单个样本dz求导是(a-y),dw求导是x(a-y),db求导是(a-y),所以m个样本的公式为:

dw=\frac1m\sum_{i=1}^mx^{(i)}(a^{(i)}-y^{(i)})

python代码为:

dw = (1 / m) * np.dot(X, (A - Y).T)
db = (1 / m) * np.sum(A - Y)

梯度下降

通过最小化成本函数 J来学习 w和b 。对于参数 θ ,更新规则是\theta = \theta - \alpha \text{ } d\theta,其中 α 是学习率

 

构建网络步骤

建立神经网络的主要步骤是:
1. 定义模型结构(例如输入特征的数量)
2. 初始化模型的参数
3. 循环:

3.1 计算当前损失(正向传播)

3.2 计算当前梯度(反向传播)

3.3 更新参数(梯度下降)

 

 

你可能感兴趣的:(AI)