当前位置: 首页 > backend >正文

transforms.Compose()

官方文档 : 点击跳转

作用

torchvision.transforms.Compose() 的作用是将多个图像转换操作组合在一起,它接受一个transforms列表作为参数,该列表包含要组合的转换操作,使用方式类似如下:

from torchvision.transforms import transforms
from PIL import Imagemy_transform = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])
original_img = Image.open("./image.jpg")
img = my_transform(original_img)
  • 上面例子中,我们让图像依次经过 RandomResizedCrop --> RandomHorizontalFlip --> ToTensor --> Normalize 的处理

  • 我们在生成 transforms.Compose() 的对象 my_transform 之后,直接调用 my_transform(original_img) 即可处理图像。 而一般类的使用,是需要用对象调用方法来实现功能的,比如: obj.add(a, b) 。 而我们可以直接调用my_transform对象,不需调用方法,直接将 参数(数据) 传给对象,就能实现图像处理的功能,这是因为 transforms.Compose 的内部使用了 __call__ 方法,我们继续先看下面的内部实现


内部实现

torchvision.transforms.Compose() 的内部实现如下:

class Compose(object):def __init__(self, transforms):self.transforms = transformsdef __call__(self, img):for t in self.transforms:img = t(img)return img
  • 还不了解 __call__ 方法的使用,请查看这里

  • 之后,在学习自定义 transforms的时候,是需要重写torchvision.transforms.Compose()的,就需要在上面的内部实现代码基础上,做一些修改。


拓展延伸

1、 为什么我们能直接调用 模型对象,并传入参数: model(input) ,就直接实现 forward 方法中的功能呢 ?为什么不需要调用 forward 方法呢 ?

nn.Module 类中,实现了__call__方法,然后,在 __call__ 方法中调用的 forward方法

def __call__(self, *input, **kwargs):return self.forward(*input, **kwargs)

所以,我们在生使用 model(input) 的时候,调用的是 nn.Module 类中的 __call__(input) 方法,然后在 __call__(input) 方法中,又调用的我们自己写的 forward 方法

2、torch.nn.Sequential()torchvision.transforms.Compose()的内部实现 以及使用方式是很类似的,都是将输入的一连串操作一个一个的迭代出来,并且按照顺序进行使用。

torch.nn.Sequential() 的内部实现:

class Sequential(Module):def __init__(self, *args):super(Sequential, self).__init__()if len(args) == 1 and isinstance(args[0], OrderedDict):for key, module in args[0].items():self.add_module(key, module)else:for idx, module in enumerate(args):self.add_module(str(idx), module)def forward(self, input):for module in self:input = module(input)return input

http://www.xdnf.cn/news/5861.html

相关文章:

  • ARFoundation 图片识别,切换图片克隆不同的追踪模型
  • Rodrigues旋转公式-绕任意轴旋转
  • Excel宏和VBA的详细分步指南
  • Linux系统:文件系统前言,详解CHSLBA地址
  • 如何创建maven项目
  • java之网络编程
  • uniapp(vue3)动态计算swiper高度封装自定义hook
  • SD-HOST Controller design-----SD CLK 设计
  • 深度学习之优化器【从梯度下降到自适应学习率算法】(pytorch版)
  • 华为鸿蒙电脑能否作为开发机?开发非鸿蒙应用?
  • 微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现
  • 销售具备的能力有哪些
  • JAVA研发+前后端分离,ZKmall开源商城B2C商城如何保障系统性能?
  • Python中元组(Tuple)使用详解和注意事项
  • Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别
  • 拓扑排序+dp
  • STM32-DMA数据转运(8)
  • 直接在Excel中用Python Matplotlib/Seaborn/Plotly......
  • Linux 内核网络协议栈:从 Socket 类型到协议注册的深度解析
  • 思迈特软件携手天阳科技,打造ChatBI金融智能分析新标杆
  • 适应性神经树:当深度学习遇上决策树的“生长法则”
  • Spring Boot 整合 Redis 实战
  • MySQL 事务(二)
  • 在 Qt Creator 中为 QDockWidget 设置隐藏和显示按钮
  • 中电金信参编的国家标准《信息技术 中间件 消息中间件技术要求》正式发布
  • 【爬虫】DrissionPage-1
  • 【TDengine源码阅读】#if defined(__APPLE__)
  • (C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
  • Android支持离线功能的复杂业务场景(如编辑、同步):设计数据同步策略的解决方案
  • 基于大模型的腰椎管狭窄术前、术中、术后全流程预测与治疗方案研究报告