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

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

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

相关文章

Linux网络基础2之协议

(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 1.协议 1.序列化与反序列换 2.协议定制 二…

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卡的…

linuxOPS基础_linux系统注意事项

Linux严格区分大小写 Linux 和Windows不同,Linux严格区分大小写的,包括文件名和目录名、命令、命令选项、配置文件设置选项等。 例如,Win7 系统桌面上有文件夹叫做Test,当我们在桌面上再新建一个名为 test 的文件夹时&#xff0c…

R统计学2 - 数据分析入门问题21-40

往期R统计学文章: R统计学1 - 基础操作入门问题1-20 21. 如何对矩阵按行 (列) 作计算? 使用函数 apply() vec 1:20 # 转换为矩阵 mat matrix (vec , ncol4) # [,1] [,2] [,3] [,4] # [1,] 1 6 11 16 # [2,] 2 7 12 17 # [3,] …

嵌入式Linux串口和 poll() 函数的使用

一、poll() 函数的介绍 poll() 函数用于监控多个文件描述符的变化的函数。它可以用来检查一个或多个文件描述符的状态是否改变,比如是否可读、可写或有错误发生。它常用于处理 I/O 多路复用,这在需要同时处理多个网络连接或文件操作时非常有用。 头文件…

CentOS 7.6安装部署Seafile服务器

今天飞飞和你们分享CentOS 7.6上安装基于MySQL/MariaDB的Seafile服务器的方法,包括下载和安装7.0.5版本、配置数据库、启动服务器等步骤。安装成功后,需要通过nginx反向代理才能访问seafile服务。 通过预编译好的安装包来安装并运行基于 MySQL/MariaDB …

高吞吐SFTP连接池设计方案

背景 在现代的数据驱动环境中,安全文件传输协议(SFTP)扮演着至关重要的角色,它提供了一种安全、可靠的文件传输方式。我们目前项目是一个大型数据集成平台,跟上下游有很多文件对接是通过SFTP协议,当需要处…

果蔬作物疾病防治系统|基于Springboot的果蔬作物疾病防治系统设计与实现(源码+数据库+文档)

果蔬作物疾病防治系统目录 目录 基于Springboot的果蔬作物疾病防治系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、果蔬百科列表 2、公告信息管理 3、公告类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

【蓝桥·算法双周赛】第七场分级赛——小白入门赛

2.霓虹【算法赛】 - 蓝桥云课 (lanqiao.cn) st数组用来存第i个位置&#xff0c;这个字母有没有编号j #include<bits/stdc.h> const int N1e610; using lllong long; std::map<std::string,std::string> mp;std::string a,aa; int st[N][10];// int stt[N][10];//对…

Qt 拖动事件

文章目录 1 自定义控件 TextEdit2 实现打开文件功能3 实现鼠标滚轮放大字体 QEvent::DragEnter 当拖动文件进入到窗口/控件中时&#xff0c;触发该事件&#xff0c;它对应的子类是QDragEnterEvent QEvent::DragLeave 当拖动文件离开窗口/控件时&#xff0c;触发该事件&#xff…

WordPress高端后台美化WP Adminify Pro优化版

后台UI美化WP Adminify Pro修改自定义插件&#xff0c;适合建站公司和个人使用&#xff0c;非常高大上&#xff0c;下载地址&#xff1a;WP Adminify Pro优化版 修复记录&#xff1a; 1、修复已知BUG 2、修复手机版兼容问题 3、修复打开速度&#xff0c;原版打开速度太慢 4…

自动裁剪人脸:简化你的数字人素材准备

在做数字人时,需要对采集的数据进行预处理,然后才能进行模型训练, 预处理常用的操作有:去背景 音频重采样 视频裁剪 音频特征提取等等,今天我们来分享一个自动化脚本: 对原图/视频进行人脸检测并根据目标尺寸以人脸为中心进行裁剪. 目录 1. 效果 2. 对图片进行裁剪 3.对视频…

DeepLearning in Pytorch|共享单车预测NN详解(思路+代码剖析)

目录 概要 一、代码概览 二、详解 基本逻辑 1.数据准备 2.设计神经网络 初版 改进版 测试 总结 概要 原文链接&#xff1a;DeepLearning in Pytorch|我的第一个NN-共享单车预测 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用…

umi4 项目使用 keepalive 缓存页面(umi-plugin-keep-alive、react-activation)

umi4使用keepalive 配置文件config\config.ts export default defineConfig({plugins: [umi-plugin-keep-alive], });安装add umi-plugin-keep-alive yarn add umi-plugin-keep-alive页面 A import { KeepAlive, history, useAliveController } from umijs/max; const Page…

CSAPP Malloc lab

CSAPP Malloc Lab 目标 实现一个简单的动态存储分配器。 评分标准 空间利用率应当减少internal 和 external fragmentation. memory utilization memory utilization payload / heap size fragmentation internal fragmentation external fragmentation throughput T 越接…

【深度学习笔记】6_9 深度循环神经网络deep-rnn

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.9 深度循环神经网络 本章到目前为止介绍的循环神经网络只有一个单向的隐藏层&#xff0c;在深度学习应用里&#xff0c;我们通常会用…

嵌入式Qt 制作一个登录对话框

一.登录对话框需求分析 二.代码实现 main.c&#xff1a; #include <QtGui/QApplication> #include "widget.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }Widget.h&#xff1a; #ifndef _WIDGET_H_…

为什么选择 Flink 做实时处理

优质博文&#xff1a;IT-BLOG-CN 为什么选择 Flink 【1】流数据更真实地反映了我们的生活方式&#xff08;实时聊天&#xff09;&#xff1b; 【2】传统的数据架构是基于有限数据集的&#xff08;Spark 是基于微批次数据处理&#xff09;&#xff1b; 【3】我们的目标&#xf…

ELK-介绍及Elasticsearch集群搭建

ELK是三个开源软件的缩写&#xff0c;分别为Elasticsearch、Logstash、kibana它们都是开源软件。后来新增了一个FileBeat&#xff0c;它是一个轻量及的日志收集处理工具&#xff0c;因为Logstash由java程序开发&#xff0c;比较消耗内存资源&#xff0c;后来将Logstash使用go语…

【论文阅读】(2024.03.05-2024.03.15)论文阅读简单记录和汇总

(2024.03.05-2024.03.15)论文阅读简单记录和汇总 2024/03/05&#xff1a;随便简单写写&#xff0c;以后不会把太详细的记录在CSDN&#xff0c;有道的Markdown又感觉不好用。 目录 &#xff08;ICMM 2024&#xff09;Quality Scalable Video Coding Based on Neural Represent…