Pytorch入门
环境配置
1 | conda create -n pytorch-learn python=3.8 |
查看cuda版本:
1 | nvcc --version |
根据cuda版本进行选择:Pytorch本地安装
1 | conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia |
安装检测
1 | (pytorch-learn) aoijays@aoijays-ubuntu:~/Desktop/note$ python |
此时说明安装成功
前言
法宝函数
1 | dir( ... ) # 显示下属对象列表 |
Dataset
以蜜蜂蚂蚁数据集进行说明
其文件目录:
1 | │ └── hymenoptera_data |
子文件夹小附有若干张jpg
接下来我们需要使用torch的Dataset去加载数据集
| An abstract class representing a :class:
Dataset
.
|
| All datasets that represent a map from keys to data samples should subclass
| it. All subclasses should overwrite :meth:__getitem__
, supporting fetching a
| data sample for a given key. Subclasses could also optionally overwrite
| :meth:__len__
, which is expected to return the size of the dataset by many
| :class:~torch.utils.data.Sampler
implementations and the default options
| of :class:~torch.utils.data.DataLoader
. Subclasses could also
| optionally implement :meth:__getitems__
, for speedup batched samples
| loading. This method accepts list of indices of samples of batch and returns
| list of samples.
省流:
- 需要继承
- 必须重写
__getitem__
- 可以重写
__len__
1 | from torch.utils.data import Dataset |
写法非常自由,你只要保证重写的函数返回正确结果即可
Tensorboard
1 | conda install tensorboard |
Scalars
绘制一些图表,观察训练的loss变化
1 | from torch.utils.tensorboard import SummaryWriter |
在终端中:
1 | tensorboard --logdir=logs --port=6007 # 默认6006 |
Images
可视化实际的训练效果,上传图片进行展示
1 | img = Image.open( |
Transforms
留个印象就好,能通过这个方法对数据、图片等进行互相转换、变化
常见的有:
- ToTensor:转化为Tensor数据
- Normalize:归一化
- Resize:对图片数据进行缩放
- Compose:用列表记录多个变化,进行一次性操作
可能用到的时候查一下就行
适合对多个数据同时进行相同的处理
Torchvision数据集的下载与使用
1 | import torchvision |
此时我们得到的数据集都是(PIL对象,标签索引)
我们可以使用Transform统一把图片转化为Tensor,方便Pytorch使用
最简单的方法:
1 | dataset_transform = torchvision.transforms.Compose([ # 封装所有需要进行的转换列表 |
DataLoader
1 | import torchvision |
网络
1 | import torch |
卷积层
对于一张H*W的RGB图片,其通道数channel为3
我们使用多少个卷积核,就会产生多少个out_channels
1 | class Mycnn(nn.Module): |
池化层
卷积后的图像依旧比较大,可以通过池化层进行压缩
避免过拟合、去除冗余
1 | # 池化 |
我们可以喂入图片,就可以得到压缩画质版本的输出
激活层
1 | # ReLU |
其他
- 正则化层
- 线性层……
Sequential
我们试图构建一个较大的网络对CIFAR10数据集进行推理
1 | # Sequential |
损失函数
1 | import torch |
反向传播
1 | # 构建网络 |
优化器
1 |
|
我们可以进行多轮学习
1 |
|
当loss收敛后,就完成了训练
模型的修改
除了自己的模型,其实也能修改别人训练完的模型
以此网络为例:
1 | import torch |
网络结构为:
1 | Mynn( |
添加
1 | mynn.add_module('add_ReLU', nn.ReLU() ) |
修改
1 | mynn.classfication[1] = nn.ReLU() |
模型的保存与读取
save
1 | import torch |
完整保存了模型的结构与参数,数据量大
state_dict(官方推荐)
1 | import torch |
GPU训练
- 损失函数
- 数据
- 模型
三种对象直接x = x.cuda()
即可放入GPU显存
但是若GPU不存在,此时代码兼容性一般
1 | device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
更推荐这种写法
完整流程
1 | import torchvision |
构建网络
1 | from torch import nn |
初始化
1 | from torch import optim |
训练
1 | from torch.utils.tensorboard import SummaryWriter |