第二周的课程作业是利用逻辑回归来训练一个分类器来辨别一张图片是否为猫,这周老师讲了单隐层的神经网络,所以先看看利用这个模型能否在上次作业的基础上对训练准确度作出改善
训练一个神经网络
- 神经网络分为几层,隐藏层中包含几个神经元,使用的激活函数
- 初始化参数 W(i)和 B(i) 搞清楚参数的维度
- 准备数据 X ,Y 同样的要搞清楚维度
- 向前传播,计算代价函数,反向传播,更新参数
下面我们就按这个流程来训练一个神经网络模型
1.单隐藏层
隐藏层有多少个处理单元可以先设置为参数,方便后面在训练模型时可以改动,测试处理单元数量不同对模型预测准确度造成的影响。这个神经网络模型只有三层(把输入层也算进去了),分别用n_x,n_h,n_y表示输入层,隐藏层,输出层的处理单元数量。
n_x也就是特征值(或者称为属性)的个数,因为这个 “是不是猫” 的问题是一个二分类问题,所以输出结果非0即1,输出层n_y其实为1,但为了统一化标识,还是用n_y来表示。
这个函数输入训练数据,获取每层处理单元数并返回
def layer_size(X,Y):
n_x=X.shape[0]
n_y=Y.shape[0]
return (n_x,n_y)
激活函数,在隐藏层选了tanh,在输出层选了sigmoid,一般二分类问题输出层都会选择sigmoid,隐藏层可以选择tanh,ReLU等,有时间可以试试在隐藏层选择不同激活函数会有什么结果,如果要测试的话,可以在向前传播那里隐藏层计算时把激活函数包装一下,方便后面更改。
2.初始化参数
这里有四个参数,w1(n_h,n_x),w2(n_y,n_h),b1(n_h,1),b2(n_y,1),其实他们的维度是有规律的,每一个w都是 本层处理单元数*上一层单元数,b都是本层单元数*1,也就是b是一个列向量
def initialize_parameters(n_x,n_h,n_y):
np.random.seed(1)
#参数要随机初始化,b可直接初始化为0,*0.01是使得参数尽量小
W1=np.random.randn(n_h,n_x)*0.01
b1 = np.zeros((n_h, 1)