- 不要抄作业!
- 我只是把思路整理了,供个人学习。
- 不要抄作业!
数据集
数据集是一个类似花的数据集。
而如果用传统的logistic regression,做出来的就是一个二分类问题,简单粗暴的划出了一条线,
可以看见,准确率只有47%。
所以就需要构建神经网络模型了。
神经网络模型
Reminder: The general methodology to build a Neural Network is to:
1 | 1. Define the neural network structure ( # of input units, # of hidden units, etc). |
已经给出思路了:
- 定义神经网络的结构
- 初始化模型参数
- 循环:
- 计算正向传播
- 计算损失函数
- 计算反向传播来得到grad
- 更新参数
1. 定义神经网络结构
1 | # GRADED FUNCTION: layer_sizes |
2. 初始化参数
来初始化w和b的参数
w: np.random.rand(a,b) * 0.01
b: np.zeros((a,b))
1 | # GRADED FUNCTION: initialize_parameters |
3. loop
在这里可以使用sigmoid()来做输出层的函数,np.tanh()来做hidden layer的激活函数。
3.1 forward propagation
在这个函数中,输入的是X,和parameters,然后就可以根据
$$z^{[1] (i)} = W^{[1]} x^{(i)} + b^{[1]}\tag{1}$$
$$a^{[1] (i)} = \tanh(z^{[1] (i)})\tag{2}$$
$$z^{[2] (i)} = W^{[2]} a^{[1] (i)} + b^{[2]}\tag{3}$$
$$\hat{y}^{(i)} = a^{[2] (i)} = \sigma(z^{ [2] (i)})\tag{4}$$
得到每一层的Z和A了。
1 | # GRADED FUNCTION: forward_propagation |
3.2 cost
接下来,在得到A2的值后,就可以根据公式来计算损失函数了。
$$J = - \frac{1}{m} \sum\limits_{i = 0}^{m} \large{(} \small y^{(i)}\log\left(a^{[2] (i)}\right) + (1-y^{(i)})\log\left(1- a^{[2] (i)}\right) \large{)} \small$$
在这里需要注意的是交叉熵的计算,交叉熵使用np.multiply()来计算,然后用np.sum(),求和。
而单单计算logprobs = np.multiply(np.log(A2),Y)
是不够的,因为这个只得到了公式的前一半的部分,Y=0的部分在元素相乘中就相当于没有了,所以还要再后面加一项np.multiply(np.log(1-A2),1-Y)
1 | # GRADED FUNCTION: compute_cost |
3.3 backworad propagation
NG说神经网络中最难理解的是这个,但是现在公式已经帮我们推倒好了。
其中, $g^{[1]’}(Z^{[1]})$ using
(1 - np.power(A1, 2))
可以看到,公式中需要的变量有X,Y,A,W,然后输出一个字典结构的grads
1 | def backward_propagation(parameters, cache, X, Y): |
3.4 update parameters
最后根据得到的grads,乘上学习速率,就可以更新参数了。
1 | # GRADED FUNCTION: update_parameters |
然后把更新完的参数再传入前面的循环中,不断循环,直到达到循环的次数。
nn_model
把前面的函数都调用过来。
模型中传入的参数是,X,Y,和迭代次数
- 首先需要得到你要设计的神经网络结构,调用
layer_sizes()
得到了n_x,n_y,也就是输入层和输出层。 - 初始化参数
initialize_parameters(n_x, n_h, n_y)
,得到初始化的 W1, b1, W2, b2 - 然后开始循环
- 使用
forward_propagation(X, parameters)
,先得到各个神经元的计算值。 - 然后
compute_cost(A2, Y, parameters)
,得到cost backward_propagation(parameters, cache, X, Y)
计算出每一步的梯度update_parameters(parameters, grads)
更新一下参数
- 使用
- 返回训练完的parameters
1 | # GRADED FUNCTION: nn_model |
预测
得到训练后的parameters,再用forward_propagation(X, parameters)
计算出输出层最终的值A2,以0.5为分界,分为0和1。
1 | # GRADED FUNCTION: predict |
1 | # Build a model with a n_h-dimensional hidden layer |
可以看到,训练后神经网络得到的分界线更为合理。
1 | # Print accuracy |
准确率高达90%
优化参数
这个时候就可以设置不同的hidden_layer的维度大小[1, 2, 3, 4, 5, 20, 50]
1 | # This may take about 2 minutes to run |
1 | Accuracy for 1 hidden units: 67.5 % |
得到的结果在n_h = 5时有最大值。