这一节课主要讲了pytorch。
百度百科上的说明是
PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。
2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。它是一个基于Python的可续计算包,提供两个高级功能:1、具有强大的GPU加速的张量计算(如NumPy)。2、包含自动求导系统的深度神经网络。
简单来说就是
-
可以调用GPU来加速计算(妈妈再也不用担心GPU只能打游戏了)
-
网络结构随便堆,只要合理,梯度计算不用自己担心
上面是老师上课时的PPT里面的图,整个神经网络的训练部分可以分成三个部分,即 -
Define Function
-
Define Loss Function
-
Define Optimization Function
也就是 -
怎么定义算的方法
-
怎么定义算得好
-
怎么改进算的方法
当模型完成训练之后一般要进行Validation,也就是让模型看自己手里已经有答案的问题,以此来看自己的模型的效果,然后又训练,又看,来个1000次,这就是炼丹过程
当你觉得自己的丹炼得差不多了,可以看一下最后的效果了,就是Testing的过程,其实可以直接把数据分成三个部分,即Trainin data,Validation data与Testing data,在LHY老师的代码里面就是这样写的
Dataset & Dataloader
由于在训练的过程中数据的加入是必不可少的,因此Pytorch中专门为数据设计的东西:Dataset & Dataloader。
Dataset负责配合Dataloader,相当于数据的来源,而Dataloader主要负责了组成Batch,Batch这个东西在训练的过程中比较重要,相当于原来1000个数据要训练1000次,但如果使用size为10的Batch则只需要搞100次了,而在计算Batch的过程中又可以使用GPU的并行计算能力,时间上大大加快。
一般Dataset定义形式如下图所示
class COVID19Dataset(Dataset):
# 在这里进行数据的预处理,比如文件读取,类型转化
def __init__(self, x, y=None):
self.x = torch.FloatTensor(x)
# 在这里进行数据的返回,此时返回的数据就是组成batch的东西了
def __getitem__(self, idx):
return self.x[idx], self.y[idx]
# 在这里返回整个数据的长度
def __len__(self):
return len(self.x)
其实这三个方法都是python的魔法方法
如
class test:
def __init__(self):
print("hello world init function")
def __getitem__(self,idx):
print(f"{idx} item return")
def __len__(self):
return 100
mytest=test()
mytest[1]
len(mytest)
返回
hello world init function
1 item return
100
然后就是主要的Dataloader了
Dataloader在官方文档中介绍如下:
DataLoader(dataset, batch_size=1, 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, *, prefetch_factor=2,
persistent_workers=False)
官方的说明已经比较详细了,主要有几个要注意的地方
- 对于常用的DataLoader来说数据的产生有两个阶段,即产生index,然后用collate_fn组装
- 第一个阶段主要是由shuffle,sampler,batch_sampler,batch_size四个参数指定,一般是使用第一个参数
- 同时batch_sampler默认是由batch_size,shffle,drop_last自动生成的,其基础还是sampler
- drop_last指定是否丢弃最后一个不完整的batch
- pin_memory指定是否使用pined_memory,作用就是加快计算,具体的原理可以参考官方文档
- num_workers和多进程有关,作用也是提速,具体也可以看官方文档(最详细)
关于pytorch Tensor的一些操作
tensor是pytorch中比较常见的数据形式,一般只要你使用pytorch总会和tensor打交道
tensor在百度翻译中是张量的意思,因为在pytorch中进行神经网络的训练的数据都不会只有二维,明显矩阵的维度就不够用了,因此出现张量的概念,张量可以理解为可以扩展维度的矩阵,如下图所示(也是老师ppt里面的东西~~)
对于tensor的操作主要可以分成几个类别:
- 估计维度
a=torch.tensor([1,2,3,4])
print(a.size())
print(a.shape)
print(a.dim())
- 生成
a=torch.tensor([1.0,2,3,4],dtype=torch.int32)
b=torch.Tensor([1,2,3,4])
a=torch.from_numpy(numpy.array([1,2,3,4]))
a=torch.ones(1,2)
a=torch.zeros(1,2)
a=torch.linspace(1,10,10)
在生成里要注意 tensor是可以指定dtype,而Tensor不可以指定,dtype=float32,
- 常用操作(±*/,sum,mean,cat,mask,max,Squeeze,unSqueeze,review,reshape,permute,transpose)
其中要注意的是permute
和view
,transpose
,这三个函数都是进行维度转化,但有一点区别,view比较像是填东西,即会将数据从第一个位置到最后一个位置开始填满开头,无论形状如何,类似于水,而permute和transpose则像是从不同的角度来看一个tensor