版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xinzhi8/article/details/77717439
将300个样本,每个样本有2维数据,分为3类
正向传播如下图所示:
详细如下图:
X为输入层,W与b为第一个hidden层的权重矩阵
W2与b2为为第二个hidden层的权重矩阵
scores为输出层
神经网络结构如下:
N = 100 D = 2 K = 3
#第一个hidden层的神经元 h = 100 #初始化权重矩阵 W = 0.01 * np.random.randn(D, h) b = np.zeros((1, h)) W2 = 0.01 * np.random.randn(h, K) b2 = np.zeros((1, K)) # 初始化超参数 step_size = 1e-0 reg = 1e-3 # regularization strength # 获取样本个数 num_examples = X.shape[0] 正向传播:
# 计算第一个hidden_layer层,并用Relu非线性化 hidden_layer = np.maximum(0, np.dot(X, W) + b) # 计算第二个hidden_layer层 scores = np.dot(hidden_layer, W2) + b2 # 进行softmax exp_scores = np.exp(scores) probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
# 计算总损失 corect_logprobs = -np.log(probs[range(num_examples), y]) #数据损失 data_loss = np.sum(corect_logprobs) / num_examples #正则项损失 reg_loss = 0.5 * reg * np.sum(W * W) + 0.5 * reg * np.sum(W2 * W2) loss = data_loss + reg_loss
反向传播:
示意图
# 计算softmax梯度 dscores = probs dscores[range(num_examples), y] -= 1 dscores /= num_examples #计算W2,b2梯度 dW2 = np.dot(hidden_layer.T, dscores) db2 = np.sum(dscores, axis=0, keepdims=True) # 计算dhidden梯度 dhidden = np.dot(dscores, W2.T) # 计算Relu梯度 dhidden[hidden_layer <= 0] = 0 # 计算w,b梯度 dW = np.dot(X.T, dhidden) db = np.sum(dhidden, axis=0, keepdims=True) # 增加正则项梯度 dW2 += reg * W2 dW += reg * W # 参数更新 W += -step_size * dW b += -step_size * db W2 += -step_size * dW2 b2 += -step_size * db2 结果显示: