目录
点击回顾本周课堂笔记
一、权重初始化
1.数据和模型
相关代码:
train_X, train_Y, test_X, test_Y = init_utils.load_dataset(is_plot=True)
load_dataset()中的数据可视化代码:
if is_plot:
plt.scatter(train_X[:, 0], train_X[:, 1],c=train_Y,s=40,cmap=plt.cm.Spectral)
plt.show()
运行结果:
模型
实现一个三层的神经网络:LINEAR ->RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID。
迭代的次数为15000,每迭代1000次打印一次成本值
开始学习的核心代码:
for i in range(0, num_iterations):
# 前向传播
a3, cache = init_utils.forward_propagation(X, parameters)
# 计算成本
cost = init_utils.compute_loss(a3, Y)
# 反向传播
grads = init_utils.backward_propagation(X, Y, cache)
# 更新参数
parameters = init_utils.update_parameters(parameters, grads, learning_rate)
# 记录成本
if i % 1000 == 0:
costs.append(cost)
# 打印成本
if print_cost:
print("第" + str(i) + "次迭代,成本值为:" + str(cost))
实验方案
以下三种初始化都只对W进行处理,b不做处理(即b都为0初始化)。通过分析权重参数值、预测结果、学习率、分类性能等实验结果获得结论。
2.权重初始化为0
相关代码:
parameters = model(train_X, train_Y, initialization = "zeros",is_polt=True)
initialize_parameters_zeros(layers_dims) 中的零初始化语句:
parameters["W" + str(l)] = np.zeros((layers_dims[l], layers_dims[l - 1]))
parameters["b" + str(l)] = np.zeros((layers_dims[l], 1))
运行结果:
结论:
- 权重参数值被初始化为0,学习率一直没有变化,说明这个模型没有学习。
- 成本值在0.69附近,而且成本并没有真正降低,说明性能很差。
- 分类失败,该模型预测每个都为0。通常来说,零初始化都会导致神经网络无法打破对称性,最终导致的结果就是无论网络有多少层,最终只能得到和Logistic函数相同的效果。
3.随机初始化
相关代码:
parameters = model(train_X, train_Y, initialization = "random",is_polt=True)
initialize_parameters_random(layers_dims)中的随机初始化语句:
# 使用10倍缩放
parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * 10
parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))
运行结果:
结论:
- 随机初始化的权重参数值都是比较大的。
- 成本开始很高。这是因为由于具有较大的随机权重,最后一个激活(sigmoid)输出的结果非常接近于0或1,而当它出现错误时,它会导致非常高的损失。如果没有很好初始化参数,会导致梯度消失、爆炸,而减慢优化算法。如果对这个网络进行更长时间的训练,将看到更好的结果,但是使用过大的随机数初始化会减慢优化的速度。
4.sqrt(2 / n[l - 1])初始化
相关代码:
parameters = model(train_X, train_Y, initialization = "he",is_polt=True)
initialize_parameters_he(layers_dims)中的初始化语句:
parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * np.sqrt(2 / layers_dims[l - 1])
parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))
运行结果: