张量 ,最基础的运算单位 ,一个多维矩阵,一个可以运行在gpu上的多维数据
import numpy as np
numpy_array = np.array([1, 2, 3])
tensor_from_numpy = torch.from_numpy(numpy_array)
自定义数据集
import torch
from torch.utils.data import Dataset
# 自定义一个名称为MyDataset的数据集(继承pytorch内置的Dataset类)
class MyDataset(Dataset):
# 重写构造函数(输入2个tensor类型的参数:数据/数据集合,数据对应的标签/集合)
def __init__(self, data_tensor, target_tensor):
self.data_tensor = data_tensor
self.target_tensor = target_tensor
# 重写len方法:返回数据集大小
def __len__(self):
return self.data_tensor.size(0) # 一般情况输进来的数据都是集合
# 上重写getitem方法:基于索引,返回对应的数据及其标签,组合成1个元组返回
def __getitem__(self, index):
return self.data_tensor[index], self.target_tensor[index]
调用数据集
# 生成数据集和标签集 (数据元素长度=标签元素长度)
data_tensor = torch.randn(10, 3) # 10行3列数据,可以理解为10个元素,每个元素个一维的3个元素列表
target_tensor = torch.randint(2, (10,)) # 标签是0或1的10个元素 # 对应语法:torch.randint(low, high, size)
# 将数据封装成自定义数据集的Dataset
my_dataset = MyDataset(data_tensor, target_tensor)
# 调用方法:查看数据集大小
print('Dataset size:', len(my_dataset))
# 使用索引调用数据
print('tensor_data[0]: ', my_dataset[0])
from torch.utils.data import DataLoader
tensor_dataloader = DataLoader(dataset=xxx, # 传入的数据集, 必须参数,必须是Dataset 类型
batch_size=x, # int 类型,每个 batch 有多少个样本
shuffle=x, # bool 类型,在每个 epoch 开始的时候,是否对数据进行重新打乱;
num_workers=x) # int 类型,加载数据的进程数,0 意味着所有的数据都会被加载进主进程,默认为 0
Torchvision 库就是常用数据集 + 常见网络模型 + 常用图像处理方法
torchvision.datasets所支持的所有数据集,它都内置了相应的数据集接口
# 以MNIST为例
import torchvision
mnist_dataset = torchvision.datasets.MNIST(root='./data', //指定保存数据集位置
train=True, //是否加载训练集数据
transform=None, //图像预处理
target_transform=None,//图像标签预处理
download=True//True 自动下载)
图像处理工具
torchvision.transforms.Resize(size, interpolation=2)(PIL Image对象/tensor对象) //size 若是 int整数 较短边匹配到size另一边按比例缩放
torchvision.transforms.CenterCrop(size)(PIL Image对象/tensor对象)
torchvision.transforms.RandomCrop(size, padding=None)(PIL Image对象/tensor对象)
torchvision.transforms.FiveCrop(size)(PIL Image对象/tensor对象)
torchvision.transforms.RandomHorizontalFlip(p=0.5)(PIL Image对象/tensor对象)
transforms.normalize(mean_vals, std_vals,inplace=False)
output = (input - mean) / std ;
mean:各通道的均值;
std:各通道的标准差;
inplace:是否原地操作
例:
from PIL import Image
from torchvision import transforms
# 原图
orig_img = Image.open('TP02.jpg')
display(orig_img)
# 图像转化为Tensor
img_tensor = transforms.ToTensor()(orig_img)
# 标准化
# 定义标准化操作
# norm_oper = transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)) # RGB三通道,所以mean和std都是3个值
tensor_norm = transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))(img_tensor)
# 再把标准化后的Tensor转化为图像
img_norm = transforms.ToPILImage()(tensor_norm)
display(img_norm)
compose 类
torchvision.transforms.Compose(transforms)
1、使用 .detach(): 创建一个内容相同但不需要梯度的新张量。
- x_detached = x.detach()
2、使用 torch.no_grad(): 在该上下文管理器中执行的所有操作都不会追踪梯度。
with torch.no_grad():y = x + 2