本文是Deep Learning Specialization系列课程的第1课《Neural Networks and Deep Learning》中Shallow Neural Network练习部分的学习笔记。
上一篇文章《05 两层神经网络 - 神经网络和深度学习 [Deep Learning Specialization系列]》讲了包含一层隐藏层的神经网络的一些原理和公式推导,这次就来以分类为例来做一个练习。
1. 库的引用
首先,本次练习会用到一个新的机器学习的Python库:Scikit-learn
,该库会提供一些简单且高效的用于数据挖掘和数据分析的工具,具体可以参考Scikit-learn官网的介绍,里面也包含很多实例。
本次实验需要引入的库包括:
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_model
from planar_utils import sigmoid, load_planar_dataset
planar_utils
模块包含该练习需要用到的数据加载以及sigmoid
函数。其中,数据加载函数是生成一个花形的分成2类的数据集。
def load_planar_dataset():
np.random.seed(1)
m = 400 # number of examples
N = int(m/2) # number of points per class
D = 2 # dimensionality
X = np.zeros((m,D)) # data matrix where each row is a single example
Y = np.zeros((m,1), dtype='uint8') # labels vector (0 for red, 1 for blue)
a = 4 # maximum ray of the flower
for j in range(2):
ix = range(N*j,N*(j+1))
t = np.linspace(j*3.12,(j+1)*3.12,N) + np.random.randn(N)*0.2 # theta
r = a*np.sin(4*t) + np.random.randn(N)*0.2 # radius
X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
Y[ix] = j
X = X.T
Y = Y.T
return X, Y
数据加载只需调用该函数即可:X, Y = load_planar_dataset()
2. 神经网络模型
本练习使用的神经网络是包含一层隐藏层的2层神经网络,其中输入层是2个节点(因为我们是一个对二维数据进行分类的练习),隐藏层包含4个节点并使用tanh激活函数,输出层是用sigmoid函数。
具体的网络模型如下图所示:
构建该神经网络的一般方法为:
- 定义神经网络的结构,包括输入层、隐藏层和输出层的节点数
- 初始化模型的参数
- 正向传播
- 计算损失函数或代价函数
- 反向传播
- 通过梯度递减法更新参数
- 构建完整模型(循环)
下面就来实现各个步骤。
2.1 神经网络的结构
这一步要做的非常简单,即根据输入数据以及定义好的隐藏层节点数来定义三个尺寸:输入层大小n_x
、隐藏层大小n_h
和输出层大小n_y
。
def layer_sizes(X, Y):
n_x = X.shape[0] # size of input layer
n_h = 4 # 自定义的大小,可以更改
n_y = Y.shape[0] # size of output layer
return (n_x, n_h, n_y)
2.2 初始化参数
在上一篇文章《05 两层神经网络 - 神经网络和深度学习 [Deep Learning Specialization系列]》的参数的初始化部分有提到:
在包含隐藏层的神经网络中,我们不能将参数初始化为0
因此,在对该神经网络进行初始化时,我们使用Numpy的随机数来定义参数w
。对于各参数的维度,在上一篇文章中做了简单的说明,根据各层的计算公式:
- z [ 1 ] ( i ) = W [ 1 ] x ( i ) + b [ 1 ] z^{[1] (i)} = W^{[1]} x^{(i)} + b^{[1]} z[1](i)=W[1]x(i)+b[1]
- z [ 2 ] ( i ) = W [ 2 ] a [ 1 ] ( i ) + b [ 2 ] z^{[2] (i)} = W^{[2]} a^{[1] (i)} + b^{[2]} z[2](i)=W