参考文档:https://mp.weixin.qq.com/s/Wxx-8b_36unlimLKBUl8zA

前两篇文章了解了如何用 pytorch 创建一个 CNN 网络,实现对 MNIST 数据集的图片分类。其中用到了一些函数,我们从字面意思也可以理解其功能。但是如何灵活自由的构建自己想要的网络结构呢?今天我们介绍一些在 Deep Learning 中经常听到的一些网络层,以及在 pytorch 中它们的使用方法。

1、常用的神经网络层

这里我们介绍一下在构建网络时常见的一些神经网络层,分别从卷积层,池化层,dropout,BN 层展开介绍。

卷积层

从上图的源码中我们可以看到,pytorch 提供了多种类型的卷积函数,后面的 TODO 也展示了 pytorch 开发团队在后面计划加入的一些层。

在我们平常的使用中,可能以二维卷积最常用,所以这里以它为例来进行介绍。

CLASS torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

值得注意的几个点在于:
1.这是一个类,需要进行实例化后才能使用,我们使用的一般都是由这个类实例化出来的对象;
2.参数可以为 int 类型,也可以为 tuple,int 类型表示长宽都为同一个值;

接下来我们给一个例子看看:

>>> input = torch.randn(20, 16, 50, 100)>>> # With square kernels and equal stride
>>> m = nn.Conv2d(16, 33, 3, stride=2)
>>> output = m(input)
>>> output.shape
torch.Size([20, 33, 24, 49])>>> # non-square kernels and unequal stride and with padding
>>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
>>> output = m(input)
>>> output.shape
torch.Size([20, 33, 28, 100])

上面两个例子分别展示了参数为 int 和 tuple 的区别。大家也可以手推一下对输出的形状进行验证。

池化层

同样,这个图片截取了一部分源码中的示例,可以看到 pytorch 提供了很多类型的池化操作,我们以我们最常见的 max pooling 和 average pooling 为例进行介绍。

CLASS
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)

同样也是一个 class,我们也是使用实例化出来的对象进行网络操作。而且参数也可以选择 int 和 tuple 两种类型。

这里给出一个源码 doc 中的例子:

>>> input = torch.randn(20, 16, 50, 32)>>> # pool of square window of size=3, stride=2
>>> m = nn.MaxPool2d(3, stride=2)
>>> output = m(input)
>>> output.shape
torch.Size([20, 16, 24, 15])>>> # pool of non-square window
>>> m = nn.MaxPool2d((3, 2), stride=(2, 1))
>>> output = m(input)
>>> output.shape
torch.Size([20, 16, 24, 31])

dropout层

CLASS
torch.nn.Dropout(p=0.5, inplace=False)
torch.nn.Dropout2d(p=0.5, inplace=False)

Dropout 我们最常用的就是这两个,前者主要用于一维数据,比如 linear 的输出结果;后者主要用于二维数据,一般在卷积层后。其中的两个参数,p 表示一个将多少数据置为 0 的概率,inplace 为 true 则表示进行原地操作,对输入的数据本身内存进行操作。

下面给出一个源码 doc 中的例子:

>>> m = nn.Dropout2d(p=0.2)
>>> input = torch.randn(10, 3)
>>> output = m(input)
>>> input
tensor([[ 0.4453, -0.4929, -1.7591],[-0.1311, -1.0024, -0.5321],[-0.2614, -0.1416, -0.1580],[-0.1359,  0.0896, -0.3028],[-2.1673,  0.3533,  0.1597],[ 0.7464,  0.7417, -1.0306],[-0.1092, -1.0970,  1.1896],[ 0.7247, -0.8907,  0.6412],[ 1.9104, -0.1965,  1.6161],[ 0.0396,  0.4683, -0.4315]])
>>> output
tensor([[ 0.0000, -0.6161, -2.1988],[-0.1638, -1.2529, -0.6651],[-0.3268, -0.1770, -0.0000],[-0.1698,  0.0000, -0.3785],[-2.7091,  0.0000,  0.1996],[ 0.9330,  0.9271, -1.2882],[-0.0000, -1.3713,  1.4870],[ 0.0000, -1.1134,  0.8015],[ 2.3880, -0.2457,  0.0000],[ 0.0494,  0.5854, -0.0000]])

我们可以看到有一些数据被置为 0 了。

BN层

CLASS
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

这里的输入主要是需要注意一下 num_features,也就是输入数据的通道数。以二维的 BN 层为例,输入需要是一个 4 维的数据,分别是(batch_size,input_channel,H,W)。输出是一个同样维度的数据。

这里展示一下源码 doc 中的示例:

>>> # With Learnable Parameters
>>> m = nn.BatchNorm2d(100)>>> # Without Learnable Parameters
>>> m = nn.BatchNorm2d(100, affine=False)>>> input = torch.randn(20, 100, 35, 45)
>>> output = m(input)
>>> output.shape
torch.Size([20, 100, 35, 45])

可以看到输出数据的维度并没有变化,BN 层的输入需要和输入数据 input 的第二个维度保持一致(这里都是 100)。

2、常用的激活函数

在构建神经网络的过程中,激活函数也是非常重要的一个过程,对数据进行非线性激励,才是深度学习可以有如此优秀的拟合能力的核心。我们介绍几个比较典型的激活函数在 pytorch 中的应用。

这里的非线性激活函数,同样都是一个类,要使用需要进行实例化。具体的数学理论大家只要对 deep learning 的理论有些了解,对这些常见的激活函数肯定有所了解。

因为激活层一般输入和输出的格式是相同的,所以我们主要对这些激活函数的输入参数进行介绍,方便大家对这些激活层的应用。

elu

torch.nn.ELU(alpha=1.0, inplace=False)

ELU(x)=max(0,x)+min(0,α∗(exp(x)−1))ELU(x)=max(0,x)+min(0,α∗(exp(x)−1))ELU(x)=max(0,x)+min(0,α∗(exp(x)−1))输入的 alpha 就是上面函数中的 alpha。

relu

CLASS
torch.nn.ReLU(inplace=False)

relu 没有额外的参数要求,只是对数据直接进行操作。

sigmoid

CLASS
torch.nn.Sigmoid()

sigmoid 也没有额外的参数要求。

tanh

CLASS
torch.nn.Tanh()

同样没有额外的参数要求,输出与输入同格式。

softmax

CLASS
torch.nn.Softmax(dim=None)

同样没有额外的参数要求,输出与输入同格式。

最后我们给一个例子,大家可以参考一下代码应用形式:

>>> m = nn.ReLU()
>>> input = torch.randn(5)
>>> output = m(input)>>> input
tensor([ 0.9920, -0.2270,  0.6381, -0.4804, -0.8548])
>>> output
tensor([0.9920, 0.0000, 0.6381, 0.0000, 0.0000])

3、损失函数

在网络训练的过程中,损失函数衡量了网络对数据的拟合能力。我们在这里简单介绍两类最常见的损失函数,这两个损失函数我们也在前面的两篇文章中分别用到了:MSE 和 CrossEntropy。

MSE

CLASS
torch.nn.MSELoss(size_average=None, reduce=None, reduction=’mean’)

同样是一个类,使用时需要进行实例化。MSE(均方误差) 一般用于回归任务中,衡量了输入 x 和 label 之间的误差程度。

得到的误差结合 backward() 可以自动求梯度。

CrossEntropy

CLASS
torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction=’mean’)

这里一个需要注意的点是,CrossEntropyLoss 的输入是预测值和标签值,但是预测值是一个维度与类别数相等的张量,CrossEntropyLoss 会自动对输入进行一个 softmax() 操作,而标签值是对应的类别值。

下面我们给出一个例子,可以帮助我们进行理解。

>>> loss = nn.CrossEntropyLoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.empty(3, dtype=torch.long).random_(5)
>>> output = loss(input, target)>>> input.shape
torch.Size([3, 5])
>>> target.shape
torch.Size([3])

4、总结

本篇文章我们介绍了一些常用的神经网络层,有了这些储备,我们基本上可以参考前面的两篇文章,来构建自己想要的神经网络结构。

更多的网络层的内容可以看 pytorch 官方文档的总结,都非常清晰:https://pytorch.org/docs/stable/nn.html#

pytorch学习笔记(3):常用网络层介绍相关推荐

  1. 深度学习入门之PyTorch学习笔记:深度学习介绍

    深度学习入门之PyTorch学习笔记:深度学习介绍 绪论 1 深度学习介绍 1.1 人工智能 1.2 数据挖掘.机器学习.深度学习 1.2.1 数据挖掘 1.2.2 机器学习 1.2.3 深度学习 第 ...

  2. 深度学习入门之PyTorch学习笔记:卷积神经网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 4 卷积神经网络 4.1 主要任务及起源 4.2 卷积神经网络的原理和结构 4.2.1 卷积层 1. ...

  3. 深度学习入门之PyTorch学习笔记:多层全连接网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 3.1 PyTorch基础 3.2 线性模型 3.2.1 问题介绍 3.2.2 一维线性回归 3.2 ...

  4. pytorch学习笔记(2):在MNIST上实现一个CNN

    参考文档:https://mp.weixin.qq.com/s/1TtPWYqVkj2Gaa-3QrEG1A 这篇文章是在一个大家经常见到的数据集 MNIST 上实现一个简单的 CNN.我们会基于上一 ...

  5. PyTorch学习笔记2:nn.Module、优化器、模型的保存和加载、TensorBoard

    文章目录 一.nn.Module 1.1 nn.Module的调用 1.2 线性回归的实现 二.损失函数 三.优化器 3.1.1 SGD优化器 3.1.2 Adagrad优化器 3.2 分层学习率 3 ...

  6. PyTorch学习笔记(21) ——损失函数

    0. 前言 本博客内容翻译自纽约大学数据科学中心在2020发布的<Deep Learning>课程的Activation Functions and Loss Functions 部分. ...

  7. Python学习笔记:常用第三方模块3

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. Python学习笔记:常用第三方模块(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  9. Python学习笔记:常用内建模块6 (urllib)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  10. Python学习笔记:常用内建模块4:hmac

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. 积少成多 Flash(ActionScript 3.0 Flex 3.0) 系列文章索引
  2. 博科VP:闪存推动了与之相匹配的第六代FC的发展
  3. win7下设置无线上网
  4. linux打开python3_Python3 执行Linux Bash命令的方法
  5. asp.net 母版页使用详解--转
  6. label之间展示间距_工法样板如何做?碧桂园质量工法样板展示区做法标准
  7. 数论入门(基础定义)
  8. Apache HTTP Server 下载,安装,配置,启动手把手教你
  9. Python学习(4)证件照底色变换
  10. 物联卡代理商究竟如何选择?51物联卡告诉你正确答案
  11. 你所不知的米聊和微信的前身——酷啦啦
  12. JAVA房屋租赁管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  13. 高调华美戒指 流动于指间的时尚
  14. UI自动化测试环境搭建 Python+Selenium+RobotFramework
  15. Java 并发编程之美:并发编程高级篇之一-chat
  16. Retrofit2深度解析
  17. 16年前阿里的前台小姐,马云许诺坚持十年就分1亿,她现状如何 ?
  18. 【C语言】文件操作必知必会
  19. Android中LocalSocket(套接字)使用
  20. 矿大计算机学院周裕浩,计算机学院学子在第45届ACM-ICPC亚洲区决赛获佳绩

热门文章

  1. Elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
  2. 一次kvm嵌套虚拟化踩坑经历
  3. pajek软件使用方法_双全科技|管家婆管理库存必备“序列号”,管家婆软件的使用方法...
  4. 影片模块 Dubbo 服务聚合
  5. 布式事务实践 解决数据一致性 Spring事务机制
  6. vue 编辑弹框,编辑页面,列表数据也会跟着变
  7. 微信小程序提醒并延迟跳转
  8. PHP三维数组变一维
  9. 封装直传阿里云存储文件上传控件
  10. 如何继承SWT组件?