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

news2025/6/7 15:12:16

最大池化层

  • 最大池化,也叫上采样,是池化核在输入图像上不断移动,并取对应区域中的最大值,目的是:在保留输入特征的同时,减小输入数据量,加快训练。
  • 参数设置如下:
    • 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,为了防止过拟合
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四、DMSP/OLS等夜间灯光数据贫困地区识别——相对误差相关折线图制作

一、前言 前文对于MPI和灯光指数拟合、误差分析,本文重点介绍地理加权分析,但是在此之前给大家介绍一下专业表格制作,其实专业的软件有很多像Orgin、棱镜等,到我们熟知的Excel,其实各有千秋,Excel入手容易…

【漏洞复现】锐捷网络NBR700G 信息泄露

0x01 产品简介 锐捷网络NBR700G路由器是锐捷网络股份有限公司的一款无线路由设备。 0x02 漏洞概述 锐捷网络NBR700G路由器存在信息漏洞。未授权的攻击者可以通过该漏洞获取敏感信息。 0x03 测绘语句 fofa:body"系统负荷过高,导致网络拥塞&…

H12-821_146

146.某IS-IS的组网图如图所示,根据图中内容分析,以下描述中错误的是哪一项? A.R1设备Level-1的LSDB只包含本区域的路由信息 B.R2和R1形成Leve1-1邻接关系,R2和R4形成Leve1-2邻接关系 C.R1可以通过R2或者R3访问R4 D.R6设备Level-2的LSDB只包含…

会声会影是什么软件?视频剪辑软件对比 会声会影和premiere哪个好 会声会影2024 会声会影下载安装

视频编辑软件已经成为了现代社会中不可或缺的一部分,特别是在新媒体时代,视频制作越来越受到人们的欢迎。而在众多的视频编辑软件中,会声会影和PR是两个非常受欢迎的软件。那么,会声会影和PR哪个更好呢?本文将从多个角…

网络编程套接字(3)——Java数据报套接字(UDP协议)

目录 一、Java数据报套接字通信模型 二、UDP数据报套接字编程 1、DatagramSocket (1)DatagramSocket构造方法 (2)DatagramSocket方法 2、DatagramPacket (1)DatagramPacket构造方法 (2&…

探索React中的类组件和函数组件

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Netty Review - 探究Netty服务端主程序无异常退出的背后机制

文章目录 概述故障场景尝试改进问题分析铺垫: Daemon线程Netty服务端启动源码分析逻辑分析 如何避免Netty服务端意外退出最佳实践 概述 在使用Netty进行服务端程序开发时,初学者可能会遇到各种问题,其中之一就是服务端意外退出的问题。这种问…

真实案例分享:MOS管电源开关电路,遇到上电冲击电流超标

做硬件,堆经验。 分享一个案例:MOS管电源开关电路,遇到上电冲击电流超标,怎么解决的呢? 下面是正文部分。 —— 正文 —— 最近有一颗用了挺久的MOSFET发了停产通知,供应链部门找到我们研发部门&#xff0c…

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记10 - STM32的SDIO学习2

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记10 - STM32的SDIO学习2 一、问题回顾二、本次的任务三、 需要注意的问题3.1 Card Identification Mode时的时钟频率3.2 CMD0指令的疑似问题3.3 发送带参数的ACMD41时要注意时间时序和时效3.4 CPSM的指令发送问题3.5 调试过程中的SD卡的…

伪分布Hadoop的安装与部署

1.实训目标 (1)熟悉掌握使用在Linux下安装JDK。 (2)熟悉掌握使用在Linux下安装Hadoop。 (3)熟悉掌握使用配置SSH免密登录。 2.实训环境与软件 环境 版本 说明 Windows 10系统 64位 操作电脑配置 …

【ENVI精讲】处理专题五:基于像元二分模型的植被覆盖度反演

一、专题概述 植被覆盖度是指植被(包括叶、茎、枝)在地面的垂直投影面积占统计区总面积的百分比。植被覆盖度常用于植被变化、生态环境研究、水土保持、气候等方面。植被覆盖度数据来源于地理遥感生态网平台。 二、像元二分法模型 像元二分模型是一种…

什么是自动化测试?什么情况下使用?

什么是自动化测试? 自动化测试是指把以人为驱动的测试行为转化为机器执行的过程。实际上自动化测试往往通过一些测试工具或框架,编写自动化测试脚本,来模拟手工测试过程。比如说,在项目迭代过程中,持续的回归测试是一项非常枯燥…

蓝桥集训之序列

蓝桥集训之序列 核心思想&#xff1a;多路归并 每次将两个序列合并 –> 两序列n2个和中最小的n个 构成新序列 第一行都是加b1 每次在最外面的元素中取最小(优先队列) #include<iostream>#include<algorithm>#include<cstring>#include<queue>#incl…

ChatGPT 控制机器人的基本框架

过去的一年&#xff0c;OpenAI的chatGPT将自然语言的大型语言模型&#xff08;LLM&#xff09;推向了公众的视野&#xff0c;人工智能AI如一夜春风吹遍了巴黎&#xff0c;全世界都为AI而疯狂。 OpenAI ChatGPT是一个使用人类反馈进行微调的预训练生成文本模型。不像以前的模型主…

LoadBalancer (本地负载均衡)

1.loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 Nginx是服务器负载均衡&#xff0c;客户端所有请求都会交给nginx&#xff0c;然后由nginx实现转发请求&#xff0c;即负载均衡是由服务端实现的。 loadbalancer本地负载均衡&#xff0c;在调用微服务接口时候&a…

云计算项目十一:构建完整的日志分析平台

检查k8s集群环境&#xff0c;master主机操作&#xff0c;确定是ready 启动harbor [rootharbor ~]# cd /usr/local/harbor [rootharbor harbor]# /usr/local/bin/docker-compose up -d 检查head插件是否启动&#xff0c;如果没有&#xff0c;需要启动 [rootes-0001 ~]# system…

VARMA(Vector Auto Regressive Moving Average) in Time Series Modelling

what is VARMA? ARIMA是针对单一变量进行建模的方法,当我们需要进行多变量时序建模时,需要使用VAR and VMA and VARMA模型。 VAR:Vector Auto-Regressive,a generalization of the auto-regressive model for multivariate time series where the time series is station…

【重新定义matlab强大系列十七】Matlab深入浅出长短期记忆神经网络LSTM

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

音视频按照时长分类小工具

应某用户的需求&#xff0c;编写了这款根据音视频时长分类小工具。 实际效果如下&#xff1a; 显示的是时分秒&#xff1a; 核心代码&#xff1a; MediaInfo MI; if (MI.Open(strPathInput.c_str()) 0){return -1;}_tstring stDuration MI.Get(stream_t::Stream_Audio,0,_T…

【Flink】Flink 的八种分区策略(源码解读)

Flink 的八种分区策略&#xff08;源码解读&#xff09; 1.继承关系图1.1 接口&#xff1a;ChannelSelector1.2 抽象类&#xff1a;StreamPartitioner1.3 继承关系图 2.分区策略2.1 GlobalPartitioner2.2 ShufflePartitioner2.3 BroadcastPartitioner2.4 RebalancePartitioner2…