文章目录
- 一、pytorch环境配置及安装
- 二、python编辑器选择、安装及配置
- 三、FAQ
- 四、python学习中两大法宝函数
- 五、pycharm与jupyter使用和对比
- 六、pytorch加载数据初识
- 七、Dataset类实战
- 八九、TensorBoard的使用
- 十、图像类型
- 十一、图像类型变换
- 十二十三、常见的transforms
- 十四、torchvision
- 十五、Dataloader
- 十六、神经网络的基本骨架nn.Module的使用
- 十七、土堆说卷积操作
- 十八、神经网络-卷积层
- 十九、神经网络-最大池化的使用
- 二十、神经网络-非线性激活
- 二十一、神经网络-线性层及其他层介绍
- 二十二、神经网络-搭建小实战和Sequential的使用
- 二十三、损失函数与反向传播
- 二十四、优化器
- 二十五、现有网络模型的使用及修改
- 二十六、网络模型的保存与读取
- 二十七二十八二十九、完整的模型训练套路
- 三十、利用GPU训练
- 三十二、完整的模型验证套路
- 三十三、看看开源项目
- 无废话解决实战中报错
- 1. 所有conda环境都使用一个地方的包
- 2.tensorboard运行后报错:Failed to fetch runs
- 3.torch.cuda.OutOfMemoryError: CUDA out of memory.
- 4.vscode终端显示两个环境名
- 5.vscode远程plt.show()无法显示
- 6.NVIDIA GeForce RTX 4090 with CUDA capability sm_89 is not compatible with the current PyTorch installation.
- 7.visdom遇到问题ERROR:tornado.access:500 GET / (::1) 2.10ms
- 8.wandb无法在Media输出键带'id'的图片
- 9.ImportError: DLL load failed while importing _imaging: 找不到指定的模块。
- 10.Collecting package metadata (current_repodata.json): | WARNING conda.models.version:get_matcher(556): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda. Your spec was 1.7.1.*, but conda is ignoring the .* and treating it as 1.7.1
- 11.ERROR: Could not find a version that satisfies the requirement tensorflow==1.13.1
- 12.ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
- 13.OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
- 14.ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory
- failed to run cuBLAS routine cublasSgemm_v2
- 15.WARNING: No metadata found in /home/user/anaconda3/envs/tf37/lib/python3.7/site-packages
一、pytorch环境配置及安装
Anaconda中文大蟒蛇,是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。
Windows安装Anaconda
选择python3.8,进入Anaconda Installers and Packages
选择Anaconda3-5.2.0-windows-x86.64.exe(可下最新版),跳过安装vscode,
在开始菜单打开Anaconda Prompt,如果出现(base)则安装成功
Linux安装Anaconda
apt-get install -y wget(Debian/Ubuntu系统)
yum install wget -y(CentOS系统)
wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
chmod +x Anaconda3-2024.02-1-Linux-x86_64.sh
./Anaconda3-2024.02-1-Linux-x86_64.sh
然后敲击ENTER,输入yes,敲击ENTER,输入yes,conda -V
检查是否安装成功
WIndows任务管理器检查显卡驱动,以下是常用命令:
conda create -n pytorch python=3.8(正常创建,已经有了同名不建议直接覆盖,建议先删除环境,否则包会删除不彻底)
conda env create -f environment.yml(根据配置文件创建环境)
pip install -r requirements.txt(根据文本文件下载包)
conda info -e/conda env list(显示环境信息)
conda activate pytorch(激活环境)
conda list/pip list(不会显示关联环境的包)
pip freeze > requirements.txt(导出当前环境的包)
conda deactivate
conda remove -n pytorch --all/conda env remove -n pytorch(删除环境)
安装pytorch,进入首页https://pytorch.org/,推荐稳定版(Stable),
因为1.1以上加入了tensorboad,windows下选择conda,linux下选择pip,语言选择python3.8(视频当时的选择,现在更新了)
系统信息看不到gpu型号,控制面板->设备管理器->显示适配器查看,有英伟达显卡选择cuda11.8,集显选择none,复制安装命令
(视频当时版本)conda install pytorch torchvision cudatoolkit=9.2 -c pytorch -c defaults -c numba/label/dev
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
注意:cuda版本要和pytorch版本、甚至python版本对应,否则torch.cuda.is_available()会False,解决:不指定cuda版本下载即可
进入https://www.geforce.com/hardware/technology/cuda/supported-gpu查看你的英伟达显卡是否支持cuda
输入nvidia-smi
,cuda9.2以上需要驱动版本大于396.26,可以电脑管家或英伟达官网下载驱动
如果下载慢,把pytorch和cuda的包复制到conda的安装目录下的pkgs再输入命令
验证cuda是否可用命令,后面两条分别是tf1.x和tf2.x版本的命令:
python -c "import torch; print(torch.cuda.is_available())"
python -c "import tensorflow as tf; print('TensorFlow version:', tf.__version__); print('Is GPU available:', tf.test.is_gpu_available())"
python -c "import tensorflow as tf; print('TensorFlow version:', tf.__version__); print('Is GPU available:', tf.config.list_physical_devices('GPU'))"
或终端输入python进入python环境,
import torch
torch.cuda.is_available()
二、python编辑器选择、安装及配置
两种编辑器:pycharm下载社区版,jupyter可以交互
pycharm安装:选择不导入设置,跳过插件,创建新项目,编译器选择已存在,左边选择conda环境,右边选择pytorch路径下的python.exe
python console也可以输入指令检测是否成功导入conda的环境:
import torch
torch.cuda.is_available()
安装anaconda同时已经安装jupyter了,但是默认只安装在base环境,但是base环境没有安装pytorch,没有办法使用pytorch
两种解决方式,第一种base环境安装pytorch,另一种方式pytorch环境安装jupyter,我们选择第二种
jupyter需要ipykernel包,开始菜单点击jupyter notebook,base环境里conda list中有ipykernel
进入pytorch环境,conda install nb_conda,装不上换成conda install nb_conda_kernels
安装完成后在pytorch环境输入jupyter notebook,点击new,选择conda环境的pytorch,用命令torch.cuda.is_available()
验证,shift+enter跳转到下一个代码块并且运行
三、FAQ
任务管理器或显示适配器查看gpu型号,进入https://www.geforce.com/hardware/technology/cuda/supported-gpu,查看是否支持cuda
输入nvidia-smi查看驱动版本是否大于396.26,软件管家升级或官网下载驱动
下载太慢,复制两个包,还是太慢需要特定指令让cuda使用本地文件安装,conda install --use-local 那两个包,输入两次,可以试着早上下载安装更快
四、python学习中两大法宝函数
两个函数大法宝,dir()打开,help()说明,是官方解释文档
打开pycharm选择项目文件夹,右下角有标记的是被用作pycharm的项目地址,选择的编译器python.exe现在变成.bat了
输入dir(torch.cuda)
,前后出现__表示它是函数,用help(torch.cuda.available)了解其含义
五、pycharm与jupyter使用和对比
设置>项目>项目解释器可以看到我们的python和pytorch版本,
添加配置,选择python,选择脚本位置,确定,或者右键运行会弹出要求配置
python文件≠python控制台≠jupyter,shift enter可以切换行块
python文件,优:通用,传播方便,适用于大型项目;缺:需要从头运行
python控制台,优:显示每个变量属性;缺:不利于代码阅读及修改
jupyter,优:利于代码阅读及修改;缺:环境需要配置
六、pytorch加载数据初识
Dataset:提供一种方式去获取数据及其标签label
dataloader:为后面的网络提供不同的数据形式
使用方式:
imageFolder放入Dataset(可选,好处是可以调用self.images = root.imgs获取包括子目录的所有图片,否则直接将路径传入Dataset)
Subset(可选,用于选取子集,用法:image_folder = torch.utils.data.Subset(image_folder, list(range(100))))
dataset放入DataLoader(可选,Dataset是一个抽象基类,可以继承自定义获取数据和标签,否则直接将ImageFolder放入DataLoader,其实想要自动整理数据和标签imageFolder的基类DatasetFolder已经实现!)
dataLoader放入data_prefetcher(可选,实际上self.path[index % self.size]可以make sure index is within the range,或者每个epoch加载一次DataLoader,注意:epoch≠step/iteration,前者是整个dataLoader,后者是从dataLoader获取一次)
举例:
image_folder = torchvision.datasets.ImageFolder(‘/media/user/Documents/Datasets/ImageNet/val’, transform=transform)
image_folder = torch.utils.data.Subset(image_folder, list(range(100)))
test_loader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False, drop_last=False, num_workers=0)
七、Dataset类实战
Pycharm中terminal报错时,设置>工具>终端里改成cmd
pip install opencv-python下载cv2
继承Dataset类重写的__len__可以相加
八九、TensorBoard的使用
pytorch1.1加入Tensorboard,重名tag可以删除logs下文件重新在终端运行tensorboard
pip install tensorboard
terminal或anaconda Prompt输入
tensorboard --logdir=logs(事件文件所在文件名) --port=6007
tensorboard的add_image()参数为torch.tensor或numpy.array
np.array(img_PIL),PIL类型转换为numpy类型
十、图像类型
pip install opencv-python下载cv2
功能 | PIL.Image | numpy.ndarray | torch.Tensor |
---|---|---|---|
读取图片 | Image.open() | cv2.imread() | / |
显示图片 | img.show() | cv2.imshow() | tensorboard.add_image() 或其他工具 |
保存图片 | img.save() | cv2.imwrite() | torchvision.utils.save_image() |
获取尺寸 | img.size | numpy_array.shape | tensor.size() 或 tensor.shape |
修改尺寸 | img = img.resize((256, 256), Image.BILINEAR) | img = cv2.resize(img, (256, 256), interpolation=cv2.INTER_LINEAR) | img = F.interpolate(batch_tensor, size=(256, 256), mode=‘bilinear’, align_corners=False) /torchvision.transforms. Resize((256, 256))(batch_tensor) |
轴顺序 | (宽, 高) | (高, 宽, 通道) | (通道, 高, 宽) |
变换通道 | / | img = np.transpose(img, (1, 2, 0)) | img = img.permute(2, 0, 1) |
数据类型 | uint8 | uint8/float32,一般uint8 | uint8/float32,一般float32 |
数据范围 | [0,255] | 一般[0,255] | 一般[0,1] |
png和jpg文件存储数据类型为uint8
后面默认float32范围为[0,1],如果标准化可以小于0或大于1
后面默认uint为8位,float为32位,这三种图像类型还能使用的数据类型如下
数据类型 | PIL.Image (支持模式) | numpy.ndarray | torch.Tensor |
---|---|---|---|
uint8 | ✔️ 支持(最常用,模式L , RGB , RGBA , P , CMYK , YCbCr ) | ✔️ 支持(最常用) | ✔️ 支持 |
uint16 | ✔️ 支持(高动态范围,模式I;16 ) | ✔️ 支持 | ✔️ 支持 |
float32 | ❌ 不直接支持(需转换为 uint ) | ✔️ 支持 | ✔️ 支持(深度学习标准类型) |
float64 | ❌ 不直接支持(需转换为 uint ) | ✔️ 支持 | ✔️ 支持(高精度计算) |
int32 | ✔️ 支持(模式I ) | ✔️ 支持 | ✔️ 支持 |
int64 | ❌ 不支持 | ✔️ 支持 | ✔️ 支持(用于分类标签) |
1-bit | ✔️ 支持(模式1 ) | ✔️ 支持(作为 bool ) | ✔️ 支持(torch.bool ) |
bool | ❌ 不直接支持 | ✔️ 支持 | ✔️ 支持 |
numpy.ndarray
和 torch.Tensor
本身并没有特定的内置模式(如 CMYK、YCbCr 等),因为它们是通用的数据容器。它们的形状和数据内容完全取决于使用方式,可以任意表示通道和像素值。
十一、图像类型变换
为什么需要tensor类型?tensor数据类型包装了反向神经网络所需要的一些参数
以下是所有常见转换函数,以及它们对应的数据类型和范围变化的详细整理。
转换关系 | 变换函数 | 数据类型变化 | 取值范围变化 |
---|---|---|---|
PIL.Image → numpy.ndarray | np.array(pil_image) | uint8 → uint8 | 0-255 → 0-255 |
np.float32(pil_image) | uint8 → float32 | 0-255 → 0-255 | |
PIL.Image → torch.Tensor | torchvision.transforms.ToTensor()(pil_image) /torchvision.transforms.functional .to_tensor(pil_image) | uint8 → float32 | 0-255 → [0, 1] |
torch.from_numpy(np.array(pil_image)) | uint8 → uint8 | 0-255 → 0-255 | |
numpy.ndarray → PIL.Image | Image.fromarray(numpy_array) | uint8 → uint8 | 0-255 → 0-255 |
Image.fromarray((numpy_array * 255).astype(np.uint8)) | float32 → uint8 | [0, 1] → 0-255 | |
numpy.ndarray → torch.Tensor | torch.from_numpy(numpy_array) /torch.Tensor(numpy_array) torch.tensor(numpy_array) | uint8 或 float32 → 同 Numpy | 保持一致 |
torchvision.transforms.ToTensor()(numpy_array) /torchvision.transforms.functional .to_tensor(numpy_array) | uint8 或其他 → float32 | 0-255 → [0, 1] | |
torch.from_numpy(numpy_array).permute(2, 0, 1).float() / 255.0 | uint8 → float32 | 0-255 → [0, 1] | |
torch.Tensor → PIL.Image | torchvision.transforms.ToPILImage()(torch_tensor) /torchvision.transforms.functional .to_pil_image(torch_tensor) | uint8 或 float32 → uint8 | [0, 1] 或 0-255 → 0-255 |
Image.fromarray(torch_tensor.numpy()) | uint8 或 float32 → uint8 | 保持一致 | |
torch.Tensor → numpy.ndarray | torch_tensor.numpy() | uint8 或 float32 → 同 Tensor | 保持一致 |
见下方 | float32 → uint8 | [0, 1] → 0-255 |
torch.Tensor → numpy.ndarray完整转换代码如下:
def img_tensortocv2(img_tensor: torch.Tensor):
assert (len(img_tensor.shape) == 4 and img_tensor.shape[0] == 1)
img_tensor = img_tensor.clone().detach().cpu()
img_tensor = img_tensor.squeeze()
img_tensor = img_tensor.mul(255).clamp(0, 255).permute(1, 2, 0).type(torch.uint8).numpy()
img_cv = cv2.cvtColor(img_tensor, cv2.COLOR_RGB2BGR)
return img_cv
十二十三、常见的transforms
transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
归一化:给每个通道平均值和标准差
compose,totensor,Normalize,Resize,RandomCrop,也可以放进自己定义的类哦!
transforms.Resize(),一般是元组,也可以是一个数,进行等比缩放,不改变高和宽的比例
transforms.RandomCrop(),两个数是高和宽,一个数裁剪的是正方形
建议训练时候使用transforms.RandomCrop(),验证或测试时候使用transforms.CenterCrop()
不知道返回类型的时候print(type(x))
十四、torchvision
pytorch官网pytorch.org中,Docs下有核心、语音、文本、图像
torchvision中,有dataset,models(可以指定预训练的权重),transforms,utils(内有tensorboard)
Dataset模块:CocoDetection用于目标检测,CocoCaptions用于语义分割,MINST手写数字28x28,CIFAR10/100物体识别32x32
推荐download=True,已经下载了也不会重复下载
下载比较慢,将下载链接放在迅雷中,下载完复制到dataset文件夹当中,运行时会使用已下载的
若运行时未显示下载链接,ctrl点进源码,复制url即可
十五、Dataloader
num_workers加载数据进程数,=0为一个主进程,windows下>0可能会有问题
torchvision.datasets.ImageFolder
可以处理包含子目录下图片的根目录。它会自动识别根目录下的子目录,并将每个子目录视为一个类别,其中的图片文件作为该类别的样本。
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 定义数据变换
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor()
])
# 创建 ImageFolder 数据集
dataset = datasets.ImageFolder(root='root', transform=transform)
# 创建 DataLoader
dataloader = DataLoader(dataset, batch_size=1, shuffle=False)
# 遍历所有图片路径和对应的类别
for img_path, label in dataloader.dataset.imgs:
print(img_path, label)
十六、神经网络的基本骨架nn.Module的使用
container中torch.nn.Module是所有神经网络基本骨架,需要重写__init__
和forward(前向传播)函数
因为继承的nn.Module中forword方法是__call__()
方法的实现,调用对象会调用__call__()
方法
调试时:单步执行自己代码会在自己写的代码中跳转而不会进入源码
十七、土堆说卷积操作
convolution卷积,conv2d表示二维
torch.nn是torch.nn.functional的封装
weight卷积核,bias偏置,stride步长,padding填充,group是分组卷积,对不同的通道使用不同的卷积核,言外之意一般是对每个通道使用相同卷积核
ctrl+p快速查看函数所需参数
十八、神经网络-卷积层
除了conv2d外,其他很少使用
dilation空洞卷积(指卷积核是空洞的),padding_mode填充方式
卷积核不用指定,随机初始化,训练时更新,卷积核的数值是从分布当中进行采样得到的
out_channel等于in_channel两倍时初始化两个卷积核,比如rgb是三个通道
output = torch.reshape(output, (-1, 3, 30, 30))中-1的值为总元素个数除以其他维度值相乘
ILSVRC比赛,2012年AlexNet,2014年GoogLeNet,VGG(常用vgg16),2015年ResNet
padding,stride参数可以根据官网的Hout,Wout公式推算
十九、神经网络-最大池化的使用
nn.MaxPool2d最大池化(下采样,最常用),nn.MaxUnpool2d(上采样),平均池化,nn.AdaptiveMaxPool2d(自适应最大池化)
ceil_mode=True表示进位,默认False,写论文会用到公式可以在官网查阅
若报错RuntimeError:“max_pool2d_with_indices_cpu” not implemented for Long,在tensor中加dtype=torch.float32
最大池化的作用:保留输入的特征,同时把数据量减少,比如视频变720P
卷积-池化-非线性激活
二十、神经网络-非线性激活
Padding Layers这一类几乎用不到,比如nn.ZeroPad2d在周围用0来填充,nn.ConstantPad2d用常数来填充
非线性激活的作用:神经网络中引入非线性的特质,才能训练出符合各种特征的模型
nn.ReLU()小于0进行截断,大于0不变,nn.Sigmoid非线性缩放到[0,1],1/1+exp-x,官网有图像
inplace=True表示把原来的值也改变(本来是通过返回值获取值)
二十一、神经网络-线性层及其他层介绍
Normalization Layers正则化层:加快神经网络的训练速度
nn.BatchNorm2d,num_feature即channel,其他默认即可
Recurrent Layers用于文字识别,特定的网络结构,用的不多
Transformer Layers特定的网络结构,用的不多,后面讲解
Linear Layers线性层:用的较多即全连接层,g=Σk*x+b,in_feature是x的个数,out_feature是g的个数,k是weight,b是bias
Dropout Layers随机将一些数设为0,防止过拟合
Sparse Layers特定的网络结构,用的不多,其中的Embedding用于自然语言处理
Distance Functions计算两个值之间的误差,常用余弦相似度,官网有公式
Loss Functions损失函数,常用值nn.MSELoss,nn.CrossEntropyLoss,nn.BCELoss,分布nn.NLLLoss,nn.KLDivLoss
torch.flatten()把输入展成一行,与reshape不同
container.sequential之后讲,torchvision.models提供了很多网络结构,有分类、语义分割、目标检测、实例分割、人体结构检测,文字和语音也有
二十二、神经网络-搭建小实战和Sequential的使用
torch.ones((64, 3, 32, 32))表示全1张量,可以对网络结构进行检验
writer.add_gragh()查看计算图,tensorboard --logdir=logs_seq,没必要使用graphviz+torchviz太麻烦
二十三、损失函数与反向传播
1.计算实际输出和目标之间的差距
2.为我们更新输出提供一定的依据(反向传播)
torch.nn.L1Loss(),绝对值∣x**n−y**n∣,if reduction=‘mean’;if reduction=‘sum’.
torch.nn.MSELoss(),均方差(x**n−y**n)2,if reduction=‘mean’;if reduction=‘sum’.
torch.nn.CrossEntropyLoss(),交叉熵(可能公式有变化),官网都有介绍,It is useful when training a classification problem with C classes.ouput是每个分类的概率
如果你看过一点机器学习的推导的话,优化器会有一个优化函数,那个函数你可以定性的理解为最小二乘,不同的优化函数对应不同的损失函数,mse是比较经典用于回归的损失函数,交叉熵常用于分类的损失函数
gradient descent梯度下降,没有result_loss.backward()的话查看梯度是None
二十四、优化器
optim.zero_grad()把上一步的梯度清零,否则会累加
lr学习率,太大不稳定,太小收敛慢,经我的经验,正常训练模型1e-4,然后1e-5会有略微提升,优化对抗样本一般为0.01
optimizer.step()会对weight参数进行更新
我常用的优化器:
torch.optim.SGD:pytorch中最基础的随机梯度下降优化器,SGD的随机性体现在每次使用传入的一个批次数据更新
torch.optim.RMSprop:通过EMA实现更早的梯度平方的贡献权重按beta2的幂次呈指数衰减
torch.optim.Adam:由于进行了一阶动量平滑和二阶动量平滑,使得适合微调任务,缓解灾难性遗忘问题
torch.optim.AdamW:是Adam的改进,泛化性好,专为权重衰减设计,微调效果更好
另外,beta1
用于平滑梯度,beta2
用于平滑梯度的平方,都是越大对历史梯度(的平方)有越强的记忆,如上一步更新方向的权重是0.9,可以防止过拟合,增强泛化能力,weight_decay
用于正则化模型权重,抑制过拟合
具体对比总结如下:
特性 | SGD | RMSprop | Adam | AdamW |
---|---|---|---|---|
是否使用动量 | 可选(默认无动量,需手动设置 momentum ) | 可选(通过 momentum 参数设置) | 使用一阶动量(beta1 ,默认值 0.9 ) | 使用一阶动量(beta1 ,默认值 0.9 ) |
梯度平滑 | 无 | 二阶动量平滑(alpha ,默认值 0.99 ) | 一阶动量平滑(beta1 )和二阶动量平滑(beta2 ,默认值 0.999 ) | 一阶动量平滑(beta1 )和二阶动量平滑(beta2 ,默认值 0.999 ) |
学习率是否动态调整 | 否 | 动态调整(依赖梯度平方的平滑均值) | 动态调整(依赖梯度平方的平滑均值) | 动态调整(依赖梯度平方的平滑均值) |
默认参数对历史信息的记忆 | 无 | 短期记忆(alpha=0.99 ) | 长期记忆(beta1=0.9 ,beta2=0.999 ) | 长期记忆(beta1=0.9 ,beta2=0.999 ) |
权重衰减机制 | 支持(weight_decay ) | 支持(weight_decay ) | 支持(对梯度进行修正) | 专为权重衰减设计,效果更好 |
适合场景 | 较大数据集,收敛慢,简单优化问题 | 推荐用于序列数据、RNN 或需要更强鲁棒性的任务 | 较复杂优化问题,小数据集,非凸问题 | 小数据集、正则化场景,更适合微调 |
微调效果 | 较弱,容易遗忘旧知识 | 中等,适合特定场景(如序列数据) | 较好,兼顾新旧数据 | 最佳,适合保留旧知识,同时学习新数据 |
我常用的学习率调度器:
不用:一般都不用,学习率设置得没问题一般就能学习好
torch.optim.lr_scheduler.CosineAnnealingLR:设定半周期按照余弦函数形状变化学习率
torch.optim.lr_scheduler.CosineAnnealingWarmRestarts:相比前者,一个周期完学习率直接达到最大,且周期翻设定的倍数,因为学习率突然达到最大所以,常用于训练不稳定的GAN
torch.optim.lr_scheduler.StepLR:只按设定的步数下降一次
torch.optim.lr_scheduler.MultiStepLR:可以设定多个步数下降多次
torch.optim.lr_scheduler.LambdaLR:自己设定Lambda函数
torch.optim.lr_scheduler.ExponentialLR:指数下降
二十五、现有网络模型的使用及修改
torchvision.models有分类、语义分割、目标检测,这节课讲分类模型
最常用vgg16,vgg19,pretrained表示训练好了,数据集用ImageNet,scipy一般都安装好了,pip install scipy
RuntimeError: The dataset is no longer publicly accessible. You need to download the archives externally and place them in the root directory.百度数据集链接复制到迅雷,ImageNet训练集150G太大了放弃了,print打印发现ImageNet线性层最后1000个,查了www.image-net.org官网确实是1000个类别,一般用ILSVRC2012,要学校邮箱注册
COCO数据集(MS-COCO):https://cocodataset.org/#download,一般用COCO2017,注:http://mscoco.org/已失效
CelebA数据集:https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html,不要自己下,使用torchvision.datasets.CelebA(root=path, split=‘train’, download=True, transform=transform),尺寸178x218
CelebA-HQ数据集: https://github.com/tkarras/progressive_growing_of_gans,尺寸1024x1024
LSUN数据集:由于官网404导致无法使用curl http://dl.yf.io/lsun/scenes/bedroom_train_lmdb.zip -o data/bedroom_train_lmdb.zip
,目前我能找到的是访问超神经的数据集,sudo apt install aria2
,然后复制指令下载
对vgg16现有网络进行修改迁移学习,比如再添加(1000,10)的线性层
.classifier.add_module(sequential/一个层),也可以用=来直接修改
二十六、网络模型的保存与读取
保存了网络模型的结构和参数
import torch
import torch.nn as nn
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 5)
def forward(self, x):
return self.fc(x)
# 创建模型实例
model = SimpleModel()
# 保存整个模型
torch.save(model, 'full_model.pth')
# 加载整个模型
loaded_model = torch.load('full_model.pth')
# 可以继续使用加载的模型进行预测等操作
vgg16.state_dict()保存了网络模型的参数,字典形式,相比全部略小,因为大的就是参数
加载时候要把模型定义给复制过来,否则会报错,也可以from %定义模型的文件% import *
import torch
import torch.nn as nn
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 5)
def forward(self, x):
return self.fc(x)
# 创建模型实例
model = SimpleModel()
# 保存模型权重
torch.save(model.state_dict(), 'model_weights.pth')
# 加载模型权重
loaded_model = SimpleModel()
loaded_model.load_state_dict(torch.load('model_weights.pth'))
# 确保模型和加载的权重一致
loaded_model.eval()
# 可以继续使用加载的模型进行预测等操作
注意:直接loaded_model = torch.load(‘full_model.pth’)不行,出现No module named ‘model’,改用第二种方式
二十七二十八二十九、完整的模型训练套路
loss.item()加item()没差别,tensor加item()有差别打印可以输出数值
with torch.no_grad()里的代码梯度没有了,因为只需要测试,不需要反传梯度
训练完每一轮查看验证集的所有损失,下面是CPU运行输出结果:
D:\ProgramData\anaconda3\envs\pytorch\python.exe D:\University\nbuProject\exercise\pytorch_exercise\src\train.py
Files already downloaded and verified
Files already downloaded and verified
训练数据集的长度为:50000
测试数据集的长度为:10000
-------第 1 轮训练开始-------
训练次数:100, Loss: 2.2815933227539062
训练次数:200, Loss: 2.271535873413086
训练次数:300, Loss: 2.212886095046997
训练次数:400, Loss: 2.1286516189575195
训练次数:500, Loss: 2.0074424743652344
训练次数:600, Loss: 1.9723464250564575
训练次数:700, Loss: 1.9965126514434814
整体测试集上的Loss: 310.2758778333664
整体测试集上的正确率: 0.2930999994277954
-------第 10 轮训练开始-------
训练次数:7100, Loss: 1.2701085805892944
训练次数:7200, Loss: 1.0269969701766968
训练次数:7300, Loss: 1.1585915088653564
训练次数:7400, Loss: 0.8122000098228455
训练次数:7500, Loss: 1.2483134269714355
训练次数:7600, Loss: 1.2678707838058472
训练次数:7700, Loss: 0.8957886099815369
训练次数:7800, Loss: 1.241050362586975
整体测试集上的Loss: 199.04056721925735
整体测试集上的正确率: 0.5478000044822693
进程已结束,退出代码0
正确率是分类问题比较特有的指标,tensorboard --logdir=logs_train
.argmax(1)表示横向,.argmax(0)表示纵向,输出:tensor([1,1, …])
(outputs.argmax(1) == targets)输出:tensor([False, True, …])
tudui.train()设置成训练模式(可选)
tudui.eval()设置成测试模式(可选)仅对一部分网络层有作用, 如Dropout、BatchNorm层
三十、利用GPU训练
可以.cuda()的部分:网络模型不需要赋值,损失函数不需要赋值,训练数据和测试数据imgs和target需要赋值
最好加上if torch.cuda.is_available():
可以使用如下代码对比CPU和GPU花费时间
start_time = time.time()
end_time = time.time()
print(end_time - start_time)
可以上https://colab.research.google.com使用谷歌的GPU,新建笔记本,输入以下内容:
import torch
print(torch._version__)
1.8.1+cu101
print(torch.cuda.is_available( ) )
False
发现不能使用GPU,点击修改>笔记本设置,硬件加速器选择GPU,每周可以免费使用30个小时,把训练代码复制过去
在python控制台或jupyter,运行在terminal需要加感叹号!nvidia-smi
第二种方式更常用,调用.to(device)
device = torch.device("cpu”)
Torch.device("cuda”)
Torch.device(“cuda:0”)(第一张显卡)
Torch.device(“cuda:1”)(第二张显卡)
可以使用语法糖device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
我的3070Ti laptop运行结果:
D:\ProgramData\anaconda3\envs\pytorch\python.exe D:\University\nbuProject\exercise\pytorch_exercise\src\train.py
Files already downloaded and verified
Files already downloaded and verified
训练数据集的长度为:50000
测试数据集的长度为:10000
-------第 1 轮训练开始-------
训练次数:100, Loss: 2.289776563644409
训练次数:200, Loss: 2.2781457901000977
训练次数:300, Loss: 2.254847288131714
训练次数:400, Loss: 2.165113925933838
训练次数:500, Loss: 2.0603878498077393
训练次数:600, Loss: 2.035789966583252
训练次数:700, Loss: 2.0222959518432617
整体测试集上的Loss: 313.6828167438507
整体测试集上的正确率: 0.2806999981403351
-------第 10 轮训练开始-------
训练次数:7100, Loss: 1.2535332441329956
训练次数:7200, Loss: 0.9512690901756287
训练次数:7300, Loss: 1.1327733993530273
训练次数:7400, Loss: 0.8513917326927185
训练次数:7500, Loss: 1.2785077095031738
训练次数:7600, Loss: 1.183182954788208
训练次数:7700, Loss: 0.8764308094978333
训练次数:7800, Loss: 1.2747230529785156
整体测试集上的Loss: 194.28636491298676
整体测试集上的正确率: 0.5598999857902527
进程已结束,退出代码0
三十二、完整的模型验证套路
因为png格式是四个通道,处理RGB三通道外,还有一个透明度通道,所以需要调用image = image.convert(‘RGB’),保留其颜色通道,因为模型输入是三个通道,当然如果图片本来就是三个颜色通道,经过此操作不变,加上这一步后,可以适应png jpg各种格式图片,小土堆可以运行是因为不同截图软件保留的通道数是不一样的。
image = torch.reshape(image, (1, 3, 32, 32))网络输入需要batch_size需要reshape或者unsqeeze(0)
如果model.eval()有dropout或者batchnorm不加会出问题
with torch.no_grad():可以节约一些内存和性能,使用 with 语句可以确保在代码块执行完毕后,上下文管理器会被正确地清理掉
model = torch.load(model_path, map_location=torch.device('cpu'))
表示在GPU上保存的模型加载到CPU
print(output.argmax(1))将输出转化成利于解决的方式
三十三、看看开源项目
github搜索pytorch,筛选star最多的
看一个CycleGAN项目,代码后面都有注释
运行python指令!./ scripts/train_cyclegan.sh
python train.py --dataroot ./datasets/maps --name maps_cyclegan --model cycle_gan
参数可以在参数列表找到,或在父类中寻找
参考:https://www.bilibili.com/video/BV1hE411t7RN
无废话解决实战中报错
提示:github拉下来的项目报错,在issue中搜索关键词
1. 所有conda环境都使用一个地方的包
Conda的虚拟环境应该使用对应虚拟环境中的包,通过which pip
发现其位置在~/.local/bin/pip
而非/usr/anaconda3/envs/py38/bin/pip
解决方案:在~/.profile
或/etc/profile
中,在PATH=~/.local/bin
后面设置PATH="/usr/anaconda3/bin:$PATH"
2.tensorboard运行后报错:Failed to fetch runs
搜了网上包括CSDN很多解决方案都没有用,要注意:
日志报错:TypeError: MessageToJson() got an unexpected keyword argument ‘including_default_value_fields’
解决方案是在对应环境下pip install protobuf==4.25.3
3.torch.cuda.OutOfMemoryError: CUDA out of memory.
一般情况就是爆显存了,通过减小batch_size或输入图片尺寸来减小计算图。
还有一种情况就是ctrl+z关闭的程序其实进程没有结束,应当ctrl+c。操作如下关闭进程:
nvidia-smi
- 在看板的下方你会看到正在GPU上通过python指令运行的进程
- 查看它们的PID
- 删除这些进程
kill -9 %PID_number%
后面我又发现即使kill掉也没完全释放显存,只能重启解决
4.vscode终端显示两个环境名
vscode python插件自动激活环境和服务器终端初始化自动激活base环境之间的不兼容导致的问题,解决方法是关闭conda的自动激活环境:
conda config --set auto_activate_base False
5.vscode远程plt.show()无法显示
右键>在交互窗口中运行,或用plt.savefig直接保存
6.NVIDIA GeForce RTX 4090 with CUDA capability sm_89 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_61 sm_70 sm_75 compute_37.
If you want to use the NVIDIA GeForce RTX 4090 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
显卡架构(sm_89)较新,旧版pytorch库不支持。
解决办法:conda remove pytorch
,再输入上方链接的命令。
提示:环境的pytorch版本不影响代码和程序。
7.visdom遇到问题ERROR:tornado.access:500 GET / (::1) 2.10ms
解决:pip uninstall visdom
并用conda下载包,命令在下面的网址中:
https://anaconda.org/conda-forge/visdom
8.wandb无法在Media输出键带’id’的图片
解决:应该是出于安全原因,把id替换成di即可
9.ImportError: DLL load failed while importing _imaging: 找不到指定的模块。
解决:不建议使用windows,建议使用linux跑程序,windows经常会出现此类错误,linux不会出现此类错误,想在windows解决这个很麻烦
10.Collecting package metadata (current_repodata.json): | WARNING conda.models.version:get_matcher(556): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda. Your spec was 1.7.1., but conda is ignoring the . and treating it as 1.7.1
done
Solving environment: unsuccessful initial attempt using frozen solve. Retrying with flexible solve.
Solving environment: unsuccessful attempt using repodata from current_repodata.json, retrying with next repodata source.
Collecting package metadata (repodata.json): | WARNING conda.models.version:get_matcher(556): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda. Your spec was 1.9.0., but conda is ignoring the . and treating it as 1.9.0
WARNING conda.models.version:get_matcher(556): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda. Your spec was 1.8.0., but conda is ignoring the . and treating it as 1.8.0
WARNING conda.models.version:get_matcher(556): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda. Your spec was 1.6.0., but conda is ignoring the . and treating it as 1.6.0
conda install pytorch torchvision torchaudio pytorch-cuda -c pytorch -c nvidia
运行后报错的,解决方法:
conda config --remove-key channels
11.ERROR: Could not find a version that satisfies the requirement tensorflow==1.13.1
(from versions: 2.2.0, 2.2.1, 2.2.2, 2.2.3, 2.3.0, 2.3.1, 2.3.2, 2.3.3, 2.3.4, 2.4.0, 2.4.1, 2.4.2, 2.4.3, 2.4.4, 2.5.0, 2.5.1, 2.5.2, 2.5.3, 2.6.0rc0, 2.6.0rc1, 2.6.0rc2, 2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.7.0rc0, 2.7.0rc1, 2.7.0, 2.7.1, 2.7.2, 2.7.3, 2.7.4, 2.8.0rc0, 2.8.0rc1, 2.8.0, 2.8.1, 2.8.2, 2.8.3, 2.8.4, 2.9.0rc0, 2.9.0rc1, 2.9.0rc2, 2.9.0, 2.9.1, 2.9.2, 2.9.3, 2.10.0rc0, 2.10.0rc1, 2.10.0rc2, 2.10.0rc3, 2.10.0, 2.10.1, 2.11.0rc0, 2.11.0rc1, 2.11.0rc2, 2.11.0, 2.11.1, 2.12.0rc0, 2.12.0rc1, 2.12.0, 2.12.1, 2.13.0rc0, 2.13.0rc1, 2.13.0rc2, 2.13.0, 2.13.1)
ERROR: No matching distribution found for tensorflow==1.13.1
解决:使用python3.8创建conda环境不支持1.13.1版本的tensorflow,降低python版本即可:
conda create -n tf37 python=3.7
12.ERROR: pip’s dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
tensorflow 1.13.1 requires tensorboard<1.14.0,>=1.13.0, but you have tensorboard 2.11.2 which is incompatible.
因为tensorboard=1.15.0及以上才能用torch版的writer,所以我才更新了tensorboard,解决:不用管他,程序依旧能正常运行,这样既能使用tensorflow=1.13.1,且能正常使用tensorboard
13.OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
解决:conda环境使用pip下载时会出现,使用对应的conda指令即可,如conda install mmcv-full
。或者运行sudo apt install nvidia-cuda-toolkit
下载一个cuda到本地。
更新:后续发现之前的解决方式会出现ModuleNotFoundError: No module named ‘mmcv._ext’,原因是mmcv与torch版本不匹配,应运行pip install mmcv-full==1.7.0 -f https://download.openmmlab.com/mmcv/dist/cu117/torch1.13/index.html
,这样可以下载到兼容的版本。
14.ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory
这个问题出现在pip install tensorflow-gpu==1.13.1
之后,安装了 cuda-cudart
和其他 CUDA 库,但缺少 cuDNN(libcudnn.so.7
)
兼容性要求很高,python版本为3.7的情况下,1.x我尝试成功的版本:conda install -c conda-forge cudatoolkit=10.0 cudnn=7.6
,pip install tensorflow-gpu==1.13.1
。
2.x我尝试成功的版本:conda install -c conda-forge cudatoolkit=11.0 cudnn=8.0
,pip install tensorflow-gpu==2.4.0
。使用 conda 安装 CUDA 和 cuDNN 的确有很多优势,其中一个主要优点就是不需要手动配置环境变量。
另外,如果代码是v1建议下载v2的tensorflow,然后使用import tensorflow.compat.v1 as tf\\ tf.disable_v2_behavior()
,因为最新版不容易出现包版本冲突问题。
failed to run cuBLAS routine cublasSgemm_v2
RTX30系显卡会报此错误,没有找到解决方案
另外,conda uninstall tensorflow\\ conda uninstall tensorflow-gpu\\ pip uninstall tensorflow\\ pip uninstall tensorflow-gpu
,然后conda install --force-reinstall tensorflow
就可以下载最新版带GPU的tesnorflow,经我验证,运行python -c "import tensorflow as tf; print('TensorFlow version:', tf.__version__); print('Is GPU available:', tf.config.list_physical_devices('GPU'))"
有返回GPU。
2024-10-07 10:47:36.933704539 [E:onnxruntime:Default, provider_bridge_ort.cc:1992 TryGetProviderInfo_CUDA] /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1637 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcudnn.so.9: cannot open shared object file: No such file or directory
conda uninstall onnxruntime\\ conda uninstall onnxruntime-gpu\\ pip uninstall onnxruntime\\ pip uninstall onnxruntime-gpu
,然后conda install --force-reinstall onnxruntime
15.WARNING: No metadata found in /home/user/anaconda3/envs/tf37/lib/python3.7/site-packages
Found existing installation: google-pasta 0.2.0 ERROR: Cannot uninstall google-pasta 0.2.0, RECORD file not found. You might be able to recover from this via: ‘pip install --force-reinstall --no-deps google-pasta==0.2.0’.
尝试手动删除 google-pasta
的残留文件。小心执行以下命令:rm -rf /home/dongli911/anaconda3/envs/tf37/lib/python3.7/site-packages/google_pasta*