pytorch学习官方文档:PyTorch documentation — PyTorch 2.0 documentation
基于b站教程:PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】_哔哩哔哩_bilibili
理论基础:[中英字幕]吴恩达机器学习系列课程_哔哩哔哩_bilibili
目录:
一、PyTorch环境搭建
二、Python中的两大函数
三、Pycharm与Jupyter对比
8.1 (Neural Network)nn.Moudle(搭建神经网络的基本模块)的使用编辑
四、Pytorch加载数据及Dataset类实战
4.1Dataset类
1.Dataset
在大量数据海洋中,提供获取所需要的数据及其label的方式,并完成其编号。
- 功能实现:
(1)获取每个数据及其label
(2)统计数据总量和
- label形式:
(1)文件夹名称 / 图片名称 即label(图片形式)
(2)根据文字信息提供label(文本)
- Dataset的使用(读取图片数据)
目标:从input的图片 ——> 获取label
(1)获取图片地址 ——> 获取图片信息
from PIL import Image
image_path = "D:\\Pycharm\\project\\Test\\dataset\\train\\ants\\0013035.jpg"
img = Image.open(image_path)
图片信息:
(2)将文件夹中含有的图片保存到列表中
dir_path = "Test/dataset/train/ants"
import os
img_path_list = os.listdir(dir_path)
img_path_list[0]
Out[27]: '0013035.jpg'
Dataset实例完整代码:
from torch.utils.data import Dataset
from PIL import Image
# 获取所有图片的地址: os模块 -> 提供了多数操作系统的功能接口函数,用于对文件目录操作
import os
class MyData(Dataset):
# 初始化类,提供全局变量
def __init__(self,root_dir,label_dir):
# self指定类中变量为全局变量
self.root_dir = root_dir
self.label_dir = label_dir
# 拼接地址
self.path = os.path.join(self.root_dir, self.label_dir)
# 图片的地址列表
self.img_path = os.listdir(self.path)
def __getitem__(self, idx):
# 获取每一个图片名
img_name = self.img_path[idx]
# 获取相对路径
img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
img = Image.open(img_item_path)
label = self.label_dir
return img, label
def __len__(self):
return len(self.img_path)
root_dir = "Test/dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)
# 蚂蚁数据集+蜜蜂数据集拼接,用于仿照数据集
train_dataset = ants_dataset + bees_dataset
2.Dataloader
对传输的数据进行打包,提供不同的数据形式。
五、TensorBoard的使用
Tensorboard用于训练模型后展示图像,根据图形分析问题。
5.1 安装TensorBoard
在Terminal或Anaconda输入
pip install tensorboard
打开TensorBoard的事件文件:
tensorboard --logdir=logs # logdir = 事件文件所在的文件夹名,若tensorboard网页无数据,使用文件绝对路径
tensorboard --logdir=logs --port=6007 #指定打开端口名,避免端口相同
5.2 SummaryWriter类
全称:torch.utils.tensorboard.SummaryWriter
`SummaryWriter` 类提供了一个高级 API,用于在给定目录中创建事件文件,并向其中添加摘要和事件。 该类异步更新文件内容。 这允许训练程序调用方法以直接从训练循环将数据添加到文件中,而不会减慢训练速度。
使用方法
def __init__(self, log_dir=None, comment='', purge_step=None, max_queue=10,
flush_secs=120, filename_suffix=''):
(1) log_dir : 用以保存summary的位置
(2)第二个参数是加一些comment
Example:
- 保存在默认文件夹runs...
- 保存在指定文件夹中
- 保存同时设定文件名相应参数
# create a summary writer with automatically generated folder name.
writer = SummaryWriter()
# folder location: runs/May04_22-14-54_s-MacBook-Pro.local/
# create a summary writer using the specified folder name.
writer = SummaryWriter("my_experiment")
# folder location: my_experiment
# create a summary writer with comment appended.
writer = SummaryWriter(comment="LR_0.1_BATCH_16")
# folder location: runs/May04_22-14-54_s-MacBook-Pro.localLR_0.1_BATCH_16/
5.3 add_scalar方法的使用
add_scalar() 用于展示标量,数
导入模块:
from torch.utils.tensorboard import SummaryWriter
通常使用writer作为类名:
writer = SummaryWriter("logs")
调用SumaryWriter()函数,将所需要展示的可视化内容存储到logs文件夹中
例如我们需要展示一个y=x的函数图像,我们可以采用:
for i in range(100):
writer.add_scalar("y=x",i*i,i)
最后加上:writer.close()
tips:
当我们在同一个tag下进行可视化展示时,函数的形状都会出现在同一个表格中。
如果我们想要分开进行展示的话,可以更换一个tag;如果想要删除数据,可以直接删除writer.add.scalar()生成的文件即可(logs文件)
帮助文档:
def add_scalar(self, tag, scalar_value, global_step=None, walltime=None):
"""Add scalar data to summary. #添加标量数据
Args:
tag (string): Data identifier # 图表标题,相同tag即在同一个图中
scalar_value (float or string/blobname): Value to save #保存的数值->图形的y轴
global_step (int): Global step value to record # 训练步数->图形的x轴
walltime (float): Optional override default walltime (time.time())
with seconds after epoch of event
Example:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs")
#y=x
for i in range(100):
writer.add_scalar("y=x*x",i*i,i) #标量 数
writer.close()
运行结果:
5.4 add_image() 方法的使用
def add_image(self, tag, img_tensor, global_step=None, walltime=None, dataformats='CHW'):
"""Add image data to summary.
# 所需定义的参数
Args:
tag (string): Data identifier
img_tensor (torch.Tensor, numpy.array, or string/blobname): Image data
global_step (int): Global step value to record
walltime (float): Optional override default walltime (time.time())
seconds after epoch of event
# 数据尺寸规模,3-->3通道 , H&W-->高和宽
Shape:
img_tensor: Default is :math:`(3, H, W)`. You can use ``torchvision.utils.make_grid()`` to
convert a batch of tensor into 3xHxW format or call ``add_images`` and let us do the job.
Tensor with :math:`(1, H, W)`, :math:`(H, W)`, :math:`(H, W, 3)` is also suitible as long as
corresponding ``dataformats`` argument is passed. e.g. CHW, HWC, HW.
输出img_array规模:( 从PIL到numpy,需要在add_image()中指定shape中每个数字/维表示的含义 --> eg:dataformats='HWC')
义
5.5 利用opencv,将图片类型转为numpy型
from PIL import Image
img = Image.open(image_path)
img_array = np.array(img)
print(type(img_array))
图片已转换为numpy型
六、Transforms的使用
transforms.py 相当于一个工具箱:包含了totensor,resize等图片处理工具
1. transforms的使用:
transforms封装了处理工具,需要时创建具体所需工具,将图片输入,result = tool(input)具体结果
eg:将图片转换为tensor型
2. tensor数据类型:包装了搭建神经网络理论基础所需要的参数(梯度,梯度方法,图片data等)
img:使用python内置方式所读取到的图片,包含所有的图片信息(大小,文件名...)
tensor_img:tensor数据类型,包装了反向神经网络所需要的基础参数(包含反向传播,梯度方法...)
tensor_trans:创建出的所需的工具
6.1 transforms常见使用
1.call函数使用
class Person:
def __call__(self, name):
print("__call__" + " Hello " + name)
def Hello(self, name):
print("hello" + name)
person = Person()
person("zhangsan")
person.Hello("lisi")
可无需掉用函数名,对象名(属性,参数)直接使用(ctr+p提示,函数调用需要添加的参数)
2. totensor使用
3. Normalize
给予均值+标准差=图片维度,transform将每个channels输入的值转换为tensor类型,实现数据的归一化。常用来观察训练结果
output[channel] = (input[channel] - mean[channel]) / std[channel]
4. Compose
transform使用总结:
- 关注输入输出类型
- 注意多看官方文档
- 关注方法需要的参数
- 不清楚返回类型时:print / print(type()) / debug 查询
七、Torchvision中的数据集使用
7.1 CIFAR-10数据集
# 下载CIFAR10数据集,train=T --> 训练集 / train=F -->测试集 download是否下载
train_set = torchvision.datasets.CIFAR10(root="./datasets", train=True, transform=dataset_transform, download=True)
test_set = torchvision.datasets.CIFAR10(root="./datasets", train=False, transform=dataset_transform, download=True)
7.2 DataLoader的使用
(选择从数据集中加载哪些数据)
支持地图样式和可迭代样式的数据集,包括单进程或多进程加载,定制加载顺序和可选的自动批处理(排序规则)和内存固定
参数如下:
dataloader将所有加载的img和target数据的分别
打包返回
输出数据:
torch.Size([3,32,32])表述3通道的图片,大小为32*32
八、 神经网络搭建的基本骨架(torch.nn的使用)
PyTorch torch.nn官方学习文档: torch.nn — PyTorch 1.13 documentation
8.1 (Neural Network)nn.Moudle(搭建神经网络的基本模块)的使用
搭建神经网络模板:
import torch.nn as nn # nn module的引入
import torch.nn.functional as F
class Model(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 20, 5)
def forward(self, x):
x = F.relu(self.conv1(x))
return F.relu(self.conv2(x))
8.2 卷积层操作
卷积层:
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
当未表明卷积的规模时需要使用以下公式计算相关数据(N,C,H,W):
8.3 最大池化(下采样)层的使用
作用:选定数据的特征,筛去其他部分,减少处理的数据量,和训练量。
ceil_mode (bool) – when True, will use ceil instead of floor to compute the output shape
是否保留ceil数(向上取值):
ceil_mode=True --> 继续保留最大值
ceil_mode=Flase --> 不保留最大值(池化时,区域<池化核,不保留max,如下图所示)
8.4 非线性激活函数
对于非线性函数ReLU中参数inplase:
8.5 线性层&其他层
对于线性层
flatten函数,将数据规模进行展开(多维展开为一维):
input = torch.randn(32, 1, 5, 5)
# With default parameters
m = nn.Flatten()
output = m(input)
output.size()
# With non-default parameters
m = nn.Flatten(0, 2)
output = m(input)
output.size()
8.6 Sequential的使用
直接写入卷积,池化的操作,使代码更简洁
# 神经网络
class Test(nn.Module):
def __init__(self):
super(Test, self).__init__()
# # 需要按公式计算padding大小
# # 进行一次卷积
# self.conv1 = Conv2d(3, 32, 5, padding=2)
# # 一次池化
# self.maxpool1 = MaxPool2d(2)
# self.conv2 = Conv2d(32, 32, 5, padding=2)
# self.maxpool2 = MaxPool2d(2)
# self.conv3 = Conv2d(32, 64, 5, padding=2)
# self.maxpool3 = MaxPool2d(2)
# # 展开
# self.flatten = Flatten()
# # 分为2个线性层
# self.linear1 = Linear(1024, 64)
# self.linear2 = Linear(64, 10)
# 使用Sequential的便捷,简洁代码
self.module1 = Sequential(
Conv2d(3, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Linear(1024, 64),
Linear(64, 10)
)
def forward(self, x):
# x = self.conv1(x)
# x = self.maxpool1(x)
# x = self.conv2(x)
# x = self.maxpool2(x)
# x = self.conv3(x)
# x = self.maxpool3(x)
# x = self.flatten(x)
# x = self.linear1(x)
# x = self.linear2(x)
x = self.module1(x)
return x
生成自定义的神经网络:
=>
=>
8.7 损失函数与反向传播
Loss损失函数 /
MSELoss均方差函数 /
CrossEntropyLoss交叉熵
交叉熵 = log(softmax)
softmax的作用简单说就计算一组数值中每个值的占比,公式一般性描述如下
设一共有个用数值表示的分类(每个分类相互独立),其中表示分类的个数。那么softmax计算公式为:
//关于交叉熵的内容补充:交叉熵损失函数(Cross Entropy Loss)_SongGu1996的博客-CSDN博客
九、优化器
torch.optim是一个实现各种优化算法的包。大多数常用的方法已经得到支持,而且接口足够通用,因此将来可以轻松地集成更复杂的方法。
Example:
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# optim.SGD——>优化器算法(模型参数,学习率,特殊参数)
optimizer = optim.Adam([var1, var2], lr=0.0001)
十、现有网络模型的使用
十一、GPU训练+完整模型验证
完整模型验证(测试,demo):利用训练好的模型,然后提供输入——>模型应用