pytorch常见的tensor系统化操作

博客主要介绍了常用的tensor操作,包括形状改变家族(如view、squeeze等),可改变tensor形状且部分操作共享内存;还提到因内存不连续引出的resize方法。此外,介绍了归并操作家族、逐元素家族和线性代数家族的tensor操作。

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

常用的tensor操作

  1. 形状改变家族(view,squeeze,unsqueeze,reshape):该方法可以改变tensor的形状,但必须要保证调整前后元素的一致性。view不会修改自身的数据,返回新的tensor与原来的tensor共享内存,只要更改其中的一个,另外一个也会随着改变。当然,这里也就引出了在深度学习模型中常用到的unsqueeze和squeeze,一个是将维数增加,一个是将维度压缩。
a = torch.arange(6)
print(a)
a.view(2,3)
输出:tensor([0, 1, 2, 3, 4, 5])
tensor([[0, 1, 2],
        [3, 4, 5]])
        
b = a.view(-1,3)#-1是自适应的作用
b:tensor([[0, 1, 2],
        [3, 4, 5]])

b = b.unsqueeze(0)#在0这个维度增加
b.size()
b:torch.Size([1, 2, 3])

b = b.squeeze(0)#在0这个维度压缩
b.size()
b:torch.Size([2, 3])

由于一些tensor在内存上是不连续的,无法执行view操作,所以我们经常看到tensor.contiguous().view(-1)。解决的办法是resize()该方法将contiguous()方法封装在里面,省去了将内存连续的操作。

下面介绍一下什么叫共享内存,这对于像我这样的初学者来说没有直观的感受,说白了,就是两个变量指向同一个物理地址(即内存),改变其中的一个变量导致了内存空间中的数据的变化,另外一个也会改变,废话不多说,举个栗子:

a = t.rand(2,3)
b = a
print(a)
a:tensor([[0.8543, 0.8587, 0.9426],
        [0.3482, 0.2721, 0.3712]])
a[0,0]=10000
print(a)
a:tensor([[1.0000e+04, 8.5874e-01, 9.4255e-01],
        [3.4824e-01, 2.7212e-01, 3.7116e-01]])
print(b)
b:tensor([[1.0000e+04, 8.5874e-01, 9.4255e-01],
        [3.4824e-01, 2.7212e-01, 3.7116e-01]])

可以发现b的值也改变了!!!!!!!
2. 归并操作家族:该类操作可以对tensor的某个维度进行归并操作。

函数功能
mean/sum/median/mode均值/和/中位数/众数
norm/dist范数/距离
std/var/cumsum/cumprod标准差/方差/累加/累乘

注意在对某个维度的元素进行归并操作时,keepdim的作用,设为True则保留维度,False则删除维度,如下:

b = t.ones(2,3)
b = b.sum(dim=0,keepdim=True)
print(b.size())
》》》torch.Size([1, 3])

b = t.ones(2,3)
b = b.sum(dim=0,keepdim=False)
print(b.size())
》》》torch.Size([3])
  1. 逐元素家族:对tensor中的每一个元素同时进行变化。
函数功能
abs/sqrt/div/exp/fmod/log/pow…绝对值/平方根/除/指数/求余/对数/幂
cos/sin/asin/atan2/cosh三角函数
ceil/round/floor/trunc上取整/四舍五入/下取整/只保留整数部分
clamp(input,min,max)夹断
  1. 线性代数家族
函数功能
trace/diag/triu/tril对角线元素之和/对角线元素/矩阵的上三角/下三角
mm/bmm矩阵乘法/batch的矩阵乘法
t/dot/cross/inverse/svd转置/内积/外积/求逆矩阵/奇异值分解
### 使用 PyTorch 构建花卉识别系统 #### 安装必要的库 为了构建花卉识别系统,首先需要确保安装了所需的 Python 库。通过 `pip` 可以轻松完成这些依赖项的安装: ```bash pip install torch torchvision ``` 这一步骤确保环境中具备运行 PyTorch 和其扩展模块所需的基础工具[^1]。 #### 导入必需的包 在编写具体实现之前,先要导入一系列对于创建卷积神经网络(CNN)至关重要的 Python 包: ```python import torch import torchvision from torchvision import datasets, models, transforms import torch.nn as nn import torch.optim as optim ``` 上述代码片段引入了用于数据处理、模型定义以及优过程的核心组件[^5]。 #### 数据预处理与加载 准备训练集和测试集的数据管道是任何机器学习项目的关键部分之一。针对图像分类任务,通常会采用如下方式来增强数据并标准输入尺寸: ```python data_transforms = { 'train': transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), 'val': transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) } ``` 这里设置了两种不同的转换链路——一种适用于训练阶段(随机裁剪翻转),另一种则专为验证/推理设计(中心裁切)。 #### 创建自定义 AlexNet 模型 接下来就是定义具体的 CNN 结构,在此选择了经典的 AlexNet 架构作为基础框架,并对其进行了适当调整以便适应特定的应用场景—即多类别花卉图片辨识: ```python class CustomAlexNet(nn.Module): def __init__(num_classes=5): super().__init__() self.features = nn.Sequential( nn.Conv2d(in_channels=3, out_channels=64, kernel_size=(11, 11), stride=(4, 4)), ... # 更多层省略... ) self.classifier = nn.Linear(...) def forward(self, x): x = self.features(x) x = x.view(-1, ...) output = self.classifier(x) return output ``` 注意这里的 `CustomAlexNet` 类继承自 `nn.Module`, 并实现了两个主要方法:`__init__()`,负责初始各层参数;`forward()`,描述前向传播逻辑[^3]. #### 设置超参数及优器配置 最后一步涉及设定一些全局性的超参变量比如批次大小(batch size),迭代次数(epoch number)等; 同时也要指定损失函数(loss function)形式及其对应的梯度下降算法(optimizer): ```python batch_size = 32 learning_rate = 0.001 epochs = 20 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) for epoch in range(epochs): running_loss = 0.0 for inputs, labels in dataloaders['train']: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() ``` 这段脚本展示了完整的单轮次训练流程,包括零累积梯度(`zero_grad()`),计算当前mini-batch上的预测误差(`loss`)并通过反传更新权重(`step()`)等一系列操作[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值