本文结构:
- 将 Logistic 表达为 神经网络 的形式
- 构建模型
- 导入包
- 获得数据
- 并进行预处理: 格式转换,归一化
- 整合模型:
- A. 构建模型
- a. 初始化参数:w 和 b 为 0
- b. 前向传播:计算当前的损失
- c. 反向更新:计算当前的梯度
- B. 梯度更新求模型参数
- C. 进行预测
- A. 构建模型
- 绘制学习曲线
1. 将 Logistic 表达为 神经网络 的形式
本文的目的是要用神经网络的思想实现 Logistic Regression,输入一张图片就可以判断该图片是不是猫。
那么什么是神经网络呢?
可以看我之前写的这篇文章:
其中一个很重要的概念,神经元:
再来看 Logistic 模型的表达:
那么把 Logistic 表达为 神经网络 的形式为:
(关于 Logistic 可以看这两篇文章:
Logistic Regression 为什么用极大似然函数
Logistic regression 为什么用 sigmoid ?)
接下来就可以构建模型:
2. 构建模型
我们的目的是学习 w w 和 使 cost function J J 达到最小,
方法就是:
- 通过前向传播 (forward propagation) 计算当前的损失,
- 通过反向传播 (backward propagation) 计算当前的梯度,
- 再用梯度下降法对参数进行优化更新 (gradient descent)
关于反向传播可以看这两篇文章:
手写,纯享版反向传播算法公式推导
构建模型,训练模型,并进行预测,包含下面几步:
- 导入包
- 获得数据
- 并进行预处理: 格式转换,归一化
- 整合模型:
- A. 构建模型
- a. 初始化参数:w 和 b 为 0
- b. 前向传播:计算当前的损失
- c. 反向更新:计算当前的梯度
- B. 梯度更新求模型参数
- C. 进行预测
- A. 构建模型
- 绘制学习曲线
下面进入详细代码:
1. 导入包
引入需要的 packages,
其中,
h5py 是 python 中用于处理 H5 文件的接口,
PIL 和 scipy 在本文是用自己的图片来测试训练好的模型,
load_dataset 读取数据
import numpy as np
import matplotlib.pyplot as plt
import h5py
import scipy
from PIL import Image
from scipy import ndimage
from lr_utils import load_dataset
%matplotlib inline
其中 lr_utils.py 如下,是对 H5 文件进行解析 :
#lr_utils.py
import numpy as np
import h5py
def load_dataset():
train_dataset = h5py.File('datasets/train_catvnoncat.h5', "r")
train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features
train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels
test_dataset = h5py.File('datasets/test_catvnoncat.h5', "r")
test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features
test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels
classes = np.array(test_dataset["list_classes"][:]) # the list of classes
train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))
test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[