概述
学习课程后,再第一周第四课作业的基础上完成该周作业,现将心得体会记录如下。
初始化权重
代码更改
在之前的建立神经网络的过程中,提到权重w不能为0,而将它初始化为一个随机的值。然而在一个深层神经网络中,当w的值被初始化过大时,进入深层时呈指数型增长,造成梯度爆炸;过小时又会呈指数级衰减,造成梯度消失。
Python中将w进行随机初始化时,使用numpy库中的np.random.randn()方法,randn是从均值为0的单位标准正态分布(也称“高斯分布”)进行取样。随着对神经网络中的某一层输入的数据量n的增长,输出数据的分布中,方差也在增大。结果证明,可以除以输入数据量n的平方根来调整其数值范围,这样神经元输出的方差就归一化到1了,不会过大导致到指数级爆炸或过小而指数级衰减。
代码更改如下:
- 参数初始化函数:
def init_para(layer_dims, init_mode):
L = len(layer_dims) #L为总层数
np.random.seed(L)
parameters = {}
if init_mode=='zero':
for l in range(1,L): #初始化W1~WL,b1~bL
parameters['W'+str(l)] = np.zeros((layer_dims[l], layer_dims[l-1]))
parameters['b'+str(l)] = np.zeros((layer_dims[l], 1))
if init_mode=='random':
for l in range(1,L): #初始化W1~WL,b1~bL
parameters['W'+str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1])*0.01
parameters['b'+str(l)] = np.zeros((layer_dims[l], 1))
if init_mode=='norm':
for l in range(1,L): #初始化W1~WL,b1~bL
parameters['W'+str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1])*np.sqrt(1.0/(layer_dims[l-1]))
parameters['b'+str(l)] = np.zeros((layer_dims[l], 1))
return parameters
- 模型函数:
def NN_model(X, Y, layer_dims, learning_steps, learning_rate, print_flag, init_mode):
np.random.seed(1)
costs=[]
parameters = init_para(layer_dims, init_mode) #初始化参数
for i in range(0, learning_steps): #进行learning_steps次训练
AL, caches = prop_forward(X, parameters) #前向传播,计算A1~AL
cost = compute_cost(AL,Y) #计算成本
grads = prop_backward(AL, Y, caches) #反向传播,计算dW1~dWL,db1~dbL
parameters = update_para(parameters, grads, learning_rate) #更新参数
if print_flag==True and i%1000==0:
print('cost at %i steps:%f'%(i, cost))
costs.append(cost)
return parameters,costs
实施效果
二元分类问题1
样本数据集代码如下:
def gendata():
np.random.seed(1)
m = 600 #样本数
N = int(m/2) #分为两类
D = 2 #样本的特征数或维度
X = np.zeros((m,D)) #初始化样本坐标
Y = np.zeros((m,1)) #初始化样本标签
a = 4 #基础半径
for j in range(2):
ix = range(N*j,N*(j+1))#ix=(0,199)(200,399)
t = np.linspace(j*3.14,(j+1)*3.14,N) #theta角度,产生200个角度并加入随机数,保证角度随机分开,图像开起来稀疏程度不一
r = a*np.sin(4*t) + np.random.randn(N)*0.4 #radius半径,4sin(4*t),并加入一定的随机,图像轨道不平滑
X[ix] = np.c_[r*np.sin(t), r*np.cos(t)] #生成坐标点
Y[ix] = j #red or blue
return X.T,Y.T
令layer_dims=[2,4,3,2,1],learning_steps=20000,learning_rate=0.5。
当init_mode='zero'时:
当init_mode='random'时:
当init_mode='norm'时: