MLP多层感知器pytorch实现过程

参考博客:
https://blog.csdn.net/xholes/article/details/78461164
https://www.pianshen.com/article/1392309515/

代码github地址
使用pytorch框架实现MLP。为了深入了解源码,没有使用pytorch中torch.nn.Module类和其它现有的方法,大部分功能手写实现。

data文件夹中是数据集。

ReLU_CELF.py 是代码,激活函数使用ReLU,损失函数使用交叉熵。

”MLP文档“文件夹中有实现过程与编写代码时遇到的错误,实现过程中的内容与下文一致,实现过程中包括手写。

多层感知机:Multi-Layer Perceptron

多层感知机构建步骤:

  1. 构建网络模型
  2. 权重初始化
  3. 前向传播
  4. 计算损失
  5. 反向传播求梯度
  6. 更新权重

1. 构建网络模型

多层神经网络中第一层称之为输入层,最后一层称之为输出层,中间的层称之为隐层。在分类模型中,输出层的每一个变量对应一个类别。层与层之间两两单元之间存在连接。

在本模型中输入是一个 28 × 28 28\times28 28×28的图片,所以输入层大小是784,中间两个隐层大小分别是512,128。因为该模型用于识别MNIST手写集,相当于十分类,输出层大小为10。

2. 权重初始化

使用python中的randn来进行权重初始化。

t o r c h . r a n d n torch.randn torch.randn 返回一个包含了从标准正态分布中抽取的一组随机数的张量。

def init_parameters(self):
    self.W.append(torch.randn(self.hidden1_size, self.input_size))
    self.W.append(torch.randn(self.hidden2_size, self.hidden1_size))
    self.W.append(torch.randn(self.output_size, self.hidden2_size))
    self.b.append(torch.randn(self.hidden1_size, 1))
    self.b.append(torch.randn(self.hidden2_size, 1))
    self.b.append(torch.randn(self.output_size, 1))

在使用ReLU函数时,权值初始化出现问题。如果输入的x比较大,初始化权值w也比较大,那么就会导致计算出的a比较大,会出现很大的负数或者正数。导致最终计算经过softmax函数后的输出层时,会出现很多值为0,一个值为1的情况,这样对计算loss值是非常不利的,因为会计算 l o g ( 0 ) log(0) log(0)

同时,如果w值比较大的话,还可能会出现梯度爆炸的问题。

最后使用 小随机数或者除 n \sqrt{n} n 的方法来解决,将权重初始化为比较小的值。

def init_parameters(self):
        self.W.append(
            0.01 * torch.randn(self.hidden1_size, self.input_size))
        self.W.append(
            0.01 * torch.randn(self.hidden2_size, self.hidden1_size))
        self.W.append(
            0.01 * torch.randn(self.hidden3_size, self.hidden2_size))
        self.W.append(
            0.01 * torch.randn(self.output_size, self.hidden3_size))
        self.b.append(0.01 * torch.randn(self.hidden1_size, 1))
        self.b.append(0.01 * torch.randn(self.hidden2_size, 1))
        self.b.append(0.01 * torch.randn(self.hidden3_size, 1))
        self.b.append(0.01 * torch.randn(self.output_size, 1))

3. 前向传播

在这里插入图片描述

设变量的上标代表所处的神经网络的第几层。

W l W^{l} Wl连接第 l l l层到第 l − 1 l-1 l1层的权重矩阵中,其中 W j i l W_{ji}^{l} Wjil表示第 l − 1 l-1 l1层的第 i i i个节点与第 l l l层的第 j j j个节点的权重。

z j l + 1 = ∑ i = 1 n w j i l + 1 a i l = w j 1 l + 1 a 1 l + w j 2 l + 1 a 2 l + w j 3 l + 1 a 3 l + . . . + w j n l + 1 a n l z_{j}^{l+1} = \sum_{i=1}^{n}w_{ji}^{l+1}a_{i}^{l}=w_{j1}^{l+1}a_{1}^{l}+w_{j2}^{l+1}a_{2}^{l}+w_{j3}^{l+1}a_{3}^{l}+...+w_{jn}^{l+1}a_{n}^{l} zjl+1=i=1nwjil+1ail=wj1l+1a1l+wj2l+1a2l+wj3l+1a3l+...+wjnl+1anl

a j l = f ( z j l ) a_{j}^{l} = f(z_{j}^{l}) ajl=f(zjl),其中 f ( ⋅ ) f(\cdot) f()为激活函数。

将上述式子转化成矩阵表达式
{ Z l = W l a l − 1 + b l a l = f ( z l ) \begin{cases} {\bf Z}^{l}={\bf W}^{l}{\bf a}^{l-1}+{\bf b}^{l}\\ {\bf {a}}^{l}=f({\bf z^{l}})\\ \end{cases} {Zl=Wlal1+blal=f(zl)

4. 计算损失

使用交叉熵作为损失函数

设我们预测的结果是 Y ^ \hat{Y} Y^是我们预测的结果, Y Y Y是真实分类情况的one-hat编码。

L = − ∑ i = 1 n y i l o g y ^ i L = -\sum\limits_{i=1}^{n}y_{i}log\hat{y}_{i} L=i=1nyilogy^i

注意这里的 Y ^ \hat{Y} Y^应该是经过softmax函数处理之后的输出,这样能保证 ∑ i = 1 n = 1 \sum\limits_{i=1}^{n}=1 i=1n=1

5. 反向传播与更新参数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

训练过程可视化

使用pytorch内置的Tensorboard进行绘图

训练过程展示,每100个batch绘制一个点


Train_Loss

Train_Accuracy

测试过程展示,每100个batch绘制一个点


Test_Loss

Test_Accuracy

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
多层感知器(pytorch)是一种神经网络模型,它由多个全连接层组成。在pytorch中,可以使用torch.nn.Linear函数来实现多层感知器的全连接层。 一个典型的多层感知器(pytorch)的结构通常包含输入层、多个隐藏层和输出层。例如,使用MNIST数据集进行实例化时,输入层通常有784个节点(即28×28),而隐藏层可以有任意数量的节点,比如100个节点。最后,输出层通常有10个节点,用于表示不同类别的预测结果。 通过构建多个全连接层并使用适当的激活函数,多层感知器(pytorch)可以学习将输入数据映射到输出结果,从而实现分类、回归等任务。在训练过程中,通过反向传播算法更新网络参数,以最小化损失函数并提高预测性能。 总结起来,多层感知器(pytorch)是一种由多个全连接层组成的神经网络模型,在pytorch中可以使用torch.nn.Linear函数来实现全连接层。它可以用于解决分类、回归等任务,并通过反向传播算法进行训练和优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [pytorch 实现MLP(多层感知机)](https://blog.csdn.net/robator/article/details/121797902)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值