浅层BP神经网络
前言
学习浅层神经网络的demo,该神经网络总共有两层的,其中隐藏层1层,其中有4个神经元,输出层1层,其中一个神经元
一、设置参数
- 训练集 特征数据X(2,n) 标签数据Y(1,n)
- 测试集 (2,n)
- 权重数组 (4个神经元)W1 W1(4,2) W2(1,4)
- 置值b1 b1(4,1) b2(1,1)
- 学习率 learning_rate
- 样本数 n
二、涉及算法步骤
1.随机初始化每层的W,b
每一个隐藏层神经元都与输入层的每一个神经元相连。每一个相连都会有一个对应的参数w。
所以W1的维度是(n_h, n_x),表示(隐藏层的神经元个数,输入层神经元个数)
- W1 = np.random.randn(n_h, n_x) * 0.01 W1(4,2)
将第一层的参数b赋值为0,因为w已经非0了,所以b可以为0
因为每一个神经元只有一个对应的b,所以b1的维度是(n_h,1),表示(隐藏层神经元个数,1)
- b1 = np.zeros(shape=(n_h, 1)) b1(4,1)
同理,初始化第二层的w和b
- W2 = np.random.randn(n_y, n_h) * 0.01 W2(1,4)
- b2 = np.zeros(shape=(n_y, 1)) b2(1,1)
2.前向传播
- Z1 = np.dot(W1, X) + b1 #Z1(4,n)
- A1 = np.tanh(Z1) #A1(4,n)第一层的激活函数我们使用tanh。numpy库里面已经帮我们实现了tanh工具函数
- Z2 = np.dot(W2, A1) + b2 #Z2(1,n)
- A2 = sigmoid(Z2) #A2(1,n)第二层我们使用sigmoid,因为我们要解决的这个问题属于二分问题。
- cost = (np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2))) / n #cost(1,n)
3.反向传播
-
dZ2= A2 - Y dZ2(1,n)
-
dW2 = (1 / m) * np.dot(dZ2, A1.T) dW2(1,4)
-
db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True) db2(1,1)
-
dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2)) dZ1(4,n)
-
dW1 = (1 / m) * np.dot(dZ1, X.T) dW1(4,2)
-
db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True) db1(4,1)
3.梯度下降
- W1 = W1 - learning_rate * dW1
- b1 = b1 - learning_rate * db1
- W2 = W2 - learning_rate * dW2
- b2 = b2 - learning_rate * db2
4.数据预测
#预测其实就是简单地执行一次前向传播
- Z1 = np.dot(W1, X) + b1 #Z1(4,n)
- A1 = np.tanh(Z1) #A1(4,n)
- Z2 = np.dot(W2, A1) + b2 #Z2(1,n)
- A2 = sigmoid(Z2) #A2(1,n)
总结
在这个2层的浅层神经网络中,隐藏层只用了4个神经元,其实如果神经元更多些,预测结果会更准确一些。当然也不是越多越准确。