1. Convolution Layers

由于图像是二维的,因此基本上最常用到的就是二维的卷积类:torch.nn.Conv2d,官方文档:torch.nn.Conv2d。

Conv2d 的主要参数有以下几个:

  • in_channels:输入图像的通道数,彩色图像一般都是三通道。
  • out_channels:通过卷积后产生的输出图像的通道数。
  • kernel_size:可以是一个数或一个元组,表示卷积核的大小,卷积核的参数是从数据的分布中采样得到的,这些数是多少无所谓,因为在神经网络训练的过程中就是对这些参数进行不断地调整。
  • stride:步长。
  • padding:填充。
  • padding_mode:填充模式,有 zerosreflectreplicatecircular,默认为 zeros
  • dilation:可以是一个数或一个元组,表示卷积核各个元素间的距离。
  • group:一般设置为1,基本用不到。
  • bias:偏置,一般设置为 True。

例如以下代码构建了一个只有一层卷积层的神经网络,该卷积层的输入和输出通道数都为三通道,卷积核大小为3*3,步长为1,无填充,然后用 CIFAR10 测试数据集进行测试:

from torchvision import transforms, datasets
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import torch.nn as nntest_set = datasets.CIFAR10('dataset/CIFAR10', train=False, transform=transforms.ToTensor())data_loader = DataLoader(test_set, batch_size=64)class Network(nn.Module):def __init__(self):super(Network, self).__init__()self.conv1 = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, stride=1, padding=0)def forward(self, input):output = self.conv1(input)return outputnetwork = Network()
print(network)  # Network((conv1): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1)))writer = SummaryWriter('logs')for step, data in enumerate(data_loader):imgs, targets = dataoutput = network(imgs)writer.add_images('input', imgs, step)writer.add_images('output', output, step)writer.close()

测试结果如下:

可以看到卷积运算能够提取输入图像的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。

2. Pooling Layers

Pooling Layers 相关函数介绍的官方文档:Pooling Layers。

其中的 MaxPool 表示最大池化,也称上采样;MaxUnpool 表示最小池化,也称下采样;AvgPool 表示平均池化。其中最常用的为 MaxPool2d,官方文档:torch.nn.MaxPool2d。

最大池化的步骤如下图所示:

MaxPool2d 的主要参数有以下几个:

  • kernel_size:用来取最大值的窗口(池化核)大小,和之前的卷积核类似。
  • stride:步长,注意默认值为 kernel_size
  • padding:填充,和 Conv2d 一样。
  • dilation:池化核中各个元素间的距离,和 Conv2d 一样。
  • return_indices:如果为 True,表示返回值中包含最大值位置的索引。注意这个最大值指的是在所有窗口中产生的最大值,如果窗口产生的最大值总共有5个,就会有5个返回值。
  • ceil_mode:如果为 True,表示在计算输出结果形状的时候,使用向上取整,否则默认向下取整。

输出结果形状的计算公式如下:

接下来我们用代码实现这个池化层:

from torchvision import transforms, datasets
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import torch.nn as nn
import torchclass Network(nn.Module):def __init__(self):super(Network, self).__init__()self.maxpool1 = nn.MaxPool2d(kernel_size=2)def forward(self, input):output = self.maxpool1(input)return outputinput = torch.tensor([[1, 2, 1, 0],[0, 1, 2, 3],[3, 0, 1, 2],[2, 4, 0, 1]
], dtype=torch.float32)  # 注意池化层读入的数据需要为浮点型input = torch.reshape(input, (1, 1, 4, 4))network = Network()
print(network)  # Network((maxpool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))output = network(input)
print(output)
# tensor([[[[2., 3.],
#           [4., 2.]]]])

我们用图像来试试效果:

from torchvision import transforms, datasets
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import torch.nn as nntest_set = datasets.CIFAR10('dataset/CIFAR10', train=False, transform=transforms.ToTensor())data_loader = DataLoader(test_set, batch_size=64)class Network(nn.Module):def __init__(self):super(Network, self).__init__()self.maxpool1 = nn.MaxPool2d(kernel_size=2)def forward(self, input):output = self.maxpool1(input)return outputnetwork = Network()writer = SummaryWriter('logs')for step, data in enumerate(data_loader):imgs, targets = dataoutput = network(imgs)writer.add_images('input', imgs, step)writer.add_images('output', output, step)writer.close()

测试结果如下:

可以看到最大池化的目的是保留输入数据的特征,同时减小特征的数据量

PyTorch学习笔记-Convolution Layers与Pooling Layers相关推荐

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

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

  2. PyTorch学习笔记(五):模型定义、修改、保存

    往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...

  3. PyTorch学习笔记(六)——Sequential类、参数管理与GPU

    系列文章\text{\bf 系列文章}系列文章 PyTorch学习笔记(一)--Tensor的基础语法 PyTorch学习笔记(二)--自动微分 PyTorch学习笔记(三)--Dataset和Dat ...

  4. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  5. pytorch学习笔记(二):gradien

    pytorch学习笔记(二):gradient 2017年01月21日 11:15:45 阅读数:17030

  6. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  7. pytorch 学习笔记目录

    1 部分内容 pytorch笔记 pytorch模型中的parameter与buffer_刘文巾的博客-CSDN博客 pytorch学习笔记 torchnn.ModuleList_刘文巾的博客-CSD ...

  8. pytorch学习笔记 torchnn.ModuleList

    1 nn.ModuleList原理 nn.ModuleList,它是一个储存不同 module,并自动将每个 module 的 parameters 添加到网络之中的容器. 你可以把任意 nn.Mod ...

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

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

最新文章

  1. 解决Windows7下vs2008 Active control test container 不能运行的问题
  2. CAPSNET:具有自我注意路由的胶囊网络
  3. Exchange服务器系列课程之七--维护邮件服务器(二)
  4. dbcp2和dbcp 1.4在API层面的差异
  5. centos7安装FTP
  6. ASP.NET 2.0防止同一用户同时登陆【转】
  7. python中sin函数在哪个模块中_从零开始第5步:Python 函数和模块
  8. 如何开发rest接口服务_如何简化网络请求接口开发
  9. 天猫净饮水行业趋势白皮书2021
  10. inurl news.php id,news.php
  11. 为什么你的数据库经常会被破防呢?原因原来是这——Sql注入问题(源码+文字深度解析)
  12. kubernetes 查看所有namespace、默认的namespace
  13. 最全的【英语词根词缀思维导图总结】
  14. Linux系统下制作windows系统安装U盘
  15. linux 禁用超线程,Linux动态启用/禁用超线程技术
  16. 基于multisim的语音放大器电路设计
  17. 开机自动随机改计算机名,【优化电脑·禁止随机启动项·加速开机】
  18. 温升测试仪-Type-C插头温升测试
  19. Android判断手机号码是否是正确的手机号码
  20. PLL中的locked信号解析

热门文章

  1. ContextMenu
  2. 趣图:代码合并冲突,代码遗失
  3. UE4 版本升级记录和一些Bug处理笔记
  4. 一个五年程序员的年终总结
  5. 任务42:EF Core Migration
  6. Python先生,你好!(5)——使用高斯滤波器提取图像特征
  7. 计算机视觉光源分类、特点及其优化方法
  8. 《Android入门到精通》第十九章学习笔记总结
  9. 153、【动态规划】leetcode ——1049. 最后一块石头的重量 II:滚动数组(C++版本)
  10. 【Mistral】 workflow实例一, yaml文件里的变量定义,action调用等