Pytorch入门-Transforms

news2024/11/18 10:34:23

文章目录

  • Compose
  • ToTensor
  • Normalize
  • Resize

在PyTorch中,transforms是一个用于图像预处理和数据增强的模块,通常与torchvision库一起使用。torchvision提供了大量预先定义的transforms,它们可以方便地应用于图像数据,以进行预处理或增强。这些transforms对于训练和评估机器学习模型(尤其是深度学习模型)非常有用。

python中的call方法
在Python中,__call__ 是一个特殊方法,也被称为“魔法方法”或“双下划线方法”。当一个对象实例被当作函数一样调用时,Python会自动调用该对象的 __call__ 方法。这意味着你可以定义你自己的对象,使其能够被“调用”,就像调用一个函数一样。

class Person:
    def __call__(self,name):
        print("__call__"+"Hello"+name)

    def hello(self,name):
        print("hello"+name)

person = Person()
person("zhangsan")
person.hello("lisi")

image

class CallableClass:  
    def __init__(self, value):  
        self.value = value  
  
    def __call__(self, *args, **kwargs):  
        print(f"Called with {args} and {kwargs}")  
        return self.value  
  
# 创建一个实例  
obj = CallableClass(42)  
  
# 使用该实例,就像调用一个函数一样  
result = obj(1, 2, 3, a=4, b=5)  
  
print(result)  # 输出: 42

Compose

在PyTorch中,Compose是一个功能强大的工具,它允许你将多个转换(transforms)组合成一个单一的转换序列。这样,你就可以一次性地对数据进行一系列复杂的预处理操作。Compose通常与torchvision.transforms模块一起使用,该模块提供了许多预定义的转换函数。

from torchvision import transforms  
  
# 定义一系列的转换  
transform_sequence = transforms.Compose([  
    transform1,  
    transform2,  
    transform3,  
    # ...  
])  
  
# 然后你可以将这个转换序列应用于图像  
transformed_image = transform_sequence(image)
from torchvision import transforms  
from PIL import Image  
  
# 加载一张图像  
image = Image.open('path_to_image.jpg')  
  
# 定义转换序列  
transform = transforms.Compose([  
    transforms.Resize((256, 256)),  # 将图像大小调整为256x256  
    transforms.CenterCrop(224),     # 从中心裁剪出224x224的区域  
    transforms.ToTensor(),           # 将PIL图像或NumPy ndarray转换为torch.Tensor  
    transforms.Normalize(           # 对图像进行标准化  
        mean=[0.485, 0.456, 0.406], # 使用ImageNet数据集上的RGB通道的均值  
        std=[0.229, 0.224, 0.225]   # 使用ImageNet数据集上的RGB通道的标准差  
    )  
])  
  
# 应用转换序列到图像  
transformed_image = transform(image)

在这个例子中,我们首先使用Resize将图像大小调整为256x256,然后使用CenterCrop从中心裁剪出224x224的区域。接着,使用ToTensor将图像转换为PyTorch张量,最后使用Normalize对图像进行标准化处理。所有这些转换都被组合在一起,并通过一次调用transform(image)来应用。

ToTensor

image

这是transforms源码中的解释

在PyTorch中是一个常用的转换函数,用于将PIL Image或NumPy ndarray转换为torch.Tensor。但是,在转换过程中,它会自动将图像的像素值范围从[0, 255]缩放到[0.0, 1.0]。这通常是因为神经网络的输入通常期望在[0.0, 1.0]范围内。

from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("logs")
imge_path = "images/OIP.jpg"
imge = Image.open(imge_path)
trans_totensor = transforms.ToTensor()
# 这是就是call函数的调用
imge_tensor = trans_totensor(imge)

writer.add_image("ToTensor",imge_tensor)
writer.close()

Normalize

image
归一化公式:
o u t p u t [ c h a n n e l ] = ( i n p u t [ c h a n n e l ] − m e a n [ c h a n n e l ] ) s t d [ c h a n n e l ] output[channel] = \frac{(input[channel] - mean[channel])}{std[channel]} output[channel]=std[channel](input[channel]mean[channel])

from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("logs")
imge_path = "images/OIP.jpg"
imge = Image.open(imge_path)

# ToTensor
trans_totensor = transforms.ToTensor()
imge_tensor = trans_totensor(imge)
writer.add_image("ToTensor", imge_tensor)

print(imge_tensor[0][0][0])
# Normalize
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(imge_tensor)
print(img_norm[0][0][0])
writer.add_image("Norm",img_norm)


writer.close()

可以看出来归一化的结果还是有些不同的
image

Resize

# Resize
print(imge.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(imge)

print(img_resize)
img_resize=trans_totensor(img_resize)
writer.add_image("Resize",img_resize,0)

writer.close()

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

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

相关文章

strcpy的模拟实现

strcpy函数的定义: strcpy函数功能的解释: 会将源字符串中的 内容包括\0 拷贝到目标数组,所以源字符串必须以 \0 结束。 返回值为拷贝完成后的目标数组的首地址。 Const 是因为源字符串的内容不需要被修改,所以const最好。 strcpy…

程序员的三重境界:码农,高级码农、程序员!

见字如面,我是军哥! 掐指一算,我在 IT 行业摸爬滚打 19 年了,见过的程序员至少大好几千,然后真正能称上程序员不到 10% ,绝大部分都是高级码农而已。 今天和你聊聊程序员的三个境界的差异,文章不…

【DL经典回顾】激活函数大汇总列表(持续更新中...)

激活函数大汇总列表(持续更新中…) 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力…

Redirect相应重定向无法访问WEB-INF下的静态资源,可以跳到外部资源(比如www.baidu.com)

相应重定向无法访问WEB-INF目录下静态资源,WEB-INF目录下静态资源受保护。 访问外部资源 访问Servlet5.do,就跳到百度页面

14、Linux-Shell03:echo、printf和test命令

一、echo echo用于输出字符串 值得关注的地方 1、转义字符\。例如,echo "\"Hello,World\" is a classic sentence for programmer"。 2、read命令用于读取一行的输入,echo可以对输入进行输出 3、\n换行,\c不换行。需…

C编程基础四十分笔记

都是一些基础的C语言 一 输入一个整数,计算这个整数有几位二 编写程序计算一个分布函数三 输入一个字符串,再随便输入一个字母,判断这个字母出现几次四 求 1到10的阶乘之和五 求一个球体体积六 写一个链表,存1,2&#…

网络安全等级测评师考试培训可以参考哪些资料?

网络安全是国家安全的重要组成部分,也是企业安全的重中之重;而网络安全等级测评师则是守护这一安全领域的重要力量。所以专业的网络安全等级测评师是非常重要。作为专业的网络安全等保测评师,他们肩负着对信息系统进行安全评估、发现潜在风险…

系列五十六、如何下载历史版本的Maven?

一、如何下载历史版本的Maven? 1、Maven官网 https://maven.apache.org/download.cgi2、找到Other Releases选项# Maven 3 archives对应的链接url 3、https://archive.apache.org/dist/maven/maven-3/

【Swing】Java Swing实现省市区选择编辑器

【Swing】Java Swing实现省市区选择编辑器 1.需求描述2.需求实现3.效果展示 系统:Win10 JDK:1.8.0_351 IDEA:2022.3.3 1.需求描述 在公司的一个 Swing 的项目上需要实现一个选择省市区的编辑器,这还是第一次做这种编辑器&#xf…

python--类与面向对象-2

一、对象在文本中的输出 class Person: def __init__(self,name,agg,live_value,money): self.namename self.aggagg self.live_valuelive_value self.moneymoney def describe(): print(%s的攻击力是%s%(self.name,self.agg)) pPerson(bob,10,10000,100) bPerson(tony,…

Python之装饰器

一:作用 在函数名以及函数体不改变的前提下,给一个函数附加一些额外代码 二、语法 三、举例子 两个功能函数 test1, test2 遵循 “开放封闭原则”, 已经写好的代码,尽可能不要修改。 如果想要新增功能,…

YOLOv5目标检测学习(5):源码解析之:推理部分dectet.py

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、导入相关包与路径、模块配置1.1 导入相关的python包1.2 获取当前文件的相对路径1.3 加载自定义模块1.4 总结 二、执行主体的main函数所以执行推理代码&…

Linux中YUM仓库的配置

Linux软件包的管理 YUM仓库是什么YUM的常用命令修改YUM源其实CentOS7已经对YUM做了优化 YUM仓库是什么 之前传统RPM的管理方式 可以简单理解为写Java的时候不用Maven管理 jar包都要自己手动去导入 去下载 但是配置好YUM仓库 就放佛在用Maven管理Java项目 基于RPM包管理 能够从…

temu英国电商市场洞察:2月份商品销售数据分析Python数据采集Api

文章目录 引言可视化分析数据展示商品类目占比分析销售额分析价格区间占比分析各类目新品占比分析 写在最后 引言 在美国市场稳步增长基础上,Temu也不断加快全球步伐,现已进入47个国家,光23年9月份就进驻了10个国家,创造单月扩张国…

Redis底层数据结构之Hash

文章目录 1. Redis底层hash编码格式2. Redis 6源码分析3. Redis 7源码分析 1. Redis底层hash编码格式 在redis6中hash的编码格式分别是ziplist(压缩列表)和hashtable,但在redis7中hash的编码格式变为了listpack(紧凑列表&#xf…

HADOOP完全分布式搭建(饭制版)

HADOOP完全分布式搭建(饭制版) 1.虚拟机安装 安装系统 点击VMware Workstation左上角文件,新建虚拟机 选择自定义,点击下一步 点击下一步 选择稍后安装操作系统(后续我们使用的操作系统为CentOS7),点击…

解决vue2+elementUI的下拉框出现自动校验的问题

问题: 总结原因是因为新增的时候,传了空值进去 可以这样子解决 this.formData.value && this.$set(this.model, this.formData.key, this.formData.value)这种是只有值存在的时候才会给他赋值,但是这只解决单选下拉框,…

SQLiteC/C++接口详细介绍之sqlite3类(五)

快速跳转文章列表:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(四) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(六)(未发表) 14.sqlite3_busy_handle…

【STL】string各种函数的应用

1.string 基本赋值操作 string assign(string str,int n) string assign(string str,int pos,int n) 2.string存取字符操作 (at()) 注意:[ ]越界不会抛出异常,at越界会抛出异常 3.string拼接…

从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型1

文章灵感来源于MATLAB官方免费教程:HDL Coder Self-Guided Tutorial 考虑到MATLAB官网的英文看着慢,再加上视频讲解老印浓浓的咖喱味,我决定记录利用MATLAB&Simulink&SystemGenerator进行FPGA数字信号处理的学习过程。 在进行数字信…