深度学习模型一般由各种模型层组合而成。

torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类,具备参数管理功能。

例如:

  • nn.Linear, nn.Flatten, nn.Dropout, nn.BatchNorm2d

  • nn.Conv2d,nn.AvgPool2d,nn.Conv1d,nn.ConvTranspose2d

  • nn.Embedding,nn.GRU,nn.LSTM

  • nn.Transformer

如果这些内置模型层不能够满足需求,我们也可以通过继承nn.Module基类构建自定义的模型层。

实际上,pytorch不区分模型和模型层,都是通过继承nn.Module进行构建。

因此,我们只要继承nn.Module基类并实现forward方法即可自定义模型层。

一,内置模型层

import numpy as np
import torch
from torch import nn 

一些常用的内置模型层简单介绍如下。

基础层

  • nn.Linear:全连接层。参数个数 = 输入层特征数× 输出层特征数(weight)+ 输出层特征数(bias)

  • nn.Flatten:压平层,用于将多维张量样本压成一维张量样本。

  • nn.BatchNorm1d:一维批标准化层。通过线性变换将输入批次缩放平移到稳定的均值和标准差。可以增强模型对输入不同分布的适应性,加快模型训练速度,有轻微正则化效果。一般在激活函数之前使用。可以用afine参数设置该层是否含有可以训练的参数。

  • nn.BatchNorm2d:二维批标准化层。

  • nn.BatchNorm3d:三维批标准化层。

  • nn.Dropout:一维随机丢弃层。一种正则化手段。

  • nn.Dropout2d:二维随机丢弃层。

  • nn.Dropout3d:三维随机丢弃层。

  • nn.Threshold:限幅层。当输入大于或小于阈值范围时,截断之。

  • nn.ConstantPad2d: 二维常数填充层。对二维张量样本填充常数扩展长度。

  • nn.ReplicationPad1d: 一维复制填充层。对一维张量样本通过复制边缘值填充扩展长度。

  • nn.ZeroPad2d:二维零值填充层。对二维张量样本在边缘填充0值.

  • nn.GroupNorm:组归一化。一种替代批归一化的方法,将通道分成若干组进行归一。不受batch大小限制,据称性能和效果都优于BatchNorm。

  • nn.LayerNorm:层归一化。较少使用。

  • nn.InstanceNorm2d: 样本归一化。较少使用。

各种归一化技术参考如下知乎文章《FAIR何恺明等人提出组归一化:替代批归一化,不受批量大小限制》

https://zhuanlan.zhihu.com/p/34858971

卷积网络相关层

  • nn.Conv1d:普通一维卷积,常用于文本。参数个数 = 输入通道数×卷积核尺寸(如3)×卷积核个数 + 卷积核尺寸(如3)

  • nn.Conv2d:普通二维卷积,常用于图像。参数个数 = 输入通道数×卷积核尺寸(如3乘3)×卷积核个数 + 卷积核尺寸(如3乘3)
    通过调整dilation参数大于1,可以变成空洞卷积,增大卷积核感受野。
    通过调整groups参数不为1,可以变成分组卷积。分组卷积中不同分组使用相同的卷积核,显著减少参数数量。
    当groups参数等于通道数时,相当于tensorflow中的二维深度卷积层tf.keras.layers.DepthwiseConv2D。
    利用分组卷积和1乘1卷积的组合操作,可以构造相当于Keras中的二维深度可分离卷积层tf.keras.layers.SeparableConv2D。

  • nn.Conv3d:普通三维卷积,常用于视频。参数个数 = 输入通道数×卷积核尺寸(如3乘3乘3)×卷积核个数 + 卷积核尺寸(如3乘3乘3) 。

  • nn.MaxPool1d: 一维最大池化。

  • nn.MaxPool2d:二维最大池化。一种下采样方式。没有需要训练的参数。

  • nn.MaxPool3d:三维最大池化。

  • nn.AdaptiveMaxPool2d:二维自适应最大池化。无论输入图像的尺寸如何变化,输出的图像尺寸是固定的。
    该函数的实现原理,大概是通过输入图像的尺寸和要得到的输出图像的尺寸来反向推算池化算子的padding,stride等参数。

  • nn.FractionalMaxPool2d:二维分数最大池化。普通最大池化通常输入尺寸是输出的整数倍。而分数最大池化则可以不必是整数。分数最大池化使用了一些随机采样策略,有一定的正则效果,可以用它来代替普通最大池化和Dropout层。

  • nn.AvgPool2d:二维平均池化。

  • nn.AdaptiveAvgPool2d:二维自适应平均池化。无论输入的维度如何变化,输出的维度是固定的。

  • nn.ConvTranspose2d:二维卷积转置层,俗称反卷积层。并非卷积的逆操作,但在卷积核相同的情况下,当其输入尺寸是卷积操作输出尺寸的情况下,卷积转置的输出尺寸恰好是卷积操作的输入尺寸。在语义分割中可用于上采样。

  • nn.Upsample:上采样层,操作效果和池化相反。可以通过mode参数控制上采样策略为"nearest"最邻近策略或"linear"线性插值策略。

  • nn.Unfold:滑动窗口提取层。其参数和卷积操作nn.Conv2d相同。实际上,卷积操作可以等价于nn.Unfold和nn.Linear以及nn.Fold的一个组合。
    其中nn.Unfold操作可以从输入中提取各个滑动窗口的数值矩阵,并将其压平成一维。利用nn.Linear将nn.Unfold的输出和卷积核做乘法后,再使用
    nn.Fold操作将结果转换成输出图片形状。

  • nn.Fold:逆滑动窗口提取层。

循环网络相关层

  • nn.Embedding:嵌入层。一种比Onehot更加有效的对离散特征进行编码的方法。一般用于将输入中的单词映射为稠密向量。嵌入层的参数需要学习。

  • nn.LSTM:长短记忆循环网络层【支持多层】。最普遍使用的循环网络层。具有携带轨道,遗忘门,更新门,输出门。可以较为有效地缓解梯度消失问题,从而能够适用长期依赖问题。设置bidirectional = True时可以得到双向LSTM。需要注意的时,默认的输入和输出形状是(seq,batch,feature), 如果需要将batch维度放在第0维,则要设置batch_first参数设置为True。

  • nn.GRU:门控循环网络层【支持多层】。LSTM的低配版,不具有携带轨道,参数数量少于LSTM,训练速度更快。

  • nn.RNN:简单循环网络层【支持多层】。容易存在梯度消失,不能够适用长期依赖问题。一般较少使用。

  • nn.LSTMCell:长短记忆循环网络单元。和nn.LSTM在整个序列上迭代相比,它仅在序列上迭代一步。一般较少使用。

  • nn.GRUCell:门控循环网络单元。和nn.GRU在整个序列上迭代相比,它仅在序列上迭代一步。一般较少使用。

  • nn.RNNCell:简单循环网络单元。和nn.RNN在整个序列上迭代相比,它仅在序列上迭代一步。一般较少使用。

Transformer相关层

  • nn.Transformer:Transformer网络结构。Transformer网络结构是替代循环网络的一种结构,解决了循环网络难以并行,难以捕捉长期依赖的缺陷。它是目前NLP任务的主流模型的主要构成部分。Transformer网络结构由TransformerEncoder编码器和TransformerDecoder解码器组成。编码器和解码器的核心是MultiheadAttention多头注意力层。

  • nn.TransformerEncoder:Transformer编码器结构。由多个 nn.TransformerEncoderLayer编码器层组成。

  • nn.TransformerDecoder:Transformer解码器结构。由多个 nn.TransformerDecoderLayer解码器层组成。

  • nn.TransformerEncoderLayer:Transformer的编码器层。

  • nn.TransformerDecoderLayer:Transformer的解码器层。

  • nn.MultiheadAttention:多头注意力层。

Transformer原理介绍可以参考如下知乎文章《详解Transformer(Attention Is All You Need)》

https://zhuanlan.zhihu.com/p/48508221

二,自定义模型层

如果Pytorch的内置模型层不能够满足需求,我们也可以通过继承nn.Module基类构建自定义的模型层。

实际上,pytorch不区分模型和模型层,都是通过继承nn.Module进行构建。

因此,我们只要继承nn.Module基类并实现forward方法即可自定义模型层。

下面是Pytorch的nn.Linear层的源码,我们可以仿照它来自定义模型层。

import torch
from torch import nn
import torch.nn.functional as Fclass Linear(nn.Module):__constants__ = ['in_features', 'out_features']def __init__(self, in_features, out_features, bias=True):super(Linear, self).__init__()self.in_features = in_featuresself.out_features = out_featuresself.weight = nn.Parameter(torch.Tensor(out_features, in_features))if bias:self.bias = nn.Parameter(torch.Tensor(out_features))else:self.register_parameter('bias', None)self.reset_parameters()def reset_parameters(self):nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5))if self.bias is not None:fan_in, _ = nn.init._calculate_fan_in_and_fan_out(self.weight)bound = 1 / math.sqrt(fan_in)nn.init.uniform_(self.bias, -bound, bound)def forward(self, input):return F.linear(input, self.weight, self.bias)def extra_repr(self):return 'in_features={}, out_features={}, bias={}'.format(self.in_features, self.out_features, self.bias is not None)linear = nn.Linear(20, 30)
inputs = torch.randn(128, 20)
output = linear(inputs)
print(output.size())
torch.Size([128, 30])

速成pytorch学习——7天模型层layers相关推荐

  1. 速成pytorch学习——5天nn.functional 和 nn.Module

    一,nn.functional 和 nn.Module 前面我们介绍了Pytorch的张量的结构操作和数学运算中的一些常用API. 利用这些张量的API我们可以构建出神经网络相关的组件(如激活函数,模 ...

  2. 速成pytorch学习——1天

    一.Pytorch的建模流程 使用Pytorch实现神经网络模型的一般流程包括: 1,准备数据 2,定义模型 3,训练模型 4,评估模型 5,使用模型 6,保存模型. 对新手来说,其中最困难的部分实际 ...

  3. 速成pytorch学习——4天中阶API示范

    使用Pytorch的中阶API实现线性回归模型和和DNN二分类模型. Pytorch的中阶API主要包括各种模型层,损失函数,优化器,数据管道等等. 一,线性回归模型 1,准备数据 import nu ...

  4. 速成pytorch学习——9天构建模型的3种方法

    可以使用以下3种方式构建模型: 1,继承nn.Module基类构建自定义模型. 2,使用nn.Sequential按层顺序构建模型. 3,继承nn.Module基类构建模型并辅助应用模型容器进行封装( ...

  5. 速成pytorch学习——11天. 使用GPU训练模型

    深度学习的训练过程常常非常耗时,一个模型训练几个小时是家常便饭,训练几天也是常有的事情,有时候甚至要训练几十天. 训练过程的耗时主要来自于两个部分,一部分来自数据准备,另一部分来自参数迭代. 当数据准 ...

  6. 速成pytorch学习——10天.训练模型的3种方法

    Pytorch通常需要用户编写自定义训练循环,训练循环的代码风格因人而异. 有3类典型的训练循环代码风格:脚本形式训练循环,函数形式训练循环,类形式训练循环. 下面以minist数据集的分类模型的训练 ...

  7. 速成pytorch学习——8天损失函数

    一般来说,监督学习的目标函数由损失函数和正则化项组成.(Objective = Loss + Regularization) Pytorch中的损失函数一般在训练模型时候指定. 注意Pytorch中内 ...

  8. 速成pytorch学习——6天Dataset和DataLoader

    Pytorch通常使用Dataset和DataLoader这两个工具类来构建数据管道. Dataset定义了数据集的内容,它相当于一个类似列表的数据结构,具有确定的长度,能够用索引获取数据集中的元素. ...

  9. 速成pytorch学习——3天自动微分机制

    神经网络通常依赖反向传播求梯度来更新网络参数,求梯度过程通常是一件非常复杂而容易出错的事情. 而深度学习框架可以帮助我们自动地完成这种求梯度运算. Pytorch一般通过反向传播 backward 方 ...

最新文章

  1. 求幂运算、多项式乘法及Horner法则的应用
  2. k8s如何设置虚拟内存_绝地求生内存优化设置教程(建议收藏)
  3. VTK:给定颜色,找到对比色用法实战
  4. Qt学习笔记-----Model/View架构之自定义Model
  5. Unable to update index for central http://repo1.maven.org/maven2/
  6. Netweaver 服务器和客户端TLS版本号不匹配的解决方案
  7. 打印pdf就一页_Excel表格打印技巧汇总,看完才发现,你连基础打印技巧都不知道...
  8. Eclipse run configrations 配置
  9. 中国第一大善人是他!福布斯2019中国慈善榜发布:马云才排第三
  10. Eclipse项目上传码云、从码云上检出项目、修改检出项目后在提交到码云、看此篇即可
  11. js 滚动条自动滚动到最底部
  12. 【SICP练习】102 练习2.79-2.80
  13. 【翻译】在backtrack5上用Evilgrade工具15步**windows
  14. 部署Lync监控报告
  15. Python_Bool
  16. Android Studio 生成apk 出现 :error_prone_annotations.jar (com.google.errorprone:error) 错误
  17. 如何复制百度文库里面的文章
  18. RestSharp的使用记录
  19. C++变量前面加下划线的含义
  20. 开机后黑屏看不到桌面_开机不显示桌面黑屏怎么办_win10开机黑屏啥也没有的解决办法...

热门文章

  1. SAP License:移动类型107和109
  2. 信贷ABS资产静态池与动态池里的数据分析内容都有啥
  3. 多用户在线人数监听(基于TomCat)
  4. 面向对象接口和类的区别
  5. 分层贝叶斯模型——结构
  6. 让低版本IE兼容H5+CSS3新特性的方法
  7. Ubantu下安装adobe flash player插件
  8. UNIX环境高级编程——线程同步之条件变量以及属性
  9. 手机开发与测试的Firefox插件:User Agent Switcher
  10. 分享一个同行的blog,UI方面的。