两层全连接网络的构建及求参数梯度的代码实现

本文介绍了如何构建一个简单的两层全连接神经网络用于多类别分类,采用numpy实现,包括前向传播、损失计算、参数梯度求解。网络初始化时,权重W使用随机高斯分布并约束范围,偏置b设为0。隐藏层激活函数为ReLU,输出层使用softmax和交叉熵损失函数,并加入L2正则化。通过上文的推导,利用反向传播计算各参数梯度,便于训练过程中的优化。
摘要由CSDN通过智能技术生成

两层全连接网络的构建及求参数梯度的代码实现

上一篇文章写了使用softmax进行多类别分类时使用的交叉熵损失函数对softmax输入单元求导的公式推导。最后求出来的导数非常简单,我不禁感叹设计者的睿智。这篇文章我将利用上次的推导结果实现一个简单的两层全连接神经网络用于多类别分类。代码将给出网络的前向传播过程、求loss损失、以及对网络中参数的求梯度。代码的实现用到了numpy,并没有使用更高级的深度学习框架。

代码将模型写在一个类当中,类中包含了很多方法,包括:求loss损失和参数梯度,train方法给定一些训练参数对使用随机梯度下降(SGD)优化器对模型进行训练,以及predict预测方法给定测试样本输出每个样本最有可能的分类。

  1. 模型首先初始化参数值,W服从的是随机的带有生态分布的初始值并限制在一个很小的值范围,b初始化为0。
  2. 网络中隐藏层使用Rlue作为激活函数,对输出使用softmax归一化并使用交叉熵损失函数。
  3. 损失函数中添加了L2正则化。
  4. 求参数梯度部分是难点。根据上篇文章的推导可以求出softmax输入单元S2的梯度ds2,通过反向传播算法根据ds2可以很容易求出w2、b2、w1、b1的参数。

代码如下:

class TwoLayerNet(object):
    def __init__(self, input_size, hidden_size, output_size, std=1e-4):
        self.params = {
   }
        self.params["w1"] = std * np.random.randn(input_size, hidden_size)
        self.params["b1"] = np.zeros(hidden_size)
        self.params["w2"] = std * np.random.randn(hidden_size, output_size)
        self.params["b2"] = std * np.random.randn(output_size)
    def loss(self, X, y=None, reg=0.0):
        w1, b1 = self.params["w1"], self.params["b1&#
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值