深入理解 transforms.ToTensor()

在使用 PyTorch 进行图像处理和深度学习任务时,transforms.ToTensor() 是一个常用的工具。它可以将图像数据转换为 PyTorch 的张量格式,为后续的神经网络处理做好准备。尽管这个方法很常用,但很多人可能并不完全理解它具体做了哪些操作。本文将深入解析 transforms.ToTensor() 的具体作用和工作原理。

transforms.ToTensor() 的核心功能

transforms.ToTensor() 主要有三个核心功能:

  1. 图像格式转换:将图像从 H x W x C 格式(高度 x 宽度 x 通道)转换为 C x H x W 格式。
  2. 数据类型转换:将图像数据的像素值从 uint8 类型转换为 float32 类型。
  3. 归一化:将像素值从 [0, 255] 的范围缩放到 [0.0, 1.0] 的范围。

详细操作步骤

1. 图像格式转换

图像数据通常以高度(H)、宽度(W)和通道(C)的顺序存储。在大多数图像处理库(如 PIL 和 OpenCV)中,图像的默认格式是 H x W x C。然而,PyTorch 期望输入的张量格式是 C x H x W,即通道维度在最前面。

  • 输入格式(常见的图像库):H x W x C
  • 输出格式(PyTorch 张量):C x H x
帮我分析一下这段代码:import numpy as np import torch import torch.nn as nn import torch.optim as optim from torch.optim.lr_scheduler import OneCycleLR from torch.utils.data import DataLoader from torchvision import datasets, transforms from torch.amp import GradScaler from torch.amp import autocast import matplotlib.pyplot as plt # ---------------------- # 进阶数据增强 # ---------------------- class AdvancedMNISTTransform: def __init__(self): self.transform = transforms.Compose([ transforms.RandomAffine(degrees=15, translate=(0.1, 0.1), scale=(0.9, 1.1)), transforms.RandomApply([transforms.Lambda(self._add_noise)], p=0.3), transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) def _add_noise(self, x): return x + torch.randn_like(x) * 0.1 def __call__(self, x): return self.transform(x) # ---------------------- # 残差注意力网络 # ---------------------- class ResidualSEBlock(nn.Module): """进阶残差块+通道注意力""" def __init__(self, in_channels): super().__init__() self.conv1 = nn.Conv2d(in_channels, in_channels, 3, padding=1) self.bn1 = nn.BatchNorm2d(in_channels) self.se = nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(in_channels, in_channels // 16, 1), nn.ReLU(), nn.Conv2d(in_channels // 16, in_channels, 1), nn.Sigmoid() ) def forward(self, x): residual = x x = torch.relu(self.bn1(self.conv1(x))) x = x * self.se(x) # 通道注意力加权 return x + residual class MNISTAdvNet(nn.Module): """参数量:约0.95M""" def __init__(self): super().__init__() self.features = nn.Sequential( nn.Conv2d(1, 32, 3, padding=1), nn.BatchNorm2d(32), nn.ReLU(), ResidualSEBlock(32), nn.MaxPool2d(2), nn.Conv2d(32, 64, 3, padding=1), nn.BatchNorm2d(64), nn.ReLU(
最新发布
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值