torchvision自带的transforms.to_tensor用法

本文详细介绍了如何使用PyTorch将PIL图像或numpy数组转换为Tensor,并解释了转换过程中图像数据的变化,包括通道顺序调整及归一化处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import torch
import torchvision.transforms as tf
import numpy as np
raw_input = np.ones((224,224,3),dtype=np.uint8)
tt_tf = tf.ToTensor()
# tt_tf = torch.as_tensor
output_ = tt_tf(raw_input)

官方解释:

Convert a PIL Image or numpy.ndarray to tensor:
Converts a PIL Image or numpy.ndarray (H x W x C) in the range [0, 255] to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0] if the PIL Image belongs to one of the modes (L, LA, P, I, F, RGB, YCbCr, RGBA, CMYK, 1) or if the numpy.ndarray has dtype = np.uint8.

In the other cases, tensors are returned without scaling.

通俗解释:

  1. 转换为torch.FloatTensor
  2. 将通道提前
  3. 可以将特定类型的图片或者uint8的ndarray归一化(除255),其他不做归一化

tip:如果想只是转换为tensor,不做其他改变,可以使用 torch.as_array()

使用MNIST数据集中的0,1数据完成logistic regression 任务 导入相关包 In [1]: import torch import torchvision as tv import torchvision.transforms as transforms import torch.nn as nn In [2]: # 定义是否使用GPU device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 定义数据预处理方式 transform = transforms.ToTensor() 利用框架自带数据集读取方式读取 MNIST数据集 In [3]: # download 第一次可设置为Ture trainset = tv.datasets.MNIST( root='./data/', train=True, download=True, transform=transform) 从训练集中取出0、1标签的数据构成此次任务的训练集(train_input,train_label) In [4]: train_input = [] train_label = [] for data, label in trainset: if label == 0 or label == 1: train_input.append(data) train_label.append(label) 创建自己的训练数据集,需要补充完成 In [5]: class TensorDataset(torch.utils.data.Dataset): """ 创建自己的dataset类 继承torch.utils.data.Dataset。 Dataset wrapping data and target tensors. Each sample will be retrieved by indexing both tensors along the first dimension. Arguments: data_tensor (Tensor): contains sample data. target_tensor (Tensor): contains sample targets (labels). """ ​ def __init__(self, data_tensor, target_tensor): self.data_tensor = data_tensor self.target_tensor = target_tensor # 这个方法是必须要有的,用于按照索引读取每个元素的具体内容 def __getitem__(self, index): return self.data_tensor[index], self.target_tensor[index] # #return很关键,return回哪些内容,那么我们在训练时循环读取每个batch时, # 就能获得哪些内容 ##这个函数也必须要写,它返回的是数据集的长度 def __len__(self): return self.data_tensor.size(0) 定义训练批处理数据 In [ ]: # batch_size 根据自己计算资源设计,shuffle设置为True,查询设置的原因。 trainloader = torch.utils.data.DataLoader( TensorDataset(train_input, train_label), batch_size = 128, shuffle = True, ) 利用pytorch框架的nn.Module 模块完成logistic regression class logistic_regression(nn.Module): ''' 逻辑回归模型 ''' def __init__(self): super(logistic_regression, self).__init__() " 添加logistic regression层 " def forward(self,
最新发布
03-24
import torch import torch.nn as nn from torch.utils.data import DataLoader from torchvision.transforms import ToTensor from torchvision.datasets import KMNIST import matplotlib.pyplot as plt #导入数据 train_data = KMNIST(root="data",train=True,download=True,transform=ToTensor()) test_data = KMNIST(root="data",train=False,download=True,transform=ToTensor()) # 超参数 epochs=20 lr=0.01 batch_size=64 # 数据整理 train_dl=DataLoader(train_data,batch_size=batch_size,shuffle=True) test_dl=DataLoader(test_data,batch_size=batch_size) # 模型训练 loss_hist = [] best_loss = float('inf') # 初始化最佳损失为无穷大 best_model_state = None # 初始化最佳模型状态 # 模型定义 class MyModel(torch.nn.Module): def __init__(self): super(MyModel, self).__init__() self.linear=nn.Linear(784,512) self.bn=nn.BatchNorm1d(512) self.relu=nn.ReLU() self.linear2=nn.Linear(512,512) self.bn2=nn.BatchNorm1d(512) self.relu=nn.ReLU() self.drop=nn.Dropout(0.1) self.linear3=nn.Linear(512,10) def forward(self, x): out=self.linear(x) out=self.bn(out) out=self.relu(out) out=self.linear2(out) out=self.bn2(out) out=self.relu(out) out=self.drop(out) final=self.linear3(out) return final #模型、损失、优化器定义 model=MyModel() loss=nn.CrossEntropyLoss() optimizer=torch.optim.Adam(model.parameters(),lr=lr) def validate_model(model, val_dl): model.eval() # 设置模型为评估模式 total_loss = 0 with torch.no_grad(): for data, target in val_dl: out = model(data.reshape(-1, 784)) loss_val = loss(out, target) total_loss += loss_val.item() return total_loss / len(val_dl) for epoch in range(epochs): # 初始化损失正确率、总数 running_loss = 0.0 correct = 0 total = 0 for data, target in train_dl: out = model(data.reshape(-1, 784)) loss_val = loss(out, target) optimizer.zero_grad() loss_val.backward() optimizer.st
03-22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值