PyTorch 中的 torch.nn 包提供了很多与实现神经网络中的具体功能相关的类,这些类涵盖了深度神经网络模型在搭建和参数优化过程中的常用内容,比如神经网络中的卷积层、池化层、全连接层这类层次构造的方法、防止过拟合的参数归一化方法、Dropout 方法,还有激活函数部分的线性激活函数、非线性激活函数相关的方法,等等。

下面使用 PyTorchtorch.nn 包来简化我们之前的代码,开始部分的代码变化不大,如下所示:

import torch as tbatch_n = 100
input_data = 10000
hidden_layer = 100
output_data = 10x = t.randn(batch_n, input_data, requires_grad=False)
y = t.randn(batch_n, output_data, requires_grad=False)

这里仅定义了输入和输出的变量,之前定义神经网络模型中的权重参数的代码被删减了,这和我们之后在代码中使用的 torch.nn 包中的类有关,因为这个类能够帮助我们自动生成和初始化对应维度的权重参数。模型搭建的代码如下:

models = t.nn.Sequential(t.nn.Linear(input_data, hidden_layer),t.nn.ReLU(),t.nn.Linear(hidden_layer, output_data))

torch.nn.Sequential 括号内的内容就是我们搭建的神经网络模型的具体结: *

  • torch.nn.Linear(input_data,hidden_layer) 完成从输入层到隐藏层的线性变换;
  • torch.nn.ReLU() 为激活函数;
  • torch.nn.Linear(hidden_layer, output_data) 完成从隐藏层到输出层的线性变换;

下面分别对在以上代码中使用的 torch.nn.Sequentialtorch.nn.Lineartorch.nn.RelU 这三个类进行详细介绍。

1. torch.nn.Sequential

torch.nn.Sequential 类是 torch.nn 中的一种序列容器,通过在容器中嵌套各种实现神经网络中具体功能相关的类,来完成对神经网络模型的搭建,最主要的是,参数会按照我们定义好的序列自动传递下去。

我们可以将嵌套在容器中的各个部分看作各种不同的模块,这些模块可以自由组合。模块的加入一般有两种方式,一种是在以上代码中使用的直接嵌套,另一种是以 orderdict 有序字典的方式进行传入,这两种方式的唯一区别是:

  • 使用 orderdict 搭建的模型的每个模块都有我们自定义的名字;
  • 而前者默认使用从零开始的数字序列作为每个模块的名字;

下面通过示例来直观地看一下使用这两种方式搭建的模型之间的区别。

首先,使用直接嵌套搭建的模型代码如下:

import torch as tbatch_n = 100
input_data = 10000
hidden_layer = 100
output_data = 10x = t.randn(batch_n, input_data, requires_grad=False)
y = t.randn(batch_n, output_data, requires_grad=False)models = t.nn.Sequential(t.nn.Linear(input_data, hidden_layer),t.nn.ReLU(),t.nn.Linear(hidden_layer, output_data))print(models)

对该模型的结构进行打印输出,结果如下:

Sequential((0): Linear(in_features=10000, out_features=100, bias=True)(1): ReLU()(2): Linear(in_features=100, out_features=10, bias=True)
)

使用 orderdict 有序字典进行传入来搭建的模型代码如下:

import torch as t
from collections import OrderedDictbatch_n = 100
input_data = 10000
hidden_layer = 100
output_data = 10x = t.randn(batch_n, input_data, requires_grad=False)
y = t.randn(batch_n, output_data, requires_grad=False)models = t.nn.Sequential(OrderedDict([("Line1", t.nn.Linear(input_data, hidden_layer)),("ReLU", t.nn.ReLU()),("Line2",t.nn.Linear(hidden_layer, output_data))]))print(models)

输出结果如下:

Sequential((Line1): Linear(in_features=10000, out_features=100, bias=True)(ReLU): ReLU()(Line2): Linear(in_features=100, out_features=10, bias=True)
)

通过对这两种方式进行比较,我们会发现,对模块使用自定义的名称可让我们更便捷地找到模型中相应的模块并进行操作。

2. torch.nn.Linear

torch.nn.Linear 类用于定义模型的线性层,即完成前面提到的不同的层之间的线性变换。

torch.nn.Linear 类接收的参数有三个,分别是输入特征数、输出特征数和是否使用偏置,设置是否使用偏置的参数是一个布尔值,默认为 True ,即使用偏置。

在实际使用的过程中,我们只需将输入的特征数和输出的特征数传递给 torch.nn.Linear 类,就会自动生成对应维度的权重参数和偏置,对于生成的权重参数和偏置,我们的模型默认使用了一种比之前的简单随机方式更好的参数初始化方法。

根据我们搭建模型的输入、输出和层次结构需求,它的输入是在一个批次中包含 100 个特征数为 1000 的数据,最后得到 100 个特征数为 10 的输出数据,中间需要经过两次线性变换,所以要使用两个线性层,两个线性层的代码分别是

  • torch.nn.Linear(input_data,hidden_layer)
  • torch.nn.Linear(hidden_layer, output_data)

可看到,其代替了之前使用矩阵乘法方式的实现,代码更精炼、简洁。

3. torch.nn.ReLU

torch.nn.ReLU 类属于非线性激活分类,在定义时默认不需要传入参数。

当然,在 torch.nn 包中还有许多非线性激活函数类可供选择,比如之前讲到的 PReLULeakyReLU
TanhSigmoidSoftmax 等。

在掌握 torch.nn.Sequentialtorch.nn.Lineartorch.nn.RelU 的使用方法后,快速搭建更复杂的多层神经网络模型变为可能,而且在整个模型的搭建过程中不需要对在模型中使用到的权重参数和偏置进行任何定义和初始化说明,因为参数已经完成了自动生成。

PyTorch 笔记(16)— torch.nn.Sequential、torch.nn.Linear、torch.nn.RelU相关推荐

  1. PyTorch 笔记(09)— Tensor 线性代数计算(torch.trace、torch.diag、torch.mm、torch.dot、torch.inverse逆矩阵、转置)

    1. 常用函数 常用线性表函数如下表所示: 2. 使用示例 2.1 torch.trace In [22]: import torch as tIn [23]: a = t.arange(1, 10) ...

  2. PyTorch 笔记(08)— Tensor 比较运算(torch.gt、lt、ge、le、eq、ne、torch.topk、torch.sort、torch.max、torch.min)

    1. 常用函数 比较函数中有一些是逐元素比较,操作类似逐元素操作,还有一些类似归并操作,常用的比较函数如下表所示. 表中第一行的比较操作已经实现了运算符重载,因此可以使用 a>=b,a>b ...

  3. [Pytorch系列-30]:神经网络基础 - torch.nn库五大基本功能:nn.Parameter、nn.Linear、nn.functioinal、nn.Module、nn.Sequentia

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  4. Pytorch —— nn.Module类(nn.sequential)

    对于前面的线性回归模型. Logistic回归模型和神经网络,我们在构建的时候定义了需要的参数.这对于比较小的模型是可行的,但是对于大的模型,比如100 层的神经网络,这个时候再去手动定义参数就显得非 ...

  5. nn.Sequential与nn.ModuleList

    1.nn.Sequential 模块按照顺序进行排列的,确保输入与输出模块的通道数相同(实际上是feature map数量). nn.Sequential写法有3种: 第一种写法: 创建nn.Sequ ...

  6. nn.Sequential()

    nn.Sequential nn.Sequential()介绍 Pytorch官网举例 nn.Sequential()的本质作用 nn.Sequential()源码 nn.Sequential()介绍 ...

  7. pytorch_lesson13.4 Dead ReLU Problem成因分析+通过调整学习率来缓解+Relu特性理解+nn.Sequential建模方式以及参数自定义方法

    提示:仅仅是学习记录笔记,搬运了学习课程的ppt内容,本意不是抄袭!望大家不要误解!纯属学习记录笔记!!!!!! 文章目录 前言 一.Dead ReLU Problem成因分析 1.Dead ReLU ...

  8. PyTorch笔记——FX

    官方文档链接:https://pytorch.org/docs/master/fx.html# 概述 FX是供开发人员用于转换nn.Module实例的工具包.FX由三个主要组件组成:符号追踪:symb ...

  9. pytorch使用torch.nn.Sequential构建网络

    以一个线性回归的例子为例: 全部代码 import torch import numpy as npdef get_x_y():x = np.random.randint(0, 50, 300)y_v ...

最新文章

  1. C程序在Ubuntu下创建运行
  2. 小米max2 android p,这就是小米Max2?6.4英寸超大屏幕配置大升级
  3. LeetCode 1940. 排序数组之间的最长公共子序列(二分查找)
  4. HDOJ---2546 饭卡[DP01背包问题]
  5. USACO3.22Stringsobits
  6. tomcat配置请求指定html文件路径,Tomcat8限制指定域名或者IP访问(示例代码)
  7. Java转C#的最佳工具
  8. zzuoj 10492
  9. php foreach、while性能比较
  10. 用mongols轻松打造websocket应用
  11. 个税倒推收入的计算器_手把手教你做个税计算器(1)
  12. python数据可视化之疫情地图爬虫(含完整代码以及具体报告)
  13. 生成 Excel + PDF 导出,用 Java 实现
  14. 手机RAM、ROM和储存卡的那些事
  15. uniapp实现贪吃蛇小游戏
  16. 获取窗口 history数量_带你走进JavaScript世界系列——history 对象
  17. DEDECMS留言薄全站调用方法
  18. 关于vs中出现lnk2019和lnk1120错误
  19. Angular Material 图标素材网址与使用
  20. python做表格真的快吗_厉害!一百多张Excel表用Python竟然不到3秒就处理完了?

热门文章

  1. Oracle type (自定义类型的使用)
  2. Redis 笔记(15)— 管道 pipeline(客户端将批量命令打包发送用来节省网络开销)
  3. Go 知识点(05)— 类型别名与类型定义
  4. 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译
  5. python内置库之学习ctypes库(二)
  6. sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系
  7. TensorFlow指定CPU和GPU方法
  8. 用OpenCV进行摄像机标定
  9. 深度学习调用TensorFlow、PyTorch等框架
  10. 客快物流大数据项目(六):Docker与虚拟机的形象比喻及组件介绍