Pytorch学习 day08(最大池化层、非线性激活层、正则化层、循环层、Transformer层、线性层、Dropout层)

本文主要是介绍Pytorch学习 day08(最大池化层、非线性激活层、正则化层、循环层、Transformer层、线性层、Dropout层),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最大池化层

  • 最大池化,也叫上采样,是池化核在输入图像上不断移动,并取对应区域中的最大值,目的是:在保留输入特征的同时,减小输入数据量,加快训练。
  • 参数设置如下:
    • kernel_size:池化核的高宽(整数或元组),整数时表示高宽都为该整数,元组时表示分别在水平和垂直方向上的长度。
    • stride:池化核每次移动的步长(整数或元组),整数时表示在水平和垂直方向上使用相同的步长。元组时分别表示在水平和垂直方向上的步长。默认为池化核的高宽。
    • padding:控制在输入张量的边界周围添加的零填充的数量(为整数或元组),如果是整数,表示在水平和垂直方向上使用相同的填充数量。如果是元组,分别表示在水平和垂直方向上的填充数量。默认为0
    • dilation:卷积核内部元素之间的距离,空洞卷积,如图:
      在这里插入图片描述
    • ceil_mode:True表示ceil模式,即向上取整,保留未满部分。False表示floor模式,即向下取整,舍去未满部分。默认为False,如图:
      在这里插入图片描述
    • 如下是示意图:
      在这里插入图片描述
  • 以下是代码实现:
    • 注意:部分版本的MaxPool2d不支持int类型,所以需要指定数据类型为浮点数
import torchinput = 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]], dtype=torch.float32)  # 由于部分版本的MaxPool2d不支持int类型,所以这里需要指定数据类型为float32  input = torch.reshape(input, (-1, 1, 5, 5)) # 将input从二维张量变成(N, C, H, W)的四维张量
print(input.shape)class Tudui(torch.nn.Module):def __init__(self):super().__init__()self.pool1 = torch.nn.MaxPool2d(kernel_size=3, ceil_mode=True)  # 最大池化层,池化核大小3*3,向上取整def forward(self, input):output = self.pool1(input)return outputtudui = Tudui()
output = tudui(input)
print(output)# 输出结果为
# torch.Size([1, 1, 5, 5])
# tensor([[[[2., 3.],
#           [5., 1.]]]])
  • 同样可以通过tensorboard进行展示输入输出结果,代码如下:
    • 由于最大池化层不会改变channel,所以不需要对输出进行reshape()操作
import torch
import torchvision
from torch.utils.tensorboard import SummaryWritertest_dataset = torchvision.datasets.CIFAR10(root='Dataset', train=False, download=True, transform=torchvision.transforms.ToTensor())
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=4, shuffle=False, num_workers=0)class Tudui(torch.nn.Module):def __init__(self):super().__init__()self.pool1 = torch.nn.MaxPool2d(kernel_size=3, ceil_mode=True)  # 最大池化层,池化核大小3*3,向上取整def forward(self, input):output = self.pool1(input)return outputtudui = Tudui()writer = SummaryWriter("logs")  # 创建一个SummaryWriter对象,指定日志文件保存路径
step = 0
for data in test_loader:imgs, targets = data    # 获取输入数据outputs = tudui(imgs)   # 调用网络模型进行前向传播writer.add_images("input", imgs, step)  # 将输入数据imgs写入日志文件# 由于最大池化层不会改变通道数,所以不需要对outputs进行reshape()操作writer.add_images("output", outputs, step)  # 将输出数据outputs写入日志文件step += 1writer.close()
  • 结果如下:
    在这里插入图片描述

非线性激活层

  • 主要目的是向网络中引入一些非线性特征,非线性越多,才能训练出符合复杂数据集的模型,提高模型的泛化性
  • 常用的非线性激活层有:ReLU、Sigmoid,如下:
    • ReLU:当输入大于0时,输出等于输入。当输入小于0时,输出等于0。

    • 注意:输入的第一个位置要是batch_size,之后的不做限制

    • inplace:是否对输入进行结果替换,默认为False(不替换),并返回输出
      在这里插入图片描述
      在这里插入图片描述

    • Sigmoid:将输入经过以下公式,得到输出。

    • 注意:第一个位置也要是batch_size,之后的不做限制:
      在这里插入图片描述

  • ReLU激活函数代码如下:
import torch
from torch import nninput = torch.tensor([[1, -0.5],[-1, 3]])
# 由于ReLU激活函数需要第一个维度为batch_size,所以需要对输入input进行reshape操作
input = torch.reshape(input, (-1, 1, 2, 2)) class Tudui(nn.Module):def __init__(self): # 初始化super().__init__()  # 继承父类的初始化self.relu1 = nn.ReLU()  # ReLU激活函数def forward(self, input):output = self.relu1(input)  # 调用ReLU激活函数对输入input进行激活return outputtudui = Tudui()
output = tudui(input)
print(output)# 输出结果:
# tensor([[[[1., 0.],
#           [0., 3.]]]])
  • Sigmoid激活函数代码如下:
import torch
import torchvision
from torch import nn
from torch.utils.tensorboard import SummaryWritertest_dataset = torchvision.datasets.CIFAR10(root='Dataset', train=False, download=True, transform=torchvision.transforms.ToTensor())
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False, num_workers=0)writer = SummaryWriter("logs")  # 创建一个SummaryWriter对象,指定日志文件保存路径
class Tudui(nn.Module):def __init__(self): # 初始化super().__init__()  # 继承父类的初始化self.sigmoid1 = nn.Sigmoid()  # Sigmoid激活函数def forward(self, input):output = self.sigmoid1(input)  # 调用Sigmoid激活函数return output
step = 0
for data in test_loader:imgs, targets = datatudui = Tudui() # 实例化网络模型writer.add_images("input", imgs, step)  # 将输入数据imgs写入日志文件outputs = tudui(imgs)   # 调用网络模型进行前向传播writer.add_images("output", outputs, step)  # 将输出数据outputs写入日志文件step += 1writer.close()  # 关闭日志文件
  • 结果如下:
    在这里插入图片描述

正则化层

  • 用的不是很多,但是有篇论文说,采用正则化层可以加快神经网络的训练速度,参数设置如下:
    • num_features:输入中的channel数
      在这里插入图片描述

循环层

  • 一种特定的网络结构,在文字识别中用的比较多
    在这里插入图片描述

Transform层

  • Pytorch把Transform封装成网络层
    在这里插入图片描述

线性层

  • 其作用是将输入的数据进行线性变换,即将输入数据乘以权重矩阵,并加上偏置向量,以生成输出数据,如下图所示,从x到g的过程就是经历了一个线性层:

    • 注意:线性层需要输入数据为一维,所以对于图像数据,我们先要进行拉直操作
    • 由下图可以看出:线性层会对每个输入元素进行kx+b的操作,而如果输入数据是一维的,那么只需要定义两个数组(权重数组、偏置数组)即可,虽然会丢失一些空间信息,但是简化了模型的实现和参数的管理,所以线性层需要输入数据为一维。
      在这里插入图片描述在这里插入图片描述
  • 以下是参数设置:

    • in_features:(可以有多位,但是最好满足是一维向量的形式,且最后一位是输入特征数,也可以只有一位,即只有输入特征数)输入特征数,即上图的x的个数d
    • out_features:输出特征数,即上图的g的个数L
    • bias:偏置,即上图的b,默认为True,即加一个偏置
      在这里插入图片描述
  • 代码实现如下:

    • 注意:由于我们定义的线性层的输入特征要是196608,所以我们要在test_loader中设置drop_last=True,如果我们不设置drop_last=True,最后一个batch的样本数不足64,输入特征不满足196608,就会报错
    • 可以使用reshape()对输入进行格式转换,同时由于输入可以仅仅只有输入特征数,所以flatten()也可以用来对输入进行格式转换
import torch
import torchvision
from torch import nn# input = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# print(input.shape)
# input = torch.reshape(input, (1,1,1,-1))
# print(input.shape)test_dataset = torchvision.datasets.CIFAR10(root='Dataset', train=False, download=True, transform=torchvision.transforms.ToTensor())
# 由于我们定义的线性层的输入特征要是196608,所以如果我们不设置drop_last=True,最后一个batch的样本数不足64,输入特征不满足196608,就会报错
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False, num_workers=0, drop_last=True)    # drop_last=True表示如果最后一个batch的样本数少于batch_size,则丢弃
class Tudui(nn.Module):def __init__(self):super().__init__()self.linear1 = nn.Linear(196608,3)  # 输入特征数为196608,输出特征数为3def forward(self, input):output = self.linear1(input)return outputtudui = Tudui()
for data in test_loader:imgs, targets = data# 可以使用torch.reshape()函数将输入数据imgs的shape从[64, 3, 32, 32]变为[1, 1, 1, 196608]# imgs = torch.reshape(imgs, (1,1,1,-1))  # 将输入数据imgs的shape从[64, 3, 32, 32]变为[1, 1, 1, 196608]# 也可以使用torch.flatten()函数将输入数据imgs的shape从[64, 3, 32, 32]变为[196608]imgs = torch.flatten(imgs) # 将输入数据imgs的shape从[64, 3, 32, 32]变为[196608]outputs = tudui(imgs)   # 得到输出,且输出的shape为[3]print(outputs.shape)

Dropout层

  • 在训练中,以一定概率将输入中的随机元素变成0,为了防止过拟合
    在这里插入图片描述

这篇关于Pytorch学习 day08(最大池化层、非线性激活层、正则化层、循环层、Transformer层、线性层、Dropout层)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793383

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Nginx部署React项目时重定向循环问题的解决方案

《Nginx部署React项目时重定向循环问题的解决方案》Nginx在处理React项目请求时出现重定向循环,通常是由于`try_files`配置错误或`root`路径配置不当导致的,本文给大家详细介... 目录问题原因1. try_files 配置错误2. root 路径错误解决方法1. 检查 try_f