首页 > 其他分享 >4.2 多层感知机的从零开始实现

4.2 多层感知机的从零开始实现

时间:2023-06-29 12:11:31浏览次数:41  
标签:hiddens num nn 4.2 torch 感知机 从零开始 randn Parameter

本节实现一个单隐藏层的,具有256个隐藏单元的多层感知机,并且隐藏层使用ralu函数激活。注意,我们通常选择2的若干次幂作为层的隐藏单元数,因为内存在硬件中的分配和寻址方式,这么做往往可以在计算上更高效。

1. 参数初始化

我们用几个张量来表示我们的参数。 注意,对于每一层我们都要记录一个权重矩阵和一个偏置向量。

num_inputs, num_outputs, num_hiddens = 784, 10, 256

#这个nn.Parameter就是声明变量是一个神经网络参数,不加也没关系
#torch.randn()创建均值为0,方差为1的标准正态分布张量,参数为张量的形状,这里是形状为(num_inputs,num_hiddens)(第一课pytorch数据处理有过)
#这里randn产生的随机数乘上0.01,如果外面不加一个nn.Parameter包起来的话会报错,说什么不能优化非叶子的tensor:can't optimize a non-leaf Tensor
W1 = nn.Parameter(torch.randn(
    num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(
    num_hiddens, num_outputs, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))

params = [W1, b1, W2, b2]

2. 定义激活函数relu

def relu(X):
    a = torch.zeros_like(X)
    return torch.max(X, a)

3. 定义模型

记得我们从数据集中拿到的X是1*28*28的,而我们目前不考虑其空间结构,要将其作为一个784的向量输入。

def net(X):
    X = X.reshape((-1, num_inputs))
    H = relu(X@W1 + b1)  # 这里“@”代表矩阵乘法
    return (H@W2 + b2)

4. 定义损失函数

由于之前已经实现过交叉熵损失了,我们这里直接使用torch.nn自带的交叉熵损失函数:

loss = nn.CrossEntropyLoss(reduction='none')

5. 训练

num_epochs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

 

标签:hiddens,num,nn,4.2,torch,感知机,从零开始,randn,Parameter
From: https://www.cnblogs.com/pkuqcy/p/17513887.html

相关文章

  • 【从零开始学微服务】06.微服务架构的建设思路
    大家好,欢迎来到万猫学社,跟我一起学,你也能成为微服务专家。微服务看起来很美,但其实是需要一个技术体系或平台体系来支撑并且落地的。微服务架构建设分为两种思路:框架模式服务网格(ServiceMesh)模式接下来我们对上面的两个思路进行详细的介绍和对比。框架框架模式的典型代......
  • 11. 配置ContextPath【从零开始学Spring Boot】
    Springboot默认是/,这样直接通过http://ip:port/就可以访问到index页面,如果要修改为http://ip:port/path/访问的话,那么需要在Application.properties文件中加入server.context-path=/你的path,比如:spring-boot,那么访问地址就是http://ip:port/spring-boot路径。server.context-......
  • 9. 使用JdbcTemplate【从零开始学Spring Boot】
      整体步骤:(1)  在pom.xml加入jdbcTemplate的依赖;(2)  编写DemoDao类,声明为:@Repository,引入JdbcTemplate(3)  编写DemoService类,引入DemoDao进行使用(4)  编写Demo2Controller进行简单测试。 具体操作流程如下: 使用JdbcTemplate类需要加入(如果在JPA已经加入的话,这......
  • 8. 使用JPA保存数据【从零开始学Spring Boot】
    在看这一篇文档的话,需要先配置好JPA–Hibernate。      总体步骤:(1)  创建实体类Demo,如果已经存在,可以忽略。(2)  创建jparepository类操作持久化。(3)  创建service类。(4)  创建restful请求类。(5)  测试 代码如下:com.kfit.test.bean.Demo:package......
  • 7. JPA - Hibernate【从零开始学Spring Boot】
      在说具体如何在springboot使用Hibernate前,先抛装引玉些知识点?什么是JPA呢?JPA全称JavaPersistenceAPI.JPA通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。http://baike.baidu.com/link?url=LdqIXvzTr0RDjY2yoRdpogDdzaZ_L-DrIOpLLzK1z38......
  • 如何使用AI从零开始创业
    从头开始创业是一项具有挑战性的工作,需要大量的努力和奉献。幸运的是,随着人工智能技术的出现,这个过程变得越来越容易。这听起来好得令人难以置信,但人工智能实际上已经跨越了现在可以完全从头开始做生意的地步,而且时间也少得可笑!在本文中,我们将介绍一些为此推荐的工具,以及如何使用......
  • 【从零开始学微服务】03.软件架构的演化过程
    大家好,欢迎来到万猫学社,跟我一起学,你也能成为微服务专家。目前大部分的企业系统和互联网应用都是采用Web的形式提供服务能力,根据系统的组织方式和部署结构,我们通常把软件架构的演化过程分为以下几个阶段:单体架构垂直架构SOA架构微服务架构单体架构单体架构,也被成为巨石......
  • [ARM 汇编]高级部分—性能优化与调试—3.4.2 ARM汇编程序调试技巧
    在ARM汇编程序开发过程中,调试是一个关键环节。适当的调试技巧可以帮助我们更快地定位问题、解决问题,从而提高开发效率。本节将讲解一些ARM汇编程序的调试技巧,并通过实例进行讲解。使用GDB调试GDB(GNU调试器)是一个功能强大的调试工具,它支持ARM汇编程序的调试。以下是使用GDB进行......
  • [QML]从零开始QML开发(二)QML开发,浅谈控件、槽函数、锚等基本概念。QML和C++怎么交互?贯
    [QML]从零开始QML开发(二)QML开发,浅谈控件、槽函数、锚等基本概念。QML和C++怎么交互?贯彻落实MVC原则先看代码:importQtQuick2.12importQtQuick.Window2.12importQtQuick.Controls2.5Window{visible:truewidth:320height:480title:qsTr("HelloW......
  • 感知机(Perceptron)
    受大脑启发的人工智能程序的一个早期例子是感知机(Perceptron),它由心理学家弗兰克·罗森布拉特于20世纪50年代末提出。感知机是一种基于神经网络的二分类模型,它可以用于对输入数据进行分类任务。感知机的结构简单,易于实现和训练,是神经网络的基础。大脑神经系统大脑神经系统无论从构造......