深度学习-基于softmax神经网络分类的源码实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 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


结果显示:






猜你喜欢

转载自blog.csdn.net/xinzhi8/article/details/77717439