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

最大池化层

  • 最大池化,也叫上采样,是池化核在输入图像上不断移动,并取对应区域中的最大值,目的是:在保留输入特征的同时,减小输入数据量,加快训练。
  • 参数设置如下:
    • kernel_size:池化核的高宽(整数或元组),整数时表示高宽都为该整数,元组时表示分别在水平和垂直方向上的长度。
    • stride:池化核每次移动的步长(整数或元组),整数时表示在水平和垂直方向上使用相同的步长。元组时分别表示在水平和垂直方向上的步长。默认为池化核的高宽。
    • padding:控制在输入张量的边界周围添加的零填充的数量(为整数或元组),如果是整数,表示在水平和垂直方向上使用相同的填充数量。如果是元组,分别表示在水平和垂直方向上的填充数量。默认为0
    • dilation:卷积核内部元素之间的距离,空洞卷积,如图:
      在这里插入图片描述
    • ceil_mode:True表示ceil模式,即向上取整,保留未满部分。False表示floor模式,即向下取整,舍去未满部分。默认为False,如图:
      在这里插入图片描述
    • 如下是示意图:
      在这里插入图片描述
  • 以下是代码实现:
    • 注意:部分版本的MaxPool2d不支持int类型,所以需要指定数据类型为浮点数
import torch

input = 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 output

tudui = 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 SummaryWriter

test_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 output

tudui = 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 += 1

writer.close()
  • 结果如下:
    在这里插入图片描述

非线性激活层

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

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

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

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

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

  • ReLU激活函数代码如下:
import torch
from torch import nn

input = 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 output

tudui = 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 SummaryWriter


test_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 = data
    tudui = Tudui() # 实例化网络模型
    writer.add_images("input", imgs, step)  # 将输入数据imgs写入日志文件
    outputs = tudui(imgs)   # 调用网络模型进行前向传播
    writer.add_images("output", outputs, step)  # 将输出数据outputs写入日志文件
    step += 1

writer.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,输出特征数为3

    def forward(self, input):
        output = self.linear1(input)
        return output

tudui = 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,为了防止过拟合
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/444310.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

类与对象-对象特性

师从黑马程序员 对象的初始化和清理 构造函数和析构函数 用于完成对象的初始化和清理工作 如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现 构造函数:主要用于创建对象时为对象的成员属性赋值,构造函数由编…

了解华为(PVID VLAN)与思科的(Native VLAN)本征VLAN的区别并学习思科网络中二层交换机的三层结构局域网VLAN配置

一、什么是二层交换机? 二层交换机(Layer 2 Switch)是一种网络设备,主要工作在OSI模型的数据链路层(第二层),用于在局域网内部进行数据包的交换和转发。二层交换机通过学习MAC地址表&#xff0…

毅速3D打印随形透气钢:模具困气排气革新之选

在注塑生产过程中,模具内的气体若无法有效排出,往往会引发困气现象,导致产品表面出现气泡、烧焦等瑕疵。这些瑕疵不仅影响产品的美观度,更可能对其性能造成严重影响,甚至导致产品报废,从而增加生产成本。 传…

政安晨:【深度学习处理实践】(四)—— 实施一个温度预测示例

在开始使用像黑盒子一样的深度学习模型解决温度预测问题之前,我们先尝试一种基于常识的简单方法。 它可以作为一种合理性检查,还可以建立一个基准,更高级的机器学习模型需要超越这个基准才能证明其有效性。对于一个尚没有已知解决方案的新问…

Linux之生产消费者模型

(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 我们在条件满足的时候,唤醒指定的线程&a…

超越Chain-of-Thought LLM 推理

原文地址:Beyond Chain-of-Thought LLM Reasoning 2024 年 2 月 13 日 介绍 最近的一项研究解决了需要增强大型语言模型 (LLM) 的推理能力,超越直接推理 (Direct Reasoning,DR) 框架,例如思想链和自我一致性,这些框架可…

分割模型TransNetR的pytorch代码学习笔记

这个模型在U-net的基础上融合了Transformer模块和残差网络的原理。 论文地址:https://arxiv.org/pdf/2303.07428.pdf 具体的网络结构如下: 网络的原理还是比较简单的, 编码分支用的是预训练的resnet模块,解码分支则重新设计了。…

HTML入门:属性

你好,我是云桃桃。今天来聊一聊 HTML 属性写法和特点。 HTML 属性是用于向 HTML 标签(也叫 HTML 元素)提供附加信息或配置的特性。 如果说,把HTML 标签比作一个房子,HTML 标签定义了房子的结构和用途,比如…

基于SpringBoot的闲置房屋搜索平台设计与实现

目 录 摘 要 I Abstract II 引 言 1 1相关技术 3 1.1 jQuery技术简介 3 1.2 SpringBoot框架简介 3 1.3 Bootstrap框架简介 4 1.4 ECharts框架简介 4 1.5 百度地图API简介 4 1.6 Ajax技术简介 5 1.7 MySQL数据库简介 5 1.8本章小结 6 2系统分析 7 2.1功能需求 7 2.2非功能需求 …

微软财务GPT Excel Copilot for Finance使用攻略

功能本身不收费,但是这个功能需要微软的商业版office账号才能使用,如果你没有账号,可以直说。 在桌面Excel软件中登录账号后,点击“copilot for finance”按钮,如果没有出现,则点击“加载项”,…

2024 年中国高校大数据挑战赛赛题 D:行业职业技术培训能力评价完整思路以及源代码分享

中国是制造业大国,产业门类齐全,每年需要培养大量的技能娴 熟的技术工人进入工厂。某行业在全国有多所不同类型(如国家级、 省级等)的职业技术培训学校,进行 5 种技能培训。学员入校时需要 进行统一的技能考核&#xf…

简述epoll实现

所有学习笔记:https://github.com/Dusongg/StudyNotes 文章目录 epoll数据结构的选择?以tcp为例,网络io的可读可写如何判断?epoll如何做到线程安全?LT和ET如何实现?tcp状态和io的读写有哪些关系&#xff1…

文本生成视频:从 Write-a-video到 Sora

2024年2月15日,OpenAI 推出了其最新的文本生成视频模型——Sora。Sora 能够根据用户的指令生成一分钟长度的高质量视频内容。这一创新的发布迅速在社会各界引发了广泛关注与深入讨论。本文将围绕本实验室发表于SIGGRAPH AISA 的 Write-a-video和 Sora 展开&#xff…

CPU设计实战-协处理器访问指令的实现

目录 一 协处理器的作用与功能 1.计数寄存器和比较寄存器 2.Status寄存器 3.Cause寄存器(标号为13) 4.EPC寄存器(标号为14) 5.PRId寄存器(标号为15) 6.Config 寄存器(标号为16)-配置寄存器 二 协处理器的实现 三 协处理器访问指令说明 四 具体实现 1.译码阶段 2.执行…

git命令行提交——github

1. 克隆仓库至本地 git clone 右键paste(github仓库地址) cd 仓库路径(进入到仓库内部准备提交文件等操作) 2. 查看main分支 git branch(列出本地仓库中的所有分支) 3. 创建新分支(可省…

Edu18 -- Divide by Three --- 题解

目录 Divide by Three: 题目大意: ​编辑​编辑思路解析: 代码实现: Divide by Three: 题目大意: 思路解析: 一个数字是3的倍数,那么他的数位之和也是3的倍数,所以我…

安信可IDE(AiThinker_IDE)编译ESP8266工程方法

0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE(AiThinker_IDE)编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK,将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面&#xff0c…

WiFi模块助力少儿编程:创新学习与实践体验

随着科技的飞速发展,少儿编程已经成为培养孩子们创造力和问题解决能力的重要途径之一。在这个过程中,WiFi模块的应用为少儿编程领域注入了新的活力,使得学习编程不再是单一的代码教学,而是一个充满创新与实践的综合性体验。 物联网…

Redis作为缓存的数据一致性问题

背景 使用Reids作为缓存的原因: 在高并发场景下,传统关系型数据库的并发能力相对比较薄弱(QPS不能太大); 使用Redis做一个缓存。让用户请求先打到Redis上而不是直接打到数据库上。 但是如果出现数据更新操作&#xff…

开发指南002-前后端信息交互规范-概述

前后端之间采用restful接口,服务和服务之间使用feign。信息交互遵循如下平台规范: 前端: 建立api目录,按照业务区分建立不同的.js文件,封装对后台的调用操作。其中qlm*.js为平台预制的接口文件,以qlm_user.…