Pytorch基础学习

pytorch学习官方文档:PyTorch documentation — PyTorch 2.0 documentation

基于b站教程:PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】_哔哩哔哩_bilibili

理论基础:[中英字幕]吴恩达机器学习系列课程_哔哩哔哩_bilibili

目录:

一、PyTorch环境搭建

二、Python中的两大函数

三、Pycharm与Jupyter对比

四、Pytorch加载数据及Dataset类实战

4.1Dataset类

五、TensorBoard的使用

5.1  安装TensorBoard

5.2  SummaryWriter类

5.3  add_scalar方法的使用

5.4  add_image() 方法的使用 

5.5 利用opencv,将图片类型转为numpy型

六、Transforms的使用

        6.1 transforms常见使用

七、Torchvision中的数据集使用

7.1 CIFAR-10数据集

7.2  DataLoader的使用

八、 神经网络搭建的基本骨架(torch.nn的使用)

 8.1 (Neural Network)nn.Moudle(搭建神经网络的基本模块)的使用​编辑

 8.2 卷积层操作

 8.3 最大池化(下采样)层的使用

 8.4 非线性激活函数

 8.5 线性层&其他层

 8.6 Sequential的使用

 8.7  损失函数与反向传播

九、优化器

十、现有网络模型的使用

十一、GPU训练+完整模型验证


四、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:

  1. 保存在默认文件夹runs...
  2. 保存在指定文件夹中
  3. 保存同时设定文件名相应参数 
# 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使用总结:

  1. 关注输入输出类型
  2. 注意多看官方文档
  3. 关注方法需要的参数
  4. 不清楚返回类型时: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_channelsout_channelskernel_sizestride=1padding=0dilation=1groups=1bias=Truepadding_mode='zeros'device=Nonedtype=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):利用训练好的模型,然后提供输入——>模型应用

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值