当前位置: 首页 > news >正文

PyTorch - Conv2d 和 MaxPool2d

文章目录

    • Conv2d
      • 计算
      • Conv2d 函数解析
      • 代码示例
    • MaxPool2d
      • 计算
      • 函数说明
    • 卷积过程动画
        • Transposed convolution animations
        • Transposed convolution animations


参考视频:土堆说 卷积计算
https://www.bilibili.com/video/BV1hE411t7RN


关于 torch.nn 和 torch.nn.function
torch.nn 是对 torch.nn.function 的封装,前者更方便实用。


Conv2d

卷积过程可见文末动画


计算

卷积层输入特征图(input feature map)的尺寸为:H_i × W_i × C_i

  • H_i :输入特征图的高
  • W_i :输入特征图的宽
  • C_i :输入特征图的通道数
    (如果是第一个卷积层则是输入图像的通道数,如果是中间的卷积层,则是上一层的输出通道数

卷积层的参数如下:

  • P:padding,补零的行数和列数
  • F:正方形卷积核的边长
  • S:stride,步幅
  • K:输出通道数

输出特征图(output feature map)的尺寸为 H_o × W_o × C_o ,其中每一个变量的计算方式如下:

  • H_o = (H_i + 2P − F)/S + 1
  • W_o = (W_i + 2P − F)/S + 1
  • C_o = K

  • 卷积时,超出边界的不计算。

参数量大小的计算,分为weights和biases:

首先,计算weights的参数量:F × F × C_i × K
接着计算biases的参数量:K
所以总参数量为:F × F × C_i × K + K


计算示例

输入卷积核步长padding输出计算
5x52x2104x44 = (5-2)/1 + 1
5x53x3103x33 = (5-3)/1 + 1
5x52x2202x22 = (5-2)/2 + 1
6x62x2203x33 = (6-2)/2 + 1
5x52x2116x64 = (5 + 1*2 - 2)/1 + 1
5x53x3115x53 = (5 + 1*2 - 3)/1 + 1
5x53x3224x43 = (5 + 2*2 - 3)/2 + 1

Conv2d 函数解析

  • torch.nn.functional.conv2d 官方说明
    https://pytorch.org/docs/stable/generated/torch.nn.functional.conv2d.html#torch.nn.functional.conv2d

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’, device=None, dtype=None)

  • in_channels
  • out_channels
  • kernel_size,卷积核大小;可以是一个数(n*n矩阵),也可以是一个元组。这个值在训练过程中,会不断被调整。
  • stride=1
  • padding=0
  • dilation=1,卷积核对应位的距离
  • groups=1,分组卷积;一般为1,很少改动。
  • bias=True,偏置,一般为True
  • padding_mode=‘zeros’,如果设置了 padding,填充模式。默认为 zeros,即填充0。
  • device=None
  • dtype=None)

一般只设置前五个参数



代码示例

import torch
import torch.nn.functional as Ft1 = torch.Tensor([[1, 2, 0, 3, 1], [0, 1, 2, 3, 1],[1, 2, 1, 0, 0],[5, 2, 3, 1, 1],[2, 1, 0, 1, 1], ])kernel = torch.Tensor([[1, 2, 1],[0, 1, 0],[2, 1, 0]
])
t1.shape, kernel.shape
# (torch.Size([5, 5]), torch.Size([3, 3]))# channel 和 batch_size 为 1
ip = torch.reshape(t1, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
ip.shape, kernel.shape
# (torch.Size([1, 1, 5, 5]), torch.Size([1, 1, 3, 3]))op = F.conv2d(ip, kernel, stride=1) 
op, op.shape 
'''
(tensor([[[[10., 12., 12.],[18., 16., 16.],[13.,  9.,  3.]]]]),torch.Size([1, 1, 3, 3]))
'''# 不同 stride
op = F.conv2d(ip, kernel, stride=2) 
op, op.shape 
'''
(tensor([[[[10., 12.],[13.,  3.]]]]),torch.Size([1, 1, 2, 2]))
'''# 增加 padding
op = F.conv2d(ip, kernel, stride=2, padding=1) 
op, op.shape 
'''
(tensor([[[[ 1.,  4.,  8.],[ 7., 16.,  8.],[14.,  9.,  4.]]]]),torch.Size([1, 1, 3, 3]))
'''

MaxPool2d

池化的目的是保留特征,减少数据量;
最大池化也被称为 下采样;
另外池化操作是分别应用到每一个深度切片层。输出深度 与 输入的深度 相同。


计算

  • 输入宽高深:H_i,W_i, D_i
  • 滤波器宽高:f_w, f_h
  • S: stride,步长

输出为:
H_o = (H_i - f_h)/S + 1
W_o = (W_i - f_w)/S + 1
D_o = D_i


输入维度是 4x4x5 (HxWxD)
滤波器大小 2x2 (HxW)
stride 的高和宽都是 2 (S)


在这里插入图片描述


函数说明

  • 官方说明
    https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html#torch.nn.MaxPool2d

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

  • ceil_mode,超出范围时是否计算

代码实现

import torch
import torch.nn as nn# MaxPool2d 函数 input 需要是 4维
ip = torch.reshape(t1, (-1, 1, 5, 5))class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.maxpool = nn.MaxPool2d(kernel_size=3, ceil_mode=True)
#         self.maxpool = nn.MaxPool2d(kernel_size=3, ceil_mode=False)def forward(self, input):output = self.maxpool(input)return outputnet = Net()
ret = net(ip)
ret# tensor([[[[2., 3.], [5., 1.]]]])  # ceil_mode=True
# tensor([[[[2.]]]])  # ceil_mode=False

数据集中调用

import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdata_path = '/xxxx/cifar10'
datasets = torchvision.datasets.CIFAR10(data_path, train=False, download=True, transform=torchvision.transforms.ToTensor())data_loader = DataLoader(datasets, batch_size=64)class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.maxpool1 = nn.MaxPool2d(kernel_size=3, ceil_mode=False)
#         self.maxpool = nn.MaxPool2d(kernel_size=3, ceil_mode=False)def forward(self, input):output = self.maxpool1(input)return outputwriter = SummaryWriter('logs_maxpool1')
step = 0
net = Net()
for data in data_loader:imgs, targets = datawriter.add_images('input', imgs, step)output = net(imgs) writer.add_images('output', output, step)step = step + 1writer.close() 
  • 启动 tensorboard:
tensorboard --logdir=logs_maxpool1 


卷积过程动画

图片来自:https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md

Transposed convolution animations


No padding, no strides
请添加图片描述


Arbitrary padding, no strides

请添加图片描述


Half padding, no strides
请添加图片描述


Full padding, no strides

请添加图片描述


No padding, strides

请添加图片描述


Padding, strides

请添加图片描述


Padding, strides (odd)

请添加图片描述


Transposed convolution animations


No padding, no strides, transposed

请添加图片描述


Arbitrary padding, no strides, transposed

请添加图片描述


Half padding, no strides, transposed

请添加图片描述


Full padding, no strides, transposed

请添加图片描述


No padding, strides, transposed
请添加图片描述


Padding, strides, transposed
请添加图片描述


Padding, strides, transposed (odd)

请添加图片描述

http://www.lryc.cn/news/11831.html

相关文章:

  • leetcode Day2(昨天实习有点bug,心态要崩了)
  • 另一种思考:为什么不选JPA、MyBatis,而选择JDBCTemplate
  • LeetCode 338. 比特位计数
  • 排序评估指标——NDCG和MAP
  • [Android Studio] Android Studio Virtual Device(AVD)虚拟机的功能试用
  • kafka-3-kafka应用的核心要点和内外网访问
  • VS2017+OpenCV4.5.5 决策树-评估是否发放贷款
  • Prometheus 记录规则和警报规则
  • (API)接口测试的关键技术
  • 快速排序算法原理 Quicksort —— 图解(精讲) JAVA
  • linux环境搭建私有gitlab仓库
  • SpringSecurity授权
  • 学习 Python 之 Pygame 开发坦克大战(一)
  • 2.5|iot冯|方元-嵌入式linux系统开发入门|2.13+2.18
  • 一起Talk Android吧(第四百九十六回:自定义View实例二:环形进度条)
  • 上传图片尺寸校验
  • 【Python】缺失值处理和拉格朗日插值法(含源代码实现)
  • SpringCloudAlibaba-Sentinel
  • 【程序化天空盒】过程记录02:云扰动 边缘光 消散效果
  • 链表OJ(三) 反转链表合集
  • SQLSERVER2019安装步骤过程
  • Java模块化概述
  • Connext DDSPersistence Service持久性服务(2)
  • MongoDB
  • python 迭代器生成器
  • Iceberg基于Spark MergeInto语法实现数据的增量写入
  • JavaScript Array(数组) 对象
  • Debian如何更换apt源
  • Connext DDSPersistence Service持久性服务
  • 自抗扰控制ADRC之微分器TD