1.基本知识
1.1.import 与 from…import
- import 模块:导入一个模块;注:相当于导入的是一个文件夹,是个相对路径。
- from…import:导入了一个模块中的一个函数;注:相当于导入的是一个文件夹中的文件,是个绝对路径。
-
import support #现在可以调用模块里包含的函数了 support.print_func("Runoob")
-
from support import * # 现在可以调用模块里包含的函数了 print_func("Runoob")
1.2.torchvision
torchvision是独立于pytorch的关于图像操作的一些方便工具库。
torchvision的详细介绍在:https://pypi.org/project/torchvision/0.1.8/
torchvision主要包括一下几个包:
-
vision.datasets : 几个常用视觉数据集,可以下载和加载 vision.models : 流行的模型,例如 AlexNet, VGG, and ResNet 以及 与训练好的参数。 vision.transforms : 常用的图像操作,例如:随机切割,旋转等。 vision.utils : 用于把形似 (3 x H x W) 的张量保存到硬盘中, 给一个mini-batch的图像可以产生一个图像格网。
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets,transforms
print("PyTorch Version:",torch.__version__)
1.3.设置随机种子
- 神经网络都需要初始化,那么如何初始化?
怎么保证初始化每次都相同? - 这时候使用同样的随机初始化种子即可保证!!!
1.3.1.为当前GPU设置随机种子
-
torch.cuda.manual_seed(args.seed)
1.3.2.为所有的GPU设置种子
-
torch.cuda.manual_seed_all(args.seed)
1.3.3…为当前CPU设置随机种子
-
torch.manual_seed(args.seed)
1.4.GPU相关配置
1.4.1.检测GPU是否存在?返回值use_cuda为True则表示存在,为False则不存在
-
use_cuda = torch.cuda.is_available()
1.4.2.设置
执行结果:
-
device = torch.device("cuda:0" if use_cuda else "cpu") #use_cuda 为True表示有GPU print("device 类型:",device.type) print("device 序号:",device.index) print(device)
1.4.3.kwargs是GPU设置参数,kwargs = {‘num_workers’:1,‘pin_memory’:True}
- num_workers:使用多进程加载的进程数,0代表不使用多进程
- pin_memory:是否将数据保存在pin memory区,pin memory中的数据转到GPU会快一些
1.5.数据加载函数(数据迭代器)——torch.utils.data.DataLoader
- 在训练模型时使用到此函数,用来把训练数据分成多个batch,
此函数每次抛出一个batch数据,直至把所有的数据都抛出,也就是个数据迭代器。 -
torch.utils.data.DataLoader(dataset, #数据集 batch_size=1, #batch大小,每次抛出1个batch shuffle=False, #是否重新打乱数据 sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, multiprocessing_context=None, generator=None )
1.5.1.torchvision的1个包,vision.datasets
-
datasets.MNIST('./mnist_data', #root:存在MNIST/processed/training.pt和 MNIST/processed/test.pt的数据集的根目录 train = True, #如果true,从training.pt创建数据集,false则从test.pt创建数据集 download=True,#如果ture,从网上自动下载,如果已经存在则不再下载 #transform 接受一个图像,返回变换后的图像的函数,相当于图像先预处理下 #常用的操作如 ToTensor, RandomCrop,Normalize等. #他们可以通过transforms.Compose被组合在一起 transform=transforms.Compose([ #.ToTensor()将shape为(H, W, C)的nump.ndarray或img转为shape为(C, H, W)的tensor transforms.ToTensor(), #.Normalize作用就是.ToTensor将输入归一化到(0,1)后, #再使用公式”(x-mean)/std”,将每个元素分布到(-1,1) transforms.Normalize((0.1307,),(0.3081,)) #0.1307、0.3081是从本数据集计算出来的 ]))
2.CNN模型相关
2.1.卷积层参数设置:torch.nn.Conv2d()
-
#torch.nn.Conv2d(in_channels: int, 输入图像通道数,手写数字图像为1,彩色图像为3 # out_channels: int, 输出通道数,这个等于卷积核的数量 # kernel_size: Union[T, Tuple[T, T]], 卷积核大小 # stride: Union[T, Tuple[T, T]] = 1, 步长 # padding: Union[T, Tuple[T, T]] = 0, 控制zero-padding的数目。 # dilation: Union[T, Tuple[T, T]] = 1, (扩张):控制kernel点(卷积核点)的间距 # groups: int = 1, (卷积核个数):通常来说,卷积个数唯一,但是对某些情况,可以设置范围在1~in_channels中数目的卷积核: # bias: bool = True, :在输出中添加一个可学习的偏差。 # padding_mode: str = 'zeros') 'zeros', 'reflect', 'replicate' or 'circular'. Default: 'zeros'
2.2.池化层参数设置:torch.nn.MaxPool2d()
-
#torch.nn.MaxPool2d(kernel_size: Union[T, Tuple[T, ...]], - max pooling的窗口大小, # stride: Optional[Union[T, Tuple[T, ...]]] = None, - max pooling的窗口移动的步长。默认值是kernel_size # padding: Union[T, Tuple[T, ...]] = 0, - 输入的每一条边补充0的层数 # dilation: Union[T, Tuple[T, ...]] = 1, – 一个控制窗口中元素步幅的参数 # return_indices: bool = False, - 如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助 # ceil_mode: bool = False) - 如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作
3.初始化模型和定义优化函数
- 3.1.优化器中的momentum参数
如果上一次的momentum(即v)与这一次的负梯度方向是相同的,那这次下降的幅度就会加大,
所以这样做能够达到加速收敛的过程。
lr = 0.01
如果上一次的momentum(即v)与这一次的负梯度方向是相同的,那这次下降的幅度就会加大,
所以这样做能够达到加速收敛的过程。
momentum = 0.5
model = Net().to(device)
optimizer = optim.SGD(model.parameters(), lr=lr, momentum=momentum)