Pytorch学习 day04(Totensor、Normalize、Resize、Compose)

news2024/11/19 7:46:50

Totensor

  • 把一个PIL格式的图片,或者ndarray格式的图片转换为tensor格式
  • 使用方法,如下:
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

img = Image.open("images/0013035.jpg")  #打开一张图片
print(img)

writer = SummaryWriter("logs")  #创建一个writer对象

trans_tensor = transforms.ToTensor()    #创建一个ToTensor对象
img_tensor = trans_tensor(img)  #使用__call__方法,将PIL 转换为tensor
writer.add_image("Totensor", img_tensor)    #将tensor添加到writer对象中,就可以用tensorboard展示图象

writer.close()

在这里插入图片描述

Normalize

  • 根据它的平均值和标准差来标准化一个tensor格式的图片,由于通常是RGB图片,所以信道数为3,传入三个平均值和标准差即可
  • 传入的平均值和标准差需要是以序列的格式
  • 计算公式如下:
    在这里插入图片描述
  • 代码如下:
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

img = Image.open("images/0013035.jpg")  #打开一张图片
print(img)

writer = SummaryWriter("logs")  #创建一个writer对象

# Totensor
trans_tensor = transforms.ToTensor()    #创建一个ToTensor对象
img_tensor = trans_tensor(img)  #使用__call__方法,将PIL 转换为tensor
writer.add_image("Totensor", img_tensor)    #将tensor添加到writer对象中,就可以用tensorboard展示图象

# Normalize
trans_normal = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])  #创建一个Normalize对象
img_normal = trans_normal.forward(img_tensor)  #使用forward方法,将tensor进行标准化
writer.add_image("Normalize", img_normal)  #将标准化的tensor添加到writer
writer.close()
  • 结果如下:
    在这里插入图片描述

Resize

  • 将PIL或Tensor格式的输入图片,调整为指定的尺寸,并使用forward()函数返回对应格式的图片,如下:
  • 传入的尺寸需要是以序列的格式
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

img = Image.open("images/0013035.jpg")  #打开一张图片
print(img)

writer = SummaryWriter("logs")  #创建一个writer对象

# Totensor
trans_tensor = transforms.ToTensor()    #创建一个ToTensor对象
img_tensor = trans_tensor(img)  #使用__call__方法,将PIL 转换为tensor

# Resize
print(img.size)  #打印原图的尺寸
trans_resize = transforms.Resize((100, 100))
# img PIL -> Resize -> img_resize PIL
img_resize = trans_resize.forward(img)  #使用forward方法,将图像进行缩放
print(img_resize.size)   #打印PIL格式缩放后的尺寸
# img_resize PIL -> ToTensor -> img_resize tensor
img_resize = trans_tensor(img_resize)   #将PIL转换为tensor
print(img_resize.size())   #打印tensor格式缩放后的尺寸
writer.add_image("Resize", img_resize)   #将缩放后的tensor添加到writer
writer.close()
  • 结果如下:
    在这里插入图片描述

Compose

  • 将多个transforms工具组合在一起,方便使用,相当于循环调用多个transforms工具,并把上一个输出传给下一个,当作输入
  • 注意传入列表的第一个工具的输出格式要满足第二个的输入格式
  • 代码如下:
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

img = Image.open("images/0013035.jpg")  #打开一张图片
print(img)

writer = SummaryWriter("logs")  #创建一个writer对象

# Totensor
trans_tensor = transforms.ToTensor()    #创建一个ToTensor对象
img_tensor = trans_tensor(img)  #使用__call__方法,将PIL 转换为tensor
writer.add_image("Totensor", img_tensor)    #将tensor添加到writer对象中,就可以用tensorboard展示图象

# Compose
trans_resize_2 = transforms.Resize(800)
# PIL -> PIL -> Tensor
trans_compose = transforms.Compose((trans_resize_2, trans_tensor))  
img_compose = trans_compose(img)    #使用__call__方法,通过compose结合两个转换方法,将PIL转换为tensor
writer.add_image("Compose", img_compose)
  • 注意:虽然Resize类中没有定义 _ _ call _ 方法,但是Resize继承自Module类,而Module类定义了 _ call _ 方法,因此当我们将resize对象作为一个函数调用时,python会在本身及其父类中寻找 _ call _ 方法, 因此这里可以正常调用,同时Module类的 _ call _ _方法和Raize类的forward()方法的基本实现如下:
class Module:
    def __call__(self, *inputs, **kwargs):
        # 在调用模型实例时,会调用forward方法
        return self.forward(*inputs, **kwargs)

    def forward(self, *inputs, **kwargs):
        # 在子类中实现具体的前向传播逻辑
        raise NotImplementedError
 
class Rasize:
    def forward(self, img):
        """
        Args:
            img (PIL Image or Tensor): Image to be scaled.

        Returns:
            PIL Image or Tensor: Rescaled image.
        """
        return F.resize(img, self.size, self.interpolation, self.max_size, self.antialias)
  • 因此当我们将resize对象作为一个函数调用时,实际上调用的是它的forward方法。
  • 结果如下:
    在这里插入图片描述

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

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

相关文章

算法——滑动窗口之找到字符串中所有的字母异位词,串联所有单词的子串

6.找到字符串中所有的字母异位词 题目:. - 力扣(LeetCode) 6.1如何快速判断两个字符串是否是异位词 假设现在有s1 aabca,s2 abaca,那么这两个就是异位词,容易想到的判断方法就是将两个字符串按照字典序排序,再依次比较,但是时间复杂度很高;我们看看…

python并发编程:IO模型比较分析

blocking和non-blocking的区别在哪,synchronous IO和asynchronous IO的区别在哪。 blocking vs non-blocking:调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还准备数据的情况下会立刻返回。 synchronous …

【R语言爬虫实战】抓取省市级城市常务会议内容

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

mysql如何开启手动提交事务

在mysql中,有一个变量autocommit,表示自动提交,默认为1,表示开启自动提交。通过以下命令查询 select autocommit;当autocommit为1时,任何一条sql语句都是一个事务,执行完由mysql自动提交。如果想自己决定什…

OS-Copilot:实现具有自我完善能力的通用计算机智能体

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ AI 缩小了人类间的知识和技术差距 论文标题:OS-Copilot: Towards Generalist Computer Agents with Self-Improvement 论文链接:https://arxiv.org/abs/2402.07456 项目主页&a…

32单片机基础:输入捕获测频率

接线图如下图所示: 我们复制之前写过的代码6-3 PWM驱动LED呼吸灯 在PWM模块中,执行的逻辑是,初始化TIM2的通道1,产生一个PWM波形,输出引脚是PA0,通过SetCompare1的函数,可以调节CCR1寄存器的值…

Memcached的重要性,如果防范Memcached DDOS攻击

一、Memcached简要 Memcached是一个开源的、高性能的、分布式内存对象缓存系统。它的主要目的是通过降低对数据库的访问来加速动态Web应用程序。 Memcached的用途非常广泛,它主要用于动态Web应用以减轻数据库负载。通过在内存中缓存数据和对象,Memcach…

pytorch_神经网络构建6

文章目录 强化学习概念实现qLearning基于这个思路,那么解决这个问题的代码如下 强化学习概念 强化学习有一个非常直观的表现,就是从出发点到目标之间存在着一个连续的状态转换,比如说从状态一到状态456,而每一个状态都有多种的行为&#xff…

2024/3/10 P1601高精加法

起因是本人在一个为数不多空闲的下午刷题ing&#xff0c;看到了AB problem。“就这&#xff1f;”从而忽略了高精这俩字&#xff0c;然后喜提40分。 于是开始研究何为高精。 #include<iostream> #include<string.h> #include<cstring>using namespace std; c…

数据结构与算法:链式二叉树

上一篇文章我们结束了二叉树的顺序存储&#xff0c;本届内容我们来到二叉树的链式存储&#xff01; 链式二叉树 1.链式二叉树的遍历1.1二叉树的前序&#xff0c;中序&#xff0c;后序遍历1.2 三种遍历方法代码实现 2. 获取相关个数2.1获取节点个数2.2获取叶节点个数2.3 获取树的…

代码随想录算法训练营第day14|二叉树理论基础、二叉树递归遍历、二叉树迭代遍历

目录 a.二叉树理论基础 b.二叉树递归遍历 c.二叉树迭代遍历 迭代法前序遍历 迭代法中序遍历 # 迭代法后序遍历 a.二叉树理论基础 在我们解题过程中二叉树有两种主要的形式&#xff1a;满二叉树和完全二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的…

Mysql 死锁案例1-记录锁读写冲突

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10) 事务1事务2T1 START…

Java学习笔记------拼图游戏

图形化界面GUI GUI&#xff1a;Graphical User Interface&#xff08;图像用户接口&#xff09;&#xff0c;指采用图形化的方式显示操作界面 两套体系&#xff1a;AWT包中和Swing包中 组件 JFrame&#xff1a;最外层的窗体 JMenuBar&#xff1a;最上层菜单 JLaber&#…

【软考】图的遍历

目录 1. 概念2. 深度优先搜索2.1 说明2.2 步骤 3. 深度优先搜索例子3.1 无向图3.2 代码示例3.3 结果示例3.4 过程 4. 广度优先搜索4.1 说明4.2 步骤 5. 广度优先搜索例子5.1 无向图5.2 代码示例5.3 结果示例5.4 过程5.5 例题5.5.1 题目1 1. 概念 1.图的遍历是指从某个顶点出发…

递增三元组 刷题笔记

题意为 若存在 a中的数小于b中的数&#xff0c;b中的数小于c中的数 则该数算一种方案 思路 暴力模拟优化 两层循环遍历即可 从b到c的过程我们发现 第三层并不需要循环 直接加上 大于b的数量即可 那么第一层和第三层是对称的 我们有没有可能再去掉一层循环 只做一次遍历 …

Spring boot2.7整合jetcache 本地linkedhashmap缓存方案

好 上文 Spring boot2.7整合jetcache 远程redis缓存方案 我们讲完了 远程实现方案 本文 我们来说说 本地 jetcache解决方案 首先是 application.yml 在jetcache下加上 local:default:type: linkedhashmapkeyConvertor: fastjson我们技术用的 本地缓存 linkedhashmap 这里 我们…

netty草图笔记

学一遍根本记不住&#xff0c;那就再学一遍 public static void test_nettyFuture() {NioEventLoopGroup group new NioEventLoopGroup();log.info("开始提交任务");Future<String> future group.next().submit(() -> {log.info("执行异步任…

DualSPHysics使用FlowTool工具进行后处理,定义的粒子全在domains外,解决办法

可以知道DualSPHysics官方给了后处理工具使用的示例&#xff0c;如下就是官方给的案例&#xff0c;使用FlowTool工具可以计算出在两个实体domain内的粒子数。 然而我自己也定义了2个domains&#xff0c;但是计算出来Tank1和Tank2里边的粒子数一直是空的&#xff0c;粒子全部在…

微服务系列(一)springcloudAlibaba之Nacos注册和配置中心及openFeign远程调用

一&#xff0c;认识微服务 我们先看看开发大型项目采用单体架构存在哪些问题&#xff0c;而微服务架构又是如何解决这些问题的。 1.1 单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署…

数学建模【时间序列】

一、时间序列简介 时间序列也称动态序列&#xff0c;是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分&#xff0c;分别是描述过去、分析规律和预测未来&#xff0c;本篇将主要介绍时间序列分析中常用的三种模型&#xff1a;季节分解…